| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "fake_resource_manager.h" | 5 #include "fake_resource_manager.h" |
| 6 #include "gtest/gtest.h" | 6 #include "gtest/gtest.h" |
| 7 #include "sdk_util/auto_lock.h" | 7 #include "sdk_util/auto_lock.h" |
| 8 | 8 |
| 9 FakeResourceManager::FakeResourceManager() : next_handle_(1) {} | 9 FakeResourceManager::FakeResourceManager() : next_handle_(1) {} |
| 10 | 10 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 EXPECT_LT(0, resource_tracker->ref_count()) << "AddRefing freed resource " | 50 EXPECT_LT(0, resource_tracker->ref_count()) << "AddRefing freed resource " |
| 51 << resource_tracker->classname() | 51 << resource_tracker->classname() |
| 52 << "(" << handle | 52 << "(" << handle |
| 53 << "), created at " | 53 << "), created at " |
| 54 << resource_tracker->file() << ":" | 54 << resource_tracker->file() << ":" |
| 55 << resource_tracker->line(); | 55 << resource_tracker->line(); |
| 56 resource_tracker->AddRef(); | 56 resource_tracker->AddRef(); |
| 57 } | 57 } |
| 58 | 58 |
| 59 void FakeResourceManager::Release(PP_Resource handle) { | 59 void FakeResourceManager::Release(PP_Resource handle) { |
| 60 AUTO_LOCK(lock_); | 60 sdk_util::AutoLock lock(lock_); |
| 61 ResourceMap::iterator iter = resource_map_.find(handle); | 61 ResourceMap::iterator iter = resource_map_.find(handle); |
| 62 ASSERT_NE(resource_map_.end(), iter) << "Releasing unknown resource " | 62 ASSERT_NE(resource_map_.end(), iter) << "Releasing unknown resource " |
| 63 << handle; | 63 << handle; |
| 64 | 64 |
| 65 FakeResourceTracker* resource_tracker = iter->second; | 65 FakeResourceTracker* resource_tracker = iter->second; |
| 66 EXPECT_LT(0, resource_tracker->ref_count()) << "Releasing freed resource " | 66 EXPECT_LT(0, resource_tracker->ref_count()) << "Releasing freed resource " |
| 67 << resource_tracker->classname() | 67 << resource_tracker->classname() |
| 68 << "(" << handle | 68 << "(" << handle |
| 69 << "), created at " | 69 << "), created at " |
| 70 << resource_tracker->file() << ":" | 70 << resource_tracker->file() << ":" |
| 71 << resource_tracker->line(); | 71 << resource_tracker->line(); |
| 72 resource_tracker->Release(); | 72 resource_tracker->Release(); |
| 73 // It's OK to access the tracker when its refcount is zero; it doesn't |
| 74 // actually destroy the object until the manager is destroyed. |
| 75 if (resource_tracker->ref_count() == 0) { |
| 76 // Remove the resource from this tracker. |
| 77 FakeResource* resource = resource_tracker->Pass(); |
| 78 // Release the lock before we call Destroy; resources can call |
| 79 // FakeResourceManager::Release(), which will deadlock if we are already |
| 80 // holding the lock. |
| 81 lock.Unlock(); |
| 82 |
| 83 resource->Destroy(); |
| 84 } |
| 73 } | 85 } |
| 74 | 86 |
| 75 FakeResourceTracker* FakeResourceManager::Get(PP_Resource handle) { | 87 FakeResourceTracker* FakeResourceManager::Get(PP_Resource handle) { |
| 76 AUTO_LOCK(lock_); | 88 AUTO_LOCK(lock_); |
| 77 ResourceMap::iterator iter = resource_map_.find(handle); | 89 ResourceMap::iterator iter = resource_map_.find(handle); |
| 78 if (iter == resource_map_.end()) { | 90 if (iter == resource_map_.end()) { |
| 79 // Can't use FAIL() because it tries to return void. | 91 // Can't use FAIL() because it tries to return void. |
| 80 EXPECT_TRUE(false) << "Trying to get resource " << handle | 92 EXPECT_TRUE(false) << "Trying to get resource " << handle |
| 81 << " that doesn't exist!"; | 93 << " that doesn't exist!"; |
| 82 return NULL; | 94 return NULL; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 108 bool FakeResourceTracker::CheckType(const char* other_classname) const { | 120 bool FakeResourceTracker::CheckType(const char* other_classname) const { |
| 109 if (strcmp(other_classname, classname_) != 0) { | 121 if (strcmp(other_classname, classname_) != 0) { |
| 110 // Repeat the expectation, just to print out a nice error message before we | 122 // Repeat the expectation, just to print out a nice error message before we |
| 111 // crash. :) | 123 // crash. :) |
| 112 EXPECT_STREQ(classname_, other_classname); | 124 EXPECT_STREQ(classname_, other_classname); |
| 113 return false; | 125 return false; |
| 114 } | 126 } |
| 115 | 127 |
| 116 return true; | 128 return true; |
| 117 } | 129 } |
| OLD | NEW |