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
--- 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: