| 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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 PauseWorkerGlobalScopeOnStart | 53 PauseWorkerGlobalScopeOnStart |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 // WorkerThread is a kind of WorkerBackingThread client. Each worker mechanism | 56 // WorkerThread is a kind of WorkerBackingThread client. Each worker mechanism |
| 57 // can access the lower thread infrastructure via an implementation of this | 57 // can access the lower thread infrastructure via an implementation of this |
| 58 // abstract class. Multiple WorkerThreads can share one WorkerBackingThread. | 58 // abstract class. Multiple WorkerThreads can share one WorkerBackingThread. |
| 59 // See WorkerBackingThread.h for more details. | 59 // See WorkerBackingThread.h for more details. |
| 60 // | 60 // |
| 61 // WorkerThread start and termination must be initiated on the main thread and | 61 // WorkerThread start and termination must be initiated on the main thread and |
| 62 // an actual task is executed on the worker thread. | 62 // an actual task is executed on the worker thread. |
| 63 // |
| 64 // When termination starts, (debugger) tasks on WorkerThread are handled as |
| 65 // follows: |
| 66 // - A running task may finish unless a forcible termination task interrupts. |
| 67 // If the running task is for debugger, it's guaranteed to finish without |
| 68 // any interruptions. |
| 69 // - Queued tasks never run. |
| 70 // - postTask() and appendDebuggerTask() reject posting new tasks. |
| 63 class CORE_EXPORT WorkerThread { | 71 class CORE_EXPORT WorkerThread { |
| 64 public: | 72 public: |
| 65 // Represents how this thread is terminated. | 73 // Represents how this thread is terminated. |
| 66 enum class ExitCode { | 74 enum class ExitCode { |
| 67 NotTerminated, | 75 NotTerminated, |
| 68 GracefullyTerminated, | 76 GracefullyTerminated, |
| 69 SyncForciblyTerminated, | 77 SyncForciblyTerminated, |
| 70 AsyncForciblyTerminated, | 78 AsyncForciblyTerminated, |
| 71 }; | 79 }; |
| 72 | 80 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 96 { | 104 { |
| 97 RELEASE_ASSERT(m_workerLoaderProxy); | 105 RELEASE_ASSERT(m_workerLoaderProxy); |
| 98 return m_workerLoaderProxy.get(); | 106 return m_workerLoaderProxy.get(); |
| 99 } | 107 } |
| 100 | 108 |
| 101 WorkerReportingProxy& workerReportingProxy() const { return m_workerReportin
gProxy; } | 109 WorkerReportingProxy& workerReportingProxy() const { return m_workerReportin
gProxy; } |
| 102 | 110 |
| 103 void postTask(const WebTraceLocation&, std::unique_ptr<ExecutionContextTask>
); | 111 void postTask(const WebTraceLocation&, std::unique_ptr<ExecutionContextTask>
); |
| 104 void appendDebuggerTask(std::unique_ptr<CrossThreadClosure>); | 112 void appendDebuggerTask(std::unique_ptr<CrossThreadClosure>); |
| 105 | 113 |
| 106 // Runs only debugger tasks while paused in debugger, called on the worker | 114 // Runs only debugger tasks while paused in debugger. |
| 107 // thread. | 115 void startRunningDebuggerTasksOnPauseOnWorkerThread(); |
| 108 void startRunningDebuggerTasksOnPause(); | 116 void stopRunningDebuggerTasksOnPauseOnWorkerThread(); |
| 109 void stopRunningDebuggerTasksOnPause(); | |
| 110 bool isRunningDebuggerTasksOnPause() const { return m_pausedInDebugger; } | |
| 111 | 117 |
| 112 // Can be called only on the worker thread, WorkerGlobalScope is not thread | 118 // Can be called only on the worker thread, WorkerGlobalScope is not thread |
| 113 // safe. | 119 // safe. |
| 114 WorkerGlobalScope* workerGlobalScope(); | 120 WorkerGlobalScope* workerGlobalScope(); |
| 115 | 121 |
| 116 // Returns true once one of the terminate* methods is called. | 122 // Returns true once one of the terminate* methods is called. |
| 117 bool terminated(); | 123 bool terminated(); |
| 118 | 124 |
| 119 // Number of active worker threads. | 125 // Number of active worker threads. |
| 120 static unsigned workerThreadCount(); | 126 static unsigned workerThreadCount(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 | 159 |
| 154 std::unique_ptr<CrossThreadClosure> createWorkerThreadTask(std::unique_ptr<E
xecutionContextTask>, bool isInstrumented); | 160 std::unique_ptr<CrossThreadClosure> createWorkerThreadTask(std::unique_ptr<E
xecutionContextTask>, bool isInstrumented); |
| 155 | 161 |
| 156 void terminateInternal(TerminationMode); | 162 void terminateInternal(TerminationMode); |
| 157 void forciblyTerminateExecution(); | 163 void forciblyTerminateExecution(); |
| 158 | 164 |
| 159 void initializeOnWorkerThread(PassOwnPtr<WorkerThreadStartupData>); | 165 void initializeOnWorkerThread(PassOwnPtr<WorkerThreadStartupData>); |
| 160 void prepareForShutdownOnWorkerThread(); | 166 void prepareForShutdownOnWorkerThread(); |
| 161 void performShutdownOnWorkerThread(); | 167 void performShutdownOnWorkerThread(); |
| 162 void performTaskOnWorkerThread(std::unique_ptr<ExecutionContextTask>, bool i
sInstrumented); | 168 void performTaskOnWorkerThread(std::unique_ptr<ExecutionContextTask>, bool i
sInstrumented); |
| 163 void runDebuggerTaskOnWorkerThread(std::unique_ptr<CrossThreadClosure>); | 169 void performDebuggerTaskOnWorkerThread(std::unique_ptr<CrossThreadClosure>); |
| 164 void runDebuggerTaskDontWaitOnWorkerThread(); | 170 void performDebuggerTaskDontWaitOnWorkerThread(); |
| 165 | 171 |
| 166 void setForceTerminationDelayInMsForTesting(long long forceTerminationDelayI
nMs) { m_forceTerminationDelayInMs = forceTerminationDelayInMs; } | 172 void setForceTerminationDelayInMsForTesting(long long forceTerminationDelayI
nMs) { m_forceTerminationDelayInMs = forceTerminationDelayInMs; } |
| 167 | 173 |
| 168 bool m_started = false; | 174 bool m_started = false; |
| 169 bool m_terminated = false; | 175 bool m_terminated = false; |
| 170 bool m_readyToShutdown = false; | 176 bool m_readyToShutdown = false; |
| 171 bool m_pausedInDebugger = false; | 177 bool m_pausedInDebugger = false; |
| 172 bool m_runningDebuggerTask = false; | 178 bool m_runningDebuggerTask = false; |
| 173 ExitCode m_exitCode = ExitCode::NotTerminated; | 179 ExitCode m_exitCode = ExitCode::NotTerminated; |
| 174 | 180 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 194 OwnPtr<WaitableEvent> m_shutdownEvent; | 200 OwnPtr<WaitableEvent> m_shutdownEvent; |
| 195 | 201 |
| 196 // Scheduled when termination starts with TerminationMode::Force, and | 202 // Scheduled when termination starts with TerminationMode::Force, and |
| 197 // cancelled when the worker thread is gracefully shut down. | 203 // cancelled when the worker thread is gracefully shut down. |
| 198 OwnPtr<ForceTerminationTask> m_scheduledForceTerminationTask; | 204 OwnPtr<ForceTerminationTask> m_scheduledForceTerminationTask; |
| 199 }; | 205 }; |
| 200 | 206 |
| 201 } // namespace blink | 207 } // namespace blink |
| 202 | 208 |
| 203 #endif // WorkerThread_h | 209 #endif // WorkerThread_h |
| OLD | NEW |