| 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 19 matching lines...) Expand all Loading... |
| 30 #include <memory> | 30 #include <memory> |
| 31 | 31 |
| 32 #include "core/CoreExport.h" | 32 #include "core/CoreExport.h" |
| 33 #include "core/frame/csp/ContentSecurityPolicy.h" | 33 #include "core/frame/csp/ContentSecurityPolicy.h" |
| 34 #include "core/workers/ParentFrameTaskRunners.h" | 34 #include "core/workers/ParentFrameTaskRunners.h" |
| 35 #include "core/workers/WorkerLoaderProxy.h" | 35 #include "core/workers/WorkerLoaderProxy.h" |
| 36 #include "core/workers/WorkerThreadLifecycleObserver.h" | 36 #include "core/workers/WorkerThreadLifecycleObserver.h" |
| 37 #include "platform/LifecycleNotifier.h" | 37 #include "platform/LifecycleNotifier.h" |
| 38 #include "platform/WaitableEvent.h" | 38 #include "platform/WaitableEvent.h" |
| 39 #include "platform/WebTaskRunner.h" | 39 #include "platform/WebTaskRunner.h" |
| 40 #include "platform/scheduler/child/worker_global_scope_scheduler.h" |
| 40 #include "platform/wtf/Forward.h" | 41 #include "platform/wtf/Forward.h" |
| 41 #include "platform/wtf/Functional.h" | 42 #include "platform/wtf/Functional.h" |
| 42 #include "platform/wtf/PassRefPtr.h" | 43 #include "platform/wtf/PassRefPtr.h" |
| 43 #include "public/platform/WebThread.h" | 44 #include "public/platform/WebThread.h" |
| 44 #include "v8/include/v8.h" | 45 #include "v8/include/v8.h" |
| 45 | 46 |
| 46 namespace blink { | 47 namespace blink { |
| 47 | 48 |
| 48 class ConsoleMessageStorage; | 49 class ConsoleMessageStorage; |
| 49 class InspectorTaskRunner; | 50 class InspectorTaskRunner; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 // | 86 // |
| 86 // WorkerThread start and termination must be initiated on the main thread and | 87 // WorkerThread start and termination must be initiated on the main thread and |
| 87 // an actual task is executed on the worker thread. | 88 // an actual task is executed on the worker thread. |
| 88 // | 89 // |
| 89 // When termination starts, (debugger) tasks on WorkerThread are handled as | 90 // When termination starts, (debugger) tasks on WorkerThread are handled as |
| 90 // follows: | 91 // follows: |
| 91 // - A running task may finish unless a forcible termination task interrupts. | 92 // - A running task may finish unless a forcible termination task interrupts. |
| 92 // If the running task is for debugger, it's guaranteed to finish without | 93 // If the running task is for debugger, it's guaranteed to finish without |
| 93 // any interruptions. | 94 // any interruptions. |
| 94 // - Queued tasks never run. | 95 // - Queued tasks never run. |
| 95 // - postTask() and appendDebuggerTask() reject posting new tasks. | |
| 96 class CORE_EXPORT WorkerThread : public WebThread::TaskObserver { | 96 class CORE_EXPORT WorkerThread : public WebThread::TaskObserver { |
| 97 public: | 97 public: |
| 98 // Represents how this thread is terminated. Used for UMA. Append only. | 98 // Represents how this thread is terminated. Used for UMA. Append only. |
| 99 enum class ExitCode { | 99 enum class ExitCode { |
| 100 kNotTerminated, | 100 kNotTerminated, |
| 101 kGracefullyTerminated, | 101 kGracefullyTerminated, |
| 102 kSyncForciblyTerminated, | 102 kSyncForciblyTerminated, |
| 103 kAsyncForciblyTerminated, | 103 kAsyncForciblyTerminated, |
| 104 kLastEnum, | 104 kLastEnum, |
| 105 }; | 105 }; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 130 | 130 |
| 131 WorkerLoaderProxy* GetWorkerLoaderProxy() const { | 131 WorkerLoaderProxy* GetWorkerLoaderProxy() const { |
| 132 RELEASE_ASSERT(worker_loader_proxy_); | 132 RELEASE_ASSERT(worker_loader_proxy_); |
| 133 return worker_loader_proxy_.Get(); | 133 return worker_loader_proxy_.Get(); |
| 134 } | 134 } |
| 135 | 135 |
| 136 WorkerReportingProxy& GetWorkerReportingProxy() const { | 136 WorkerReportingProxy& GetWorkerReportingProxy() const { |
| 137 return worker_reporting_proxy_; | 137 return worker_reporting_proxy_; |
| 138 } | 138 } |
| 139 | 139 |
| 140 void PostTask(const WebTraceLocation&, std::unique_ptr<WTF::Closure>); | |
| 141 void PostTask(const WebTraceLocation&, | |
| 142 std::unique_ptr<WTF::CrossThreadClosure>); | |
| 143 void AppendDebuggerTask(std::unique_ptr<CrossThreadClosure>); | 140 void AppendDebuggerTask(std::unique_ptr<CrossThreadClosure>); |
| 144 | 141 |
| 145 // Runs only debugger tasks while paused in debugger. | 142 // Runs only debugger tasks while paused in debugger. |
| 146 void StartRunningDebuggerTasksOnPauseOnWorkerThread(); | 143 void StartRunningDebuggerTasksOnPauseOnWorkerThread(); |
| 147 void StopRunningDebuggerTasksOnPauseOnWorkerThread(); | 144 void StopRunningDebuggerTasksOnPauseOnWorkerThread(); |
| 148 | 145 |
| 149 // Can be called only on the worker thread, WorkerOrWorkletGlobalScope | 146 // Can be called only on the worker thread, WorkerOrWorkletGlobalScope |
| 150 // and WorkerInspectorController are not thread safe. | 147 // and WorkerInspectorController are not thread safe. |
| 151 WorkerOrWorkletGlobalScope* GlobalScope(); | 148 WorkerOrWorkletGlobalScope* GlobalScope(); |
| 152 WorkerInspectorController* GetWorkerInspectorController(); | 149 WorkerInspectorController* GetWorkerInspectorController(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 169 PlatformThreadId GetPlatformThreadId(); | 166 PlatformThreadId GetPlatformThreadId(); |
| 170 | 167 |
| 171 bool IsForciblyTerminated(); | 168 bool IsForciblyTerminated(); |
| 172 | 169 |
| 173 void WaitForShutdownForTesting() { shutdown_event_->Wait(); } | 170 void WaitForShutdownForTesting() { shutdown_event_->Wait(); } |
| 174 | 171 |
| 175 ParentFrameTaskRunners* GetParentFrameTaskRunners() const { | 172 ParentFrameTaskRunners* GetParentFrameTaskRunners() const { |
| 176 return parent_frame_task_runners_.Get(); | 173 return parent_frame_task_runners_.Get(); |
| 177 } | 174 } |
| 178 | 175 |
| 176 scheduler::WorkerGlobalScopeScheduler* GetGlobalScopeScheduler() const { |
| 177 return global_scope_scheduler_.get(); |
| 178 } |
| 179 |
| 179 protected: | 180 protected: |
| 180 WorkerThread(PassRefPtr<WorkerLoaderProxy>, WorkerReportingProxy&); | 181 WorkerThread(PassRefPtr<WorkerLoaderProxy>, WorkerReportingProxy&); |
| 181 | 182 |
| 182 // Factory method for creating a new worker context for the thread. | 183 // Factory method for creating a new worker context for the thread. |
| 183 // Called on the worker thread. | 184 // Called on the worker thread. |
| 184 virtual WorkerOrWorkletGlobalScope* CreateWorkerGlobalScope( | 185 virtual WorkerOrWorkletGlobalScope* CreateWorkerGlobalScope( |
| 185 std::unique_ptr<WorkerThreadStartupData>) = 0; | 186 std::unique_ptr<WorkerThreadStartupData>) = 0; |
| 186 | 187 |
| 187 // Returns true when this WorkerThread owns the associated | 188 // Returns true when this WorkerThread owns the associated |
| 188 // WorkerBackingThread exclusively. If this function returns true, the | 189 // WorkerBackingThread exclusively. If this function returns true, the |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 // thread. This task is expected to run when the shutdown sequence does not | 237 // thread. This task is expected to run when the shutdown sequence does not |
| 237 // start in a certain time period because of an inifite loop in the JS | 238 // start in a certain time period because of an inifite loop in the JS |
| 238 // execution context etc. When the shutdown sequence is started before this | 239 // execution context etc. When the shutdown sequence is started before this |
| 239 // task runs, the task is simply cancelled. | 240 // task runs, the task is simply cancelled. |
| 240 void MayForciblyTerminateExecution(); | 241 void MayForciblyTerminateExecution(); |
| 241 | 242 |
| 242 // Forcibly terminates the worker execution. This must be called with | 243 // Forcibly terminates the worker execution. This must be called with |
| 243 // |m_threadStateMutex| acquired. | 244 // |m_threadStateMutex| acquired. |
| 244 void ForciblyTerminateExecution(const MutexLocker&, ExitCode); | 245 void ForciblyTerminateExecution(const MutexLocker&, ExitCode); |
| 245 | 246 |
| 246 // Returns true if termination or shutdown sequence has started. This is | 247 void InitializeSchedulerOnWorkerThread(WaitableEvent*); |
| 247 // thread safe. | |
| 248 // Note that this returns false when the sequence has already started but it | |
| 249 // hasn't been notified to the calling thread. | |
| 250 bool IsInShutdown(); | |
| 251 | |
| 252 void InitializeOnWorkerThread(std::unique_ptr<WorkerThreadStartupData>); | 248 void InitializeOnWorkerThread(std::unique_ptr<WorkerThreadStartupData>); |
| 253 void PrepareForShutdownOnWorkerThread(); | 249 void PrepareForShutdownOnWorkerThread(); |
| 254 void PerformShutdownOnWorkerThread(); | 250 void PerformShutdownOnWorkerThread(); |
| 255 template <WTF::FunctionThreadAffinity threadAffinity> | 251 template <WTF::FunctionThreadAffinity threadAffinity> |
| 256 void PerformTaskOnWorkerThread( | 252 void PerformTaskOnWorkerThread( |
| 257 std::unique_ptr<Function<void(), threadAffinity>> task); | 253 std::unique_ptr<Function<void(), threadAffinity>> task); |
| 258 void PerformDebuggerTaskOnWorkerThread(std::unique_ptr<CrossThreadClosure>); | 254 void PerformDebuggerTaskOnWorkerThread(std::unique_ptr<CrossThreadClosure>); |
| 259 void PerformDebuggerTaskDontWaitOnWorkerThread(); | 255 void PerformDebuggerTaskDontWaitOnWorkerThread(); |
| 260 | 256 |
| 261 // These must be called with |m_threadStateMutex| acquired. | 257 // These must be called with |m_threadStateMutex| acquired. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 287 | 283 |
| 288 ThreadState thread_state_ = ThreadState::kNotStarted; | 284 ThreadState thread_state_ = ThreadState::kNotStarted; |
| 289 ExitCode exit_code_ = ExitCode::kNotTerminated; | 285 ExitCode exit_code_ = ExitCode::kNotTerminated; |
| 290 | 286 |
| 291 long long forcible_termination_delay_in_ms_; | 287 long long forcible_termination_delay_in_ms_; |
| 292 | 288 |
| 293 std::unique_ptr<InspectorTaskRunner> inspector_task_runner_; | 289 std::unique_ptr<InspectorTaskRunner> inspector_task_runner_; |
| 294 | 290 |
| 295 RefPtr<WorkerLoaderProxy> worker_loader_proxy_; | 291 RefPtr<WorkerLoaderProxy> worker_loader_proxy_; |
| 296 WorkerReportingProxy& worker_reporting_proxy_; | 292 WorkerReportingProxy& worker_reporting_proxy_; |
| 293 |
| 297 CrossThreadPersistent<ParentFrameTaskRunners> parent_frame_task_runners_; | 294 CrossThreadPersistent<ParentFrameTaskRunners> parent_frame_task_runners_; |
| 298 | 295 |
| 296 // Tasks managed by this scheduler are canceled when the global scope is |
| 297 // closed. |
| 298 std::unique_ptr<scheduler::WorkerGlobalScopeScheduler> |
| 299 global_scope_scheduler_; |
| 300 |
| 299 // This lock protects |m_globalScope|, |m_requestedToTerminate|, | 301 // This lock protects |m_globalScope|, |m_requestedToTerminate|, |
| 300 // |m_threadState|, |m_runningDebuggerTask| and |m_exitCode|. | 302 // |m_threadState|, |m_runningDebuggerTask| and |m_exitCode|. |
| 301 Mutex thread_state_mutex_; | 303 Mutex thread_state_mutex_; |
| 302 | 304 |
| 303 CrossThreadPersistent<ConsoleMessageStorage> console_message_storage_; | 305 CrossThreadPersistent<ConsoleMessageStorage> console_message_storage_; |
| 304 CrossThreadPersistent<WorkerOrWorkletGlobalScope> global_scope_; | 306 CrossThreadPersistent<WorkerOrWorkletGlobalScope> global_scope_; |
| 305 CrossThreadPersistent<WorkerInspectorController> worker_inspector_controller_; | 307 CrossThreadPersistent<WorkerInspectorController> worker_inspector_controller_; |
| 306 | 308 |
| 307 // Signaled when the thread completes termination on the worker thread. | 309 // Signaled when the thread completes termination on the worker thread. |
| 308 std::unique_ptr<WaitableEvent> shutdown_event_; | 310 std::unique_ptr<WaitableEvent> shutdown_event_; |
| 309 | 311 |
| 310 // Used to cancel a scheduled forcible termination task. See | 312 // Used to cancel a scheduled forcible termination task. See |
| 311 // mayForciblyTerminateExecution() for details. | 313 // mayForciblyTerminateExecution() for details. |
| 312 TaskHandle forcible_termination_task_handle_; | 314 TaskHandle forcible_termination_task_handle_; |
| 313 | 315 |
| 314 // Created on the main thread heap, but will be accessed cross-thread | 316 // Created on the main thread heap, but will be accessed cross-thread |
| 315 // when worker thread posts tasks. | 317 // when worker thread posts tasks. |
| 316 CrossThreadPersistent<WorkerThreadLifecycleContext> | 318 CrossThreadPersistent<WorkerThreadLifecycleContext> |
| 317 worker_thread_lifecycle_context_; | 319 worker_thread_lifecycle_context_; |
| 318 }; | 320 }; |
| 319 | 321 |
| 320 } // namespace blink | 322 } // namespace blink |
| 321 | 323 |
| 322 #endif // WorkerThread_h | 324 #endif // WorkerThread_h |
| OLD | NEW |