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));
});