Index: Source/core/inspector/WorkerDebuggerAgent.cpp |
diff --git a/Source/core/inspector/WorkerDebuggerAgent.cpp b/Source/core/inspector/WorkerDebuggerAgent.cpp |
index 52d2b4d4f5c01e4badba956ba1125f152e94843d..f7ea601bb728527319d3b81070c10129d3822691 100644 |
--- a/Source/core/inspector/WorkerDebuggerAgent.cpp |
+++ b/Source/core/inspector/WorkerDebuggerAgent.cpp |
@@ -46,14 +46,40 @@ Mutex& workerDebuggerAgentsMutex() |
return mutex; |
} |
-typedef HashMap<WorkerThread*, WorkerDebuggerAgent*> WorkerDebuggerAgents; |
+typedef CrossThreadPersistent<HeapHashMap<WorkerThread*, Member<WorkerDebuggerAgent> > > WorkerDebuggerAgents; |
WorkerDebuggerAgents& workerDebuggerAgents() |
{ |
- DEFINE_STATIC_LOCAL(WorkerDebuggerAgents, agents, ()); |
+ DEFINE_STATIC_LOCAL(WorkerDebuggerAgents, agents, (new HeapHashMap<WorkerThread*, Member<WorkerDebuggerAgent> >())); |
return agents; |
} |
+#if ENABLE(OILPAN) |
+class WorkerDebuggerAgentRemover { |
+public: |
+ WorkerDebuggerAgentRemover(WorkerThread* thread) |
+ {printf("WorkerDebuggerAgentRemover %p\n", this); |
+ m_thread = thread; |
+ } |
+ ~WorkerDebuggerAgentRemover() |
+ {printf("~WorkerDebuggerAgentRemover %p\n", this); |
+ MutexLocker lock(workerDebuggerAgentsMutex()); |
+ ASSERT(workerDebuggerAgents()->contains(m_thread)); |
+ workerDebuggerAgents()->remove(m_thread); |
+ } |
+ |
+private: |
+ WorkerThread* m_thread; |
+}; |
+ |
+typedef CrossThreadPersistent<HeapHashMap<WeakMember<WorkerDebuggerAgent>, OwnPtr<WorkerDebuggerAgentRemover> > > WorkerDebuggerAgentRemovers; |
+ |
+WorkerDebuggerAgentRemovers& workerDebuggerAgentRemovers() |
+{ |
+ DEFINE_STATIC_LOCAL(WorkerDebuggerAgentRemovers, removers, (new HeapHashMap<WeakMember<WorkerDebuggerAgent>, OwnPtr<WorkerDebuggerAgentRemover> >())); |
+ return removers; |
+} |
+#endif |
class RunInspectorCommandsTask FINAL : public ScriptDebugServer::Task { |
public: |
@@ -73,31 +99,43 @@ private: |
} // namespace |
-PassOwnPtr<WorkerDebuggerAgent> WorkerDebuggerAgent::create(WorkerScriptDebugServer* scriptDebugServer, WorkerGlobalScope* inspectedWorkerGlobalScope, InjectedScriptManager* injectedScriptManager) |
+PassOwnPtrWillBeRawPtr<WorkerDebuggerAgent> WorkerDebuggerAgent::create(WorkerScriptDebugServer* scriptDebugServer, WorkerGlobalScope* inspectedWorkerGlobalScope, InjectedScriptManager* injectedScriptManager) |
{ |
- return adoptPtr(new WorkerDebuggerAgent(scriptDebugServer, inspectedWorkerGlobalScope, injectedScriptManager)); |
+ return adoptPtrWillBeNoop(new WorkerDebuggerAgent(scriptDebugServer, inspectedWorkerGlobalScope, injectedScriptManager)); |
} |
WorkerDebuggerAgent::WorkerDebuggerAgent(WorkerScriptDebugServer* scriptDebugServer, WorkerGlobalScope* inspectedWorkerGlobalScope, InjectedScriptManager* injectedScriptManager) |
: InspectorDebuggerAgent(injectedScriptManager) |
, m_scriptDebugServer(scriptDebugServer) |
, m_inspectedWorkerGlobalScope(inspectedWorkerGlobalScope) |
-{ |
+{printf("WorkerDebuggerAgent::WorkerDebuggerAgent %p\n", this); |
MutexLocker lock(workerDebuggerAgentsMutex()); |
- workerDebuggerAgents().set(inspectedWorkerGlobalScope->thread(), this); |
+ WorkerThread* thread = inspectedWorkerGlobalScope->thread(); |
+ ASSERT(!workerDebuggerAgents()->contains(thread)); |
+ ASSERT(!workerDebuggerAgentRemovers()->contains(this)); |
+ workerDebuggerAgents()->add(thread, this); |
+ // workerDebuggerAgentRemovers()->add(this, adoptPtr(new WorkerDebuggerAgentRemover(thread))); |
} |
WorkerDebuggerAgent::~WorkerDebuggerAgent() |
-{ |
+{printf("WorkerDebuggerAgent::~WorkerDebuggerAgent %p\n", this); |
+#if !ENABLE(OILPAN) |
MutexLocker lock(workerDebuggerAgentsMutex()); |
- ASSERT(workerDebuggerAgents().contains(m_inspectedWorkerGlobalScope->thread())); |
- workerDebuggerAgents().remove(m_inspectedWorkerGlobalScope->thread()); |
+ ASSERT(workerDebuggerAgents()->contains(m_inspectedWorkerGlobalScope->thread())); |
+ workerDebuggerAgents()->remove(m_inspectedWorkerGlobalScope->thread()); |
+#endif |
+} |
+ |
+void WorkerDebuggerAgent::trace(Visitor* visitor) |
+{ |
+ visitor->trace(m_inspectedWorkerGlobalScope); |
+ InspectorDebuggerAgent::trace(visitor); |
} |
void WorkerDebuggerAgent::interruptAndDispatchInspectorCommands(WorkerThread* thread) |
{ |
MutexLocker lock(workerDebuggerAgentsMutex()); |
- WorkerDebuggerAgent* agent = workerDebuggerAgents().get(thread); |
+ WorkerDebuggerAgent* agent = workerDebuggerAgents()->get(thread); |
if (agent) |
agent->m_scriptDebugServer->interruptAndRunTask(adoptPtr(new RunInspectorCommandsTask(thread))); |
} |