Crash under WebCore::IDBDatabase::connectionToServerLost
authorsihui_liu@apple.com <sihui_liu@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Mar 2019 20:06:55 +0000 (20:06 +0000)
committersihui_liu@apple.com <sihui_liu@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Mar 2019 20:06:55 +0000 (20:06 +0000)
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):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242732 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/CrossThreadTask.h

index 2174d3e..6466cba 100644 (file)
@@ -1,3 +1,16 @@
+2019-03-11  Sihui Liu  <sihui_liu@apple.com>
+
+        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  <ryanhaddad@apple.com>
 
         Unreviewed, rolling out r242688, r242643, r242624.
index 57b7179..ec43774 100644 (file)
@@ -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,7 +84,15 @@ void callMemberFunctionForCrossThreadTask(C* object, MF function, ArgsTuple&& ar
     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 {