Title: [242732] trunk/Source/WTF
Revision
242732
Author
[email protected]
Date
2019-03-11 13:06:55 -0700 (Mon, 11 Mar 2019)

Log Message

Crash under WebCore::IDBDatabase::connectionToServerLost
https://bugs.webkit.org/show_bug.cgi?id=195563
<rdar://problem/37193655>

CrossThreadTask should protect callee if it is ThreadSafeRefCounted.

Reviewed by Geoffrey Garen.

* wtf/CrossThreadTask.h:
(WTF::createCrossThreadTask):

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (242731 => 242732)


--- trunk/Source/WTF/ChangeLog	2019-03-11 20:05:07 UTC (rev 242731)
+++ trunk/Source/WTF/ChangeLog	2019-03-11 20:06:55 UTC (rev 242732)
@@ -1,3 +1,16 @@
+2019-03-11  Sihui Liu  <[email protected]>
+
+        Crash under WebCore::IDBDatabase::connectionToServerLost
+        https://bugs.webkit.org/show_bug.cgi?id=195563
+        <rdar://problem/37193655>
+
+        CrossThreadTask should protect callee if it is ThreadSafeRefCounted.
+
+        Reviewed by Geoffrey Garen.
+
+        * wtf/CrossThreadTask.h:
+        (WTF::createCrossThreadTask):
+
 2019-03-11  Ryan Haddad  <[email protected]>
 
         Unreviewed, rolling out r242688, r242643, r242624.

Modified: trunk/Source/WTF/wtf/CrossThreadTask.h (242731 => 242732)


--- trunk/Source/WTF/wtf/CrossThreadTask.h	2019-03-11 20:05:07 UTC (rev 242731)
+++ trunk/Source/WTF/wtf/CrossThreadTask.h	2019-03-11 20:06:55 UTC (rev 242732)
@@ -27,7 +27,9 @@
 
 #include <wtf/CrossThreadCopier.h>
 #include <wtf/Function.h>
+#include <wtf/RefPtr.h>
 #include <wtf/StdLibExtras.h>
+#include <wtf/ThreadSafeRefCounted.h>
 
 namespace WTF {
 
@@ -82,9 +84,17 @@
     callMemberFunctionForCrossThreadTaskImpl(object, function, std::forward<ArgsTuple>(args), ArgsIndicies());
 }
 
-template<typename T, typename... Parameters, typename... Arguments>
+template<typename T, typename std::enable_if<std::is_base_of<ThreadSafeRefCounted<T>, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
 CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments)
 {
+    return CrossThreadTask([callee = makeRefPtr(&callee), method, arguments = std::make_tuple(crossThreadCopy<Arguments>(arguments)...)]() mutable {
+        callMemberFunctionForCrossThreadTask(callee.get(), method, WTFMove(arguments));
+    });
+}
+
+template<typename T, typename std::enable_if<!std::is_base_of<ThreadSafeRefCounted<T>, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
+CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments)
+{
     return CrossThreadTask([callee = &callee, method, arguments = std::make_tuple(crossThreadCopy<Arguments>(arguments)...)]() mutable {
         callMemberFunctionForCrossThreadTask(callee, method, WTFMove(arguments));
     });
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to