Changeset 81999 in webkit


Ignore:
Timestamp:
Mar 25, 2011 4:01:00 PM (13 years ago)
Author:
kinuko@chromium.org
Message:

2011-03-25 Kinuko Yasuda <kinuko@chromium.org>

Reviewed by David Levin.

Data race between ~WorkerFileSystemCallbacksBridge and runTasksOnWorkerThread
https://bugs.webkit.org/show_bug.cgi?id=56138
Stopped passing the WorkerFileSystemCallbacksBridge's reference to
MainThreadFileSystemCallbacks so that in most cases (in normal cases)
its reference is only maintained by WorkerThread.

  • src/WorkerFileSystemCallbacksBridge.cpp: (WebKit::MainThreadFileSystemCallbacks::createLeakedPtr): (WebKit::MainThreadFileSystemCallbacks::MainThreadFileSystemCallbacks): (WebKit::WorkerFileSystemCallbacksBridge::mayPostTaskToWorker):
  • src/WorkerFileSystemCallbacksBridge.h:
Location:
trunk/Source/WebKit/chromium
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/chromium/ChangeLog

    r81987 r81999  
     12011-03-25  Kinuko Yasuda  <kinuko@chromium.org>
     2
     3        Reviewed by David Levin.
     4
     5        Data race between ~WorkerFileSystemCallbacksBridge and runTasksOnWorkerThread
     6        https://bugs.webkit.org/show_bug.cgi?id=56138
     7        Stopped passing the WorkerFileSystemCallbacksBridge's reference to
     8        MainThreadFileSystemCallbacks so that in most cases (in normal cases)
     9        its reference is only maintained by WorkerThread.
     10
     11        * src/WorkerFileSystemCallbacksBridge.cpp:
     12        (WebKit::MainThreadFileSystemCallbacks::createLeakedPtr):
     13        (WebKit::MainThreadFileSystemCallbacks::MainThreadFileSystemCallbacks):
     14        (WebKit::WorkerFileSystemCallbacksBridge::mayPostTaskToWorker):
     15        * src/WorkerFileSystemCallbacksBridge.h:
     16
    1172011-03-24  John Abd-El-Malek  <jam@chromium.org>
    218
  • trunk/Source/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.cpp

    r81640 r81999  
    8787public:
    8888    // Callbacks are self-destructed and we always return leaked pointer here.
    89     static MainThreadFileSystemCallbacks* createLeakedPtr(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode)
     89    static MainThreadFileSystemCallbacks* createLeakedPtr(WorkerFileSystemCallbacksBridge* bridge, const String& mode)
    9090    {
    9191        OwnPtr<MainThreadFileSystemCallbacks> callbacks = adoptPtr(new MainThreadFileSystemCallbacks(bridge, mode));
     
    128128
    129129private:
    130     MainThreadFileSystemCallbacks(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode)
     130    MainThreadFileSystemCallbacks(WorkerFileSystemCallbacksBridge* bridge, const String& mode)
    131131        : m_bridge(bridge)
    132132        , m_mode(mode)
    133133    {
    134         ASSERT(m_bridge.get());
     134        ASSERT(m_bridge);
    135135    }
    136136
    137137    friend class WorkerFileSystemCallbacksBridge;
    138     RefPtr<WorkerFileSystemCallbacksBridge> m_bridge;
     138    // The bridge pointer is kept by the bridge itself on the WorkerThread.
     139    WorkerFileSystemCallbacksBridge* m_bridge;
    139140    const String m_mode;
    140141};
     
    382383{
    383384    ASSERT(isMainThread());
    384     { // Let go of the mutex before possibly deleting this due to m_selfRef.clear().
    385         MutexLocker locker(m_mutex);
    386         if (m_worker)
    387             m_worker->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, m_selfRef, task), mode);
    388     }
    389     m_selfRef.clear();
     385    MutexLocker locker(m_mutex);
     386    if (m_worker)
     387        m_worker->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, m_selfRef.release(), task), mode);
    390388}
    391389
  • trunk/Source/WebKit/chromium/src/WorkerFileSystemCallbacksBridge.h

    r81640 r81999  
    139139    void mayPostTaskToWorker(PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const String& mode);
    140140
    141     // m_selfRef keeps a reference to itself until a task is created for the worker thread (at which point the task holds the reference).
     141    // m_selfRef keeps a reference to itself while there's a pending callback on the main thread.
    142142    RefPtr<WorkerFileSystemCallbacksBridge> m_selfRef;
    143143
Note: See TracChangeset for help on using the changeset viewer.