Bug 1356103 - Part 1: Add WeakPtrTraits to allow SupportsWeakPtr classes to opt in to more permissive thread ownership assertions. r=bholley draft
authorCameron McCormack <cam@mcc.id.au>
Sun, 30 Apr 2017 12:14:06 +0800
changeset 572426 a230d595736d0e7c3f68c3a424fd9dc4ef74f384
parent 572425 4a6a71f4aa22e4dc3961884ce505ce34bdd799a2
child 572427 ec12098f89788478de5327d40345d2733747ac48
push id57070
push userbmo:cam@mcc.id.au
push dateThu, 04 May 2017 06:37:07 +0000
reviewersbholley
bugs1356103
milestone55.0a1
Bug 1356103 - Part 1: Add WeakPtrTraits to allow SupportsWeakPtr classes to opt in to more permissive thread ownership assertions. r=bholley MozReview-Commit-ID: 62pJc2N8aIo
mfbt/WeakPtr.h
--- a/mfbt/WeakPtr.h
+++ b/mfbt/WeakPtr.h
@@ -107,18 +107,21 @@
   std::thread::id _owningThread; \
   bool _empty; // If it was initialized as a placeholder with mPtr = nullptr.
 #define MOZ_WEAKPTR_INIT_THREAD_SAFETY_CHECK() \
   do { \
     _owningThread = std::this_thread::get_id(); \
     _empty = !p; \
   } while (false)
 #define MOZ_WEAKPTR_ASSERT_THREAD_SAFETY() \
-  MOZ_DIAGNOSTIC_ASSERT(_empty || _owningThread == std::this_thread::get_id(), \
-                        "WeakPtr used on multiple threads")
+  do { \
+    if (!(_empty || _owningThread == std::this_thread::get_id())) { \
+      WeakPtrTraits<T>::AssertSafeToAccessFromNonOwningThread(); \
+    } \
+  } while (false)
 #define MOZ_WEAKPTR_ASSERT_THREAD_SAFETY_DELEGATED(that) \
   (that)->AssertThreadSafety();
 
 #define MOZ_WEAKPTR_THREAD_SAFETY_CHECKING 1
 
 #else
 
 #define MOZ_WEAKPTR_DECLARE_THREAD_SAFETY_CHECK
@@ -135,16 +138,25 @@ template <typename T> class SupportsWeak
 
 #ifdef MOZ_REFCOUNTED_LEAK_CHECKING
 #define MOZ_DECLARE_WEAKREFERENCE_TYPENAME(T) \
   static const char* weakReferenceTypeName() { return "WeakReference<" #T ">"; }
 #else
 #define MOZ_DECLARE_WEAKREFERENCE_TYPENAME(T)
 #endif
 
+template<class T>
+struct WeakPtrTraits
+{
+  static void AssertSafeToAccessFromNonOwningThread()
+  {
+    MOZ_DIAGNOSTIC_ASSERT(false, "WeakPtr accessed from multiple threads");
+  }
+};
+
 namespace detail {
 
 // This can live beyond the lifetime of the class derived from
 // SupportsWeakPtr.
 template<class T>
 class WeakReference : public ::mozilla::RefCounted<WeakReference<T> >
 {
 public: