Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 279 InspectorInstrumentation::willEvaluateWorkerScript(workerGlobalScope(), star tMode); | 279 InspectorInstrumentation::willEvaluateWorkerScript(workerGlobalScope(), star tMode); |
| 280 script->evaluate(ScriptSourceCode(sourceCode, scriptURL)); | 280 script->evaluate(ScriptSourceCode(sourceCode, scriptURL)); |
| 281 | 281 |
| 282 postInitialize(); | 282 postInitialize(); |
| 283 | 283 |
| 284 postDelayedTask(createSameThreadTask(&WorkerThread::idleHandler, this), kSho rtIdleHandlerDelayMs); | 284 postDelayedTask(createSameThreadTask(&WorkerThread::idleHandler, this), kSho rtIdleHandlerDelayMs); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void WorkerThread::cleanup() | 287 void WorkerThread::cleanup() |
| 288 { | 288 { |
| 289 | |
| 290 // This should be called before we start the shutdown procedure. | 289 // This should be called before we start the shutdown procedure. |
| 291 workerReportingProxy().willDestroyWorkerGlobalScope(); | 290 workerReportingProxy().willDestroyWorkerGlobalScope(); |
| 292 | 291 |
| 293 // The below assignment will destroy the context, which will in turn notify messaging proxy. | 292 // The below assignment will destroy the context, which will in turn notify messaging proxy. |
| 294 // We cannot let any objects survive past thread exit, because no other thre ad will run GC or otherwise destroy them. | 293 // We cannot let any objects survive past thread exit, because no other thre ad will run GC or otherwise destroy them. |
| 295 // If Oilpan is enabled, we detach of the context/global scope, with the fin al heap cleanup below sweeping it out. | 294 // If Oilpan is enabled, we detach of the context/global scope, with the fin al heap cleanup below sweeping it out. |
| 296 #if !ENABLE(OILPAN) | 295 #if !ENABLE(OILPAN) |
| 297 ASSERT(m_workerGlobalScope->hasOneRef()); | 296 ASSERT(m_workerGlobalScope->hasOneRef()); |
| 298 #endif | 297 #endif |
| 299 m_workerGlobalScope->dispose(); | 298 m_workerGlobalScope->dispose(); |
|
haraken
2014/09/11 01:18:54
I think you can call willBeDestroyed here (between
jsbell
2014/09/11 22:14:52
Agreed, doing it here in cleanup() would be better
| |
| 300 m_workerGlobalScope = nullptr; | 299 m_workerGlobalScope = nullptr; |
| 301 | 300 |
|
haraken
2014/09/11 01:18:54
I think you can call willBeDestroyed here.
| |
| 302 ThreadState::current()->removeInterruptor(m_messageLoopInterruptor.get()); | 301 ThreadState::current()->removeInterruptor(m_messageLoopInterruptor.get()); |
| 303 | 302 |
| 304 // Detach the ThreadState, cleaning out the thread's heap by | 303 // Detach the ThreadState, cleaning out the thread's heap by |
| 305 // performing a final GC. The cleanup operation will at the end | 304 // performing a final GC. The cleanup operation will at the end |
| 306 // assert that the heap is empty. If the heap does not become | 305 // assert that the heap is empty. If the heap does not become |
| 307 // empty, there are still pointers into the heap and those | 306 // empty, there are still pointers into the heap and those |
| 308 // pointers will be dangling after thread termination because we | 307 // pointers will be dangling after thread termination because we |
| 309 // are destroying the heap. It is important to detach while the | 308 // are destroying the heap. It is important to detach while the |
| 310 // thread is still valid. In particular, finalizers for objects in | 309 // thread is still valid. In particular, finalizers for objects in |
| 311 // the heap for this thread will need to access thread local data. | 310 // the heap for this thread will need to access thread local data. |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 330 class WorkerThreadShutdownFinishTask : public ExecutionContextTask { | 329 class WorkerThreadShutdownFinishTask : public ExecutionContextTask { |
| 331 public: | 330 public: |
| 332 static PassOwnPtr<WorkerThreadShutdownFinishTask> create() | 331 static PassOwnPtr<WorkerThreadShutdownFinishTask> create() |
| 333 { | 332 { |
| 334 return adoptPtr(new WorkerThreadShutdownFinishTask()); | 333 return adoptPtr(new WorkerThreadShutdownFinishTask()); |
| 335 } | 334 } |
| 336 | 335 |
| 337 virtual void performTask(ExecutionContext *context) | 336 virtual void performTask(ExecutionContext *context) |
| 338 { | 337 { |
| 339 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); | 338 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); |
| 339 | |
| 340 V8PerIsolateData::willBeDestroyed(workerGlobalScope->script()->isolate() ); | |
|
haraken
2014/09/11 01:18:54
Can we call this in WorkerThread::cleanup()? We wa
| |
| 340 workerGlobalScope->clearInspector(); | 341 workerGlobalScope->clearInspector(); |
| 341 // It's not safe to call clearScript until all the cleanup tasks posted by functions initiated by WorkerThreadShutdownStartTask have completed. | 342 // It's not safe to call clearScript until all the cleanup tasks posted by functions initiated by WorkerThreadShutdownStartTask have completed. |
| 342 workerGlobalScope->clearScript(); | 343 workerGlobalScope->clearScript(); |
| 343 workerGlobalScope->thread()->m_thread->postTask(new Task(WTF::bind(&Work erThread::cleanup, workerGlobalScope->thread()))); | 344 workerGlobalScope->thread()->m_thread->postTask(new Task(WTF::bind(&Work erThread::cleanup, workerGlobalScope->thread()))); |
| 344 } | 345 } |
| 345 | 346 |
| 346 virtual bool isCleanupTask() const { return true; } | 347 virtual bool isCleanupTask() const { return true; } |
| 347 }; | 348 }; |
| 348 | 349 |
| 349 class WorkerThreadShutdownStartTask : public ExecutionContextTask { | 350 class WorkerThreadShutdownStartTask : public ExecutionContextTask { |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 490 InspectorInstrumentation::didLeaveNestedRunLoop(m_workerGlobalScope.get()); | 491 InspectorInstrumentation::didLeaveNestedRunLoop(m_workerGlobalScope.get()); |
| 491 } | 492 } |
| 492 | 493 |
| 493 void WorkerThread::setWorkerInspectorController(WorkerInspectorController* worke rInspectorController) | 494 void WorkerThread::setWorkerInspectorController(WorkerInspectorController* worke rInspectorController) |
| 494 { | 495 { |
| 495 MutexLocker locker(m_workerInspectorControllerMutex); | 496 MutexLocker locker(m_workerInspectorControllerMutex); |
| 496 m_workerInspectorController = workerInspectorController; | 497 m_workerInspectorController = workerInspectorController; |
| 497 } | 498 } |
| 498 | 499 |
| 499 } // namespace blink | 500 } // namespace blink |
| OLD | NEW |