| Index: native_client_sdk/src/tests/nacl_io_test/fake_resource_manager.cc
|
| diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_resource_manager.cc b/native_client_sdk/src/tests/nacl_io_test/fake_resource_manager.cc
|
| index b87248fcc6a101a10fa4427b351b3ae480d83575..ccb2993f82e2cb1b0a28593e3297243db5a70a20 100644
|
| --- a/native_client_sdk/src/tests/nacl_io_test/fake_resource_manager.cc
|
| +++ b/native_client_sdk/src/tests/nacl_io_test/fake_resource_manager.cc
|
| @@ -57,7 +57,7 @@ void FakeResourceManager::AddRef(PP_Resource handle) {
|
| }
|
|
|
| void FakeResourceManager::Release(PP_Resource handle) {
|
| - AUTO_LOCK(lock_);
|
| + sdk_util::AutoLock lock(lock_);
|
| ResourceMap::iterator iter = resource_map_.find(handle);
|
| ASSERT_NE(resource_map_.end(), iter) << "Releasing unknown resource "
|
| << handle;
|
| @@ -70,6 +70,18 @@ void FakeResourceManager::Release(PP_Resource handle) {
|
| << resource_tracker->file() << ":"
|
| << resource_tracker->line();
|
| resource_tracker->Release();
|
| + // It's OK to access the tracker when its refcount is zero; it doesn't
|
| + // actually destroy the object until the manager is destroyed.
|
| + if (resource_tracker->ref_count() == 0) {
|
| + // Remove the resource from this tracker.
|
| + FakeResource* resource = resource_tracker->Pass();
|
| + // Release the lock before we call Destroy; resources can call
|
| + // FakeResourceManager::Release(), which will deadlock if we are already
|
| + // holding the lock.
|
| + lock.Unlock();
|
| +
|
| + resource->Destroy();
|
| + }
|
| }
|
|
|
| FakeResourceTracker* FakeResourceManager::Get(PP_Resource handle) {
|
|
|