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 |