Chromium Code Reviews| Index: native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc |
| diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc b/native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..45b54ba6ff0d9a47ffb3b650955645866393e447 |
| --- /dev/null |
| +++ b/native_client_sdk/src/tests/nacl_io_test/fake_var_manager.cc |
| @@ -0,0 +1,114 @@ |
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "fake_var_manager.h" |
| + |
| +#include "gtest/gtest.h" |
| + |
| +FakeVarManager::FakeVarManager() : debug(false), next_id_(1) {} |
| + |
| +FakeVarManager::~FakeVarManager() { |
| + // The ref counts for all vars should be zero. |
| + for (VarMap::const_iterator iter = var_map_.begin(); iter != var_map_.end(); |
| + ++iter) { |
| + const FakeVarData& var_data = iter->second; |
| + EXPECT_EQ(0, var_data.ref_count) << "Non-zero refcount on " |
| + << Describe(var_data); |
| + } |
| +} |
| + |
| +FakeVarData* FakeVarManager::CreateVarData() { |
| + Id id = next_id_++; |
| + FakeVarData data; |
| + data.id = id; |
| + data.ref_count = 1; |
| + var_map_[id] = data; |
| + return &var_map_[id]; |
| +} |
| + |
| +void FakeVarManager::AddRef(PP_Var var) { |
| + // From ppb_var.h: |
| + // AddRef() adds a reference to the given var. If this is not a refcounted |
| + // object, this function will do nothing so you can always call it no matter |
| + // what the type. |
| + |
| + FakeVarData* var_data = GetVarData(var); |
| + if (!var_data) |
| + return; |
| + |
| + EXPECT_GT(var_data->ref_count, 0) |
| + << "AddRefing freed " << Describe(*var_data); |
| + var_data->ref_count++; |
| + if (debug) |
| + printf("AddRef of %s [new refcount=%d]\n", |
| + Describe(*var_data).c_str(), |
| + var_data->ref_count); |
| +} |
| + |
| +std::string FakeVarManager::Describe(const FakeVarData& var_data) { |
| + std::stringstream rtn; |
| + switch (var_data.type) { |
| + case PP_VARTYPE_STRING: |
| + rtn << "string resource " << var_data.id << |
| + " with value \"" << var_data.string_value << "\""; |
| + break; |
| + case PP_VARTYPE_ARRAY: |
| + rtn << "array resource with id " << var_data.id; |
| + break; |
| + default: |
|
binji
2014/01/17 01:31:14
array buffer?
Sam Clegg
2014/01/17 22:40:11
Done.
|
| + rtn << "resource " << var_data.id << " of type " << var_data.type; |
| + break; |
| + } |
| + return rtn.str(); |
| +} |
| + |
| +void FakeVarManager::Destroy(PP_Var var) { |
| + // Release each PP_Var in the array |
| + switch (var.type) { |
| + case PP_VARTYPE_ARRAY: { |
| + std::vector<PP_Var>& vector = GetVarData(var)->array_value; |
|
binji
2014/01/17 01:31:14
NULL check?
|
| + for (std::vector<PP_Var>::iterator it = vector.begin(); |
| + it != vector.end(); ++it) { |
| + Release(*it); |
| + } |
| + vector.clear(); |
| + break; |
| + } |
| + default: |
| + break; |
| + } |
| +} |
| + |
| +FakeVarData* FakeVarManager::GetVarData(PP_Var var) { |
| + VarMap::iterator iter = var_map_.find(var.value.as_id); |
| + if (iter == var_map_.end()) |
| + return NULL; |
| + return &iter->second; |
| +} |
| + |
| +void FakeVarManager::Release(PP_Var var) { |
| + // From ppb_var.h: |
| + // Release() removes a reference to given var, deleting it if the internal |
| + // reference count becomes 0. If the given var is not a refcounted object, |
| + // this function will do nothing so you can always call it no matter what |
| + // the type. |
| + FakeVarData* var_data = GetVarData(var); |
| + if (!var_data) { |
| + if (debug) |
| + printf("Releasing simple var\n"); |
| + return; |
| + } |
| + |
| + EXPECT_GT(var_data->ref_count, 0) |
| + << "Releasing freed " << Describe(*var_data); |
| + |
| + var_data->ref_count--; |
| + if (debug) |
| + printf("Released %s [new refcount=%d]\n", |
| + Describe(*var_data).c_str(), |
| + var_data->ref_count); |
| + |
| + if (var_data->ref_count == 0) |
| + Destroy(var); |
|
binji
2014/01/17 01:31:14
erase item in var_map_
Sam Clegg
2014/01/17 22:40:11
I was thinking of leaving the var_map alone until
binji
2014/01/17 22:59:17
OK, sounds good. Maybe add a comment for that?
|
| +} |