Commit af6685e8 authored by kinuko@chromium.org's avatar kinuko@chromium.org

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:


git-svn-id: svn://svn.chromium.org/blink/trunk@81999 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 1163b1fc
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:
2011-03-24 John Abd-El-Malek <jam@chromium.org> 2011-03-24 John Abd-El-Malek <jam@chromium.org>
Reviewed by Dimitri Glazkov. Reviewed by Dimitri Glazkov.
......
...@@ -86,7 +86,7 @@ namespace WebKit { ...@@ -86,7 +86,7 @@ namespace WebKit {
class MainThreadFileSystemCallbacks : public WebFileSystemCallbacks { class MainThreadFileSystemCallbacks : public WebFileSystemCallbacks {
public: public:
// Callbacks are self-destructed and we always return leaked pointer here. // Callbacks are self-destructed and we always return leaked pointer here.
static MainThreadFileSystemCallbacks* createLeakedPtr(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode) static MainThreadFileSystemCallbacks* createLeakedPtr(WorkerFileSystemCallbacksBridge* bridge, const String& mode)
{ {
OwnPtr<MainThreadFileSystemCallbacks> callbacks = adoptPtr(new MainThreadFileSystemCallbacks(bridge, mode)); OwnPtr<MainThreadFileSystemCallbacks> callbacks = adoptPtr(new MainThreadFileSystemCallbacks(bridge, mode));
return callbacks.leakPtr(); return callbacks.leakPtr();
...@@ -127,15 +127,16 @@ public: ...@@ -127,15 +127,16 @@ public:
} }
private: private:
MainThreadFileSystemCallbacks(PassRefPtr<WorkerFileSystemCallbacksBridge> bridge, const String& mode) MainThreadFileSystemCallbacks(WorkerFileSystemCallbacksBridge* bridge, const String& mode)
: m_bridge(bridge) : m_bridge(bridge)
, m_mode(mode) , m_mode(mode)
{ {
ASSERT(m_bridge.get()); ASSERT(m_bridge);
} }
friend class WorkerFileSystemCallbacksBridge; friend class WorkerFileSystemCallbacksBridge;
RefPtr<WorkerFileSystemCallbacksBridge> m_bridge; // The bridge pointer is kept by the bridge itself on the WorkerThread.
WorkerFileSystemCallbacksBridge* m_bridge;
const String m_mode; const String m_mode;
}; };
...@@ -381,12 +382,9 @@ void WorkerFileSystemCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<WebCor ...@@ -381,12 +382,9 @@ void WorkerFileSystemCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<WebCor
void WorkerFileSystemCallbacksBridge::mayPostTaskToWorker(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode) void WorkerFileSystemCallbacksBridge::mayPostTaskToWorker(PassOwnPtr<ScriptExecutionContext::Task> task, const String& mode)
{ {
ASSERT(isMainThread()); ASSERT(isMainThread());
{ // Let go of the mutex before possibly deleting this due to m_selfRef.clear(). MutexLocker locker(m_mutex);
MutexLocker locker(m_mutex); if (m_worker)
if (m_worker) m_worker->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, m_selfRef.release(), task), mode);
m_worker->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, m_selfRef, task), mode);
}
m_selfRef.clear();
} }
} // namespace WebCore } // namespace WebCore
......
...@@ -138,7 +138,7 @@ private: ...@@ -138,7 +138,7 @@ private:
void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>); void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
void mayPostTaskToWorker(PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const String& mode); void mayPostTaskToWorker(PassOwnPtr<WebCore::ScriptExecutionContext::Task>, const String& mode);
// m_selfRef keeps a reference to itself until a task is created for the worker thread (at which point the task holds the reference). // m_selfRef keeps a reference to itself while there's a pending callback on the main thread.
RefPtr<WorkerFileSystemCallbacksBridge> m_selfRef; RefPtr<WorkerFileSystemCallbacksBridge> m_selfRef;
Mutex m_mutex; Mutex m_mutex;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment