⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 242732 in webkit


Ignore:
Timestamp:
Mar 11, 2019, 1:06:55 PM (7 years ago)
Author:
sihui_liu@apple.com
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):

Location:
trunk/Source/WTF
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r242714 r242732  
     12019-03-11  Sihui Liu  <sihui_liu@apple.com>
     2
     3        Crash under WebCore::IDBDatabase::connectionToServerLost
     4        https://bugs.webkit.org/show_bug.cgi?id=195563
     5        <rdar://problem/37193655>
     6
     7        CrossThreadTask should protect callee if it is ThreadSafeRefCounted.
     8
     9        Reviewed by Geoffrey Garen.
     10
     11        * wtf/CrossThreadTask.h:
     12        (WTF::createCrossThreadTask):
     13
    1142019-03-11  Ryan Haddad  <ryanhaddad@apple.com>
    215
  • trunk/Source/WTF/wtf/CrossThreadTask.h

    r221414 r242732  
    2828#include <wtf/CrossThreadCopier.h>
    2929#include <wtf/Function.h>
     30#include <wtf/RefPtr.h>
    3031#include <wtf/StdLibExtras.h>
     32#include <wtf/ThreadSafeRefCounted.h>
    3133
    3234namespace WTF {
     
    8385}
    8486
    85 template<typename T, typename... Parameters, typename... Arguments>
     87template<typename T, typename std::enable_if<std::is_base_of<ThreadSafeRefCounted<T>, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
     88CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments)
     89{
     90    return CrossThreadTask([callee = makeRefPtr(&callee), method, arguments = std::make_tuple(crossThreadCopy<Arguments>(arguments)...)]() mutable {
     91        callMemberFunctionForCrossThreadTask(callee.get(), method, WTFMove(arguments));
     92    });
     93}
     94
     95template<typename T, typename std::enable_if<!std::is_base_of<ThreadSafeRefCounted<T>, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
    8696CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments)
    8797{
Note: See TracChangeset for help on using the changeset viewer.