| 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 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 return m_started && workerBackingThread().backingThread().isCurrentThread(); | 218 return m_started && workerBackingThread().backingThread().isCurrentThread(); |
| 219 } | 219 } |
| 220 | 220 |
| 221 void WorkerThread::postTask(const WebTraceLocation& location, std::unique_ptr<Ex
ecutionContextTask> task) | 221 void WorkerThread::postTask(const WebTraceLocation& location, std::unique_ptr<Ex
ecutionContextTask> task) |
| 222 { | 222 { |
| 223 { | 223 { |
| 224 MutexLocker lock(m_threadStateMutex); | 224 MutexLocker lock(m_threadStateMutex); |
| 225 if (m_terminated || m_readyToShutdown) | 225 if (m_terminated || m_readyToShutdown) |
| 226 return; | 226 return; |
| 227 } | 227 } |
| 228 workerBackingThread().backingThread().postTask(location, createWorkerThreadT
ask(std::move(task), true)); | 228 |
| 229 bool isInstrumented = !task->taskNameForInstrumentation().isEmpty(); |
| 230 if (isInstrumented) { |
| 231 DCHECK(isCurrentThread()); |
| 232 InspectorInstrumentation::asyncTaskScheduled(workerGlobalScope(), "Worke
r task", task.get()); |
| 233 } |
| 234 workerBackingThread().backingThread().postTask(location, threadSafeBind(&Wor
kerThread::performTaskOnWorkerThread, AllowCrossThreadAccess(this), passed(std::
move(task)), isInstrumented)); |
| 229 } | 235 } |
| 230 | 236 |
| 231 void WorkerThread::appendDebuggerTask(std::unique_ptr<CrossThreadClosure> task) | 237 void WorkerThread::appendDebuggerTask(std::unique_ptr<CrossThreadClosure> task) |
| 232 { | 238 { |
| 233 DCHECK(isMainThread()); | 239 DCHECK(isMainThread()); |
| 234 { | 240 { |
| 235 MutexLocker lock(m_threadStateMutex); | 241 MutexLocker lock(m_threadStateMutex); |
| 236 if (m_terminated) | 242 if (m_terminated) |
| 237 return; | 243 return; |
| 238 } | 244 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 WaitableEvent::ResetPolicy::Manual, | 309 WaitableEvent::ResetPolicy::Manual, |
| 304 WaitableEvent::InitialState::NonSignaled))) | 310 WaitableEvent::InitialState::NonSignaled))) |
| 305 , m_shutdownEvent(adoptPtr(new WaitableEvent( | 311 , m_shutdownEvent(adoptPtr(new WaitableEvent( |
| 306 WaitableEvent::ResetPolicy::Manual, | 312 WaitableEvent::ResetPolicy::Manual, |
| 307 WaitableEvent::InitialState::NonSignaled))) | 313 WaitableEvent::InitialState::NonSignaled))) |
| 308 { | 314 { |
| 309 MutexLocker lock(threadSetMutex()); | 315 MutexLocker lock(threadSetMutex()); |
| 310 workerThreads().add(this); | 316 workerThreads().add(this); |
| 311 } | 317 } |
| 312 | 318 |
| 313 std::unique_ptr<CrossThreadClosure> WorkerThread::createWorkerThreadTask(std::un
ique_ptr<ExecutionContextTask> task, bool isInstrumented) | |
| 314 { | |
| 315 if (isInstrumented) | |
| 316 isInstrumented = !task->taskNameForInstrumentation().isEmpty(); | |
| 317 if (isInstrumented) { | |
| 318 DCHECK(isCurrentThread()); | |
| 319 InspectorInstrumentation::asyncTaskScheduled(workerGlobalScope(), "Worke
r task", task.get()); | |
| 320 } | |
| 321 return threadSafeBind(&WorkerThread::performTaskOnWorkerThread, AllowCrossTh
readAccess(this), passed(std::move(task)), isInstrumented); | |
| 322 } | |
| 323 | |
| 324 void WorkerThread::terminateInternal(TerminationMode mode) | 319 void WorkerThread::terminateInternal(TerminationMode mode) |
| 325 { | 320 { |
| 326 DCHECK(m_started); | 321 DCHECK(m_started); |
| 327 | 322 |
| 328 // Prevent the deadlock between GC and an attempt to terminate a thread. | 323 // Prevent the deadlock between GC and an attempt to terminate a thread. |
| 329 SafePointScope safePointScope(BlinkGC::HeapPointersOnStack); | 324 SafePointScope safePointScope(BlinkGC::HeapPointersOnStack); |
| 330 | 325 |
| 331 // Protect against this method, initializeOnWorkerThread() or termination | 326 // Protect against this method, initializeOnWorkerThread() or termination |
| 332 // via the global scope racing each other. | 327 // via the global scope racing each other. |
| 333 MutexLocker lock(m_threadStateMutex); | 328 MutexLocker lock(m_threadStateMutex); |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 (*task)(); | 580 (*task)(); |
| 586 } | 581 } |
| 587 | 582 |
| 588 WorkerThread::ExitCode WorkerThread::getExitCode() | 583 WorkerThread::ExitCode WorkerThread::getExitCode() |
| 589 { | 584 { |
| 590 MutexLocker lock(m_threadStateMutex); | 585 MutexLocker lock(m_threadStateMutex); |
| 591 return m_exitCode; | 586 return m_exitCode; |
| 592 } | 587 } |
| 593 | 588 |
| 594 } // namespace blink | 589 } // namespace blink |
| OLD | NEW |