| 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mutex, new Mutex); | 147 DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mutex, new Mutex); |
| 148 return mutex; | 148 return mutex; |
| 149 } | 149 } |
| 150 | 150 |
| 151 static HashSet<WorkerThread*>& workerThreads() | 151 static HashSet<WorkerThread*>& workerThreads() |
| 152 { | 152 { |
| 153 DEFINE_STATIC_LOCAL(HashSet<WorkerThread*>, threads, ()); | 153 DEFINE_STATIC_LOCAL(HashSet<WorkerThread*>, threads, ()); |
| 154 return threads; | 154 return threads; |
| 155 } | 155 } |
| 156 | 156 |
| 157 WorkerThreadContext::WorkerThreadContext() |
| 158 { |
| 159 DCHECK(isMainThread()); |
| 160 } |
| 161 |
| 162 WorkerThreadContext::~WorkerThreadContext() |
| 163 { |
| 164 DCHECK(isMainThread()); |
| 165 } |
| 166 |
| 167 void WorkerThreadContext::notifyContextDestroyed() |
| 168 { |
| 169 DCHECK(isMainThread()); |
| 170 DCHECK(!m_wasContextDestroyed); |
| 171 m_wasContextDestroyed = true; |
| 172 LifecycleNotifier::notifyContextDestroyed(); |
| 173 } |
| 174 |
| 157 WorkerThread::~WorkerThread() | 175 WorkerThread::~WorkerThread() |
| 158 { | 176 { |
| 159 DCHECK(isMainThread()); | 177 DCHECK(isMainThread()); |
| 160 MutexLocker lock(threadSetMutex()); | 178 MutexLocker lock(threadSetMutex()); |
| 161 DCHECK(workerThreads().contains(this)); | 179 DCHECK(workerThreads().contains(this)); |
| 162 workerThreads().remove(this); | 180 workerThreads().remove(this); |
| 163 | 181 |
| 164 DCHECK_NE(ExitCode::NotTerminated, m_exitCode); | 182 DCHECK_NE(ExitCode::NotTerminated, m_exitCode); |
| 165 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, exitCodeHistogram, new
EnumerationHistogram("WorkerThread.ExitCode", static_cast<int>(ExitCode::LastEn
um))); | 183 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, exitCodeHistogram, new
EnumerationHistogram("WorkerThread.ExitCode", static_cast<int>(ExitCode::LastEn
um))); |
| 166 exitCodeHistogram.count(static_cast<int>(m_exitCode)); | 184 exitCodeHistogram.count(static_cast<int>(m_exitCode)); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 : m_forceTerminationDelayInMs(kForceTerminationDelayInMs) | 318 : m_forceTerminationDelayInMs(kForceTerminationDelayInMs) |
| 301 , m_inspectorTaskRunner(adoptPtr(new InspectorTaskRunner())) | 319 , m_inspectorTaskRunner(adoptPtr(new InspectorTaskRunner())) |
| 302 , m_workerLoaderProxy(workerLoaderProxy) | 320 , m_workerLoaderProxy(workerLoaderProxy) |
| 303 , m_workerReportingProxy(workerReportingProxy) | 321 , m_workerReportingProxy(workerReportingProxy) |
| 304 , m_terminationEvent(adoptPtr(new WaitableEvent( | 322 , m_terminationEvent(adoptPtr(new WaitableEvent( |
| 305 WaitableEvent::ResetPolicy::Manual, | 323 WaitableEvent::ResetPolicy::Manual, |
| 306 WaitableEvent::InitialState::NonSignaled))) | 324 WaitableEvent::InitialState::NonSignaled))) |
| 307 , m_shutdownEvent(adoptPtr(new WaitableEvent( | 325 , m_shutdownEvent(adoptPtr(new WaitableEvent( |
| 308 WaitableEvent::ResetPolicy::Manual, | 326 WaitableEvent::ResetPolicy::Manual, |
| 309 WaitableEvent::InitialState::NonSignaled))) | 327 WaitableEvent::InitialState::NonSignaled))) |
| 328 , m_workerThreadContext(new WorkerThreadContext) |
| 310 { | 329 { |
| 330 DCHECK(isMainThread()); |
| 311 MutexLocker lock(threadSetMutex()); | 331 MutexLocker lock(threadSetMutex()); |
| 312 workerThreads().add(this); | 332 workerThreads().add(this); |
| 313 } | 333 } |
| 314 | 334 |
| 315 std::unique_ptr<CrossThreadClosure> WorkerThread::createWorkerThreadTask(std::un
ique_ptr<ExecutionContextTask> task, bool isInstrumented) | 335 std::unique_ptr<CrossThreadClosure> WorkerThread::createWorkerThreadTask(std::un
ique_ptr<ExecutionContextTask> task, bool isInstrumented) |
| 316 { | 336 { |
| 317 if (isInstrumented) | 337 if (isInstrumented) |
| 318 isInstrumented = !task->taskNameForInstrumentation().isEmpty(); | 338 isInstrumented = !task->taskNameForInstrumentation().isEmpty(); |
| 319 if (isInstrumented) { | 339 if (isInstrumented) { |
| 320 DCHECK(isCurrentThread()); | 340 DCHECK(isCurrentThread()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 347 m_exitCode = ExitCode::SyncForciblyTerminated; | 367 m_exitCode = ExitCode::SyncForciblyTerminated; |
| 348 } | 368 } |
| 349 return; | 369 return; |
| 350 } | 370 } |
| 351 m_terminated = true; | 371 m_terminated = true; |
| 352 | 372 |
| 353 // Signal the thread to notify that the thread's stopping. | 373 // Signal the thread to notify that the thread's stopping. |
| 354 if (m_terminationEvent) | 374 if (m_terminationEvent) |
| 355 m_terminationEvent->signal(); | 375 m_terminationEvent->signal(); |
| 356 | 376 |
| 377 m_workerThreadContext->notifyContextDestroyed(); |
| 378 |
| 357 // If the worker thread was never initialized, don't start another | 379 // If the worker thread was never initialized, don't start another |
| 358 // shutdown, but still wait for the thread to signal when shutdown has | 380 // shutdown, but still wait for the thread to signal when shutdown has |
| 359 // completed on initializeOnWorkerThread(). | 381 // completed on initializeOnWorkerThread(). |
| 360 if (!m_workerGlobalScope) { | 382 if (!m_workerGlobalScope) { |
| 361 DCHECK_EQ(ExitCode::NotTerminated, m_exitCode); | 383 DCHECK_EQ(ExitCode::NotTerminated, m_exitCode); |
| 362 m_exitCode = ExitCode::GracefullyTerminated; | 384 m_exitCode = ExitCode::GracefullyTerminated; |
| 363 return; | 385 return; |
| 364 } | 386 } |
| 365 | 387 |
| 366 // Determine if we should synchronously terminate or schedule to terminate | 388 // Determine if we should synchronously terminate or schedule to terminate |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 (*task)(); | 609 (*task)(); |
| 588 } | 610 } |
| 589 | 611 |
| 590 WorkerThread::ExitCode WorkerThread::getExitCode() | 612 WorkerThread::ExitCode WorkerThread::getExitCode() |
| 591 { | 613 { |
| 592 MutexLocker lock(m_threadStateMutex); | 614 MutexLocker lock(m_threadStateMutex); |
| 593 return m_exitCode; | 615 return m_exitCode; |
| 594 } | 616 } |
| 595 | 617 |
| 596 } // namespace blink | 618 } // namespace blink |
| OLD | NEW |