Index: third_party/WebKit/Source/platform/heap/PersistentNode.h |
diff --git a/third_party/WebKit/Source/platform/heap/PersistentNode.h b/third_party/WebKit/Source/platform/heap/PersistentNode.h |
index ebaf0604edc31cd3090c6accc3988d1193c62ec1..41d9c1941fba17863f62749ac8d229597a70373a 100644 |
--- a/third_party/WebKit/Source/platform/heap/PersistentNode.h |
+++ b/third_party/WebKit/Source/platform/heap/PersistentNode.h |
@@ -180,15 +180,44 @@ public: |
m_persistentRegion->freePersistentNode(persistentNode); |
} |
+ class LockScope final { |
+ STACK_ALLOCATED(); |
+ public: |
+ LockScope(CrossThreadPersistentRegion& persistentRegion) |
+ : m_persistentRegion(persistentRegion) |
+ { |
+ m_persistentRegion.lock(); |
+ } |
+ ~LockScope() |
+ { |
+ m_persistentRegion.unlock(); |
+ } |
+ private: |
+ CrossThreadPersistentRegion& m_persistentRegion; |
+ }; |
+ |
void tracePersistentNodes(Visitor* visitor) |
{ |
- MutexLocker lock(m_mutex); |
+ // If this assert triggers, you're tracing without being in a LockScope. |
+ ASSERT(m_mutex.locked()); |
m_persistentRegion->tracePersistentNodes(visitor); |
} |
void prepareForThreadStateTermination(ThreadState*); |
private: |
+ friend class LockScope; |
+ |
+ void lock() |
+ { |
+ m_mutex.lock(); |
+ } |
+ |
+ void unlock() |
+ { |
+ m_mutex.unlock(); |
+ } |
+ |
// We don't make CrossThreadPersistentRegion inherit from PersistentRegion |
// because we don't want to virtualize performance-sensitive methods |
// such as PersistentRegion::allocate/freePersistentNode. |