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