OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 } | 94 } |
95 private: | 95 private: |
96 WTF::MainThreadFunction* m_function; | 96 WTF::MainThreadFunction* m_function; |
97 void* m_context; | 97 void* m_context; |
98 }; | 98 }; |
99 | 99 |
100 } // namespace | 100 } // namespace |
101 | 101 |
102 static WebThread::TaskObserver* s_endOfTaskRunner = 0; | 102 static WebThread::TaskObserver* s_endOfTaskRunner = 0; |
103 static WebThread::TaskObserver* s_pendingGCRunner = 0; | 103 static WebThread::TaskObserver* s_pendingGCRunner = 0; |
104 static ThreadState::Interruptor* s_messageLoopInterruptor = 0; | |
105 static ThreadState::Interruptor* s_isolateInterruptor = 0; | |
106 | 104 |
107 // Make sure we are not re-initialized in the same address space. | 105 // Make sure we are not re-initialized in the same address space. |
108 // Doing so may cause hard to reproduce crashes. | 106 // Doing so may cause hard to reproduce crashes. |
109 static bool s_webKitInitialized = false; | 107 static bool s_webKitInitialized = false; |
110 | 108 |
111 void initialize(Platform* platform) | 109 void initialize(Platform* platform) |
112 { | 110 { |
113 initializeWithoutV8(platform); | 111 initializeWithoutV8(platform); |
114 | 112 |
115 V8Initializer::initializeMainThreadIfNeeded(); | 113 V8Initializer::initializeMainThreadIfNeeded(); |
116 | 114 |
117 s_isolateInterruptor = new V8IsolateInterruptor(V8PerIsolateData::mainThread
Isolate()); | 115 OwnPtr<V8IsolateInterruptor> interruptor = adoptPtr(new V8IsolateInterruptor
(V8PerIsolateData::mainThreadIsolate())); |
118 ThreadState::current()->addInterruptor(s_isolateInterruptor); | 116 ThreadState::current()->addInterruptor(interruptor.release()); |
119 ThreadState::current()->registerTraceDOMWrappers(V8PerIsolateData::mainThrea
dIsolate(), V8GCController::traceDOMWrappers); | 117 ThreadState::current()->registerTraceDOMWrappers(V8PerIsolateData::mainThrea
dIsolate(), V8GCController::traceDOMWrappers); |
120 | 118 |
121 // currentThread is null if we are running on a thread without a message loo
p. | 119 // currentThread is null if we are running on a thread without a message loo
p. |
122 if (WebThread* currentThread = platform->currentThread()) { | 120 if (WebThread* currentThread = platform->currentThread()) { |
123 ASSERT(!s_endOfTaskRunner); | 121 ASSERT(!s_endOfTaskRunner); |
124 s_endOfTaskRunner = new EndOfTaskRunner; | 122 s_endOfTaskRunner = new EndOfTaskRunner; |
125 currentThread->addTaskObserver(s_endOfTaskRunner); | 123 currentThread->addTaskObserver(s_endOfTaskRunner); |
126 } | 124 } |
127 } | 125 } |
128 | 126 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 WTF::initializeMainThread(callOnMainThreadFunction); | 177 WTF::initializeMainThread(callOnMainThreadFunction); |
180 Heap::init(); | 178 Heap::init(); |
181 | 179 |
182 ThreadState::attachMainThread(); | 180 ThreadState::attachMainThread(); |
183 // currentThread() is null if we are running on a thread without a message l
oop. | 181 // currentThread() is null if we are running on a thread without a message l
oop. |
184 if (WebThread* currentThread = platform->currentThread()) { | 182 if (WebThread* currentThread = platform->currentThread()) { |
185 ASSERT(!s_pendingGCRunner); | 183 ASSERT(!s_pendingGCRunner); |
186 s_pendingGCRunner = new PendingGCRunner; | 184 s_pendingGCRunner = new PendingGCRunner; |
187 currentThread->addTaskObserver(s_pendingGCRunner); | 185 currentThread->addTaskObserver(s_pendingGCRunner); |
188 | 186 |
189 ASSERT(!s_messageLoopInterruptor); | 187 OwnPtr<MessageLoopInterruptor> interruptor = adoptPtr(new MessageLoopInt
erruptor(currentThread)); |
190 s_messageLoopInterruptor = new MessageLoopInterruptor(currentThread); | 188 ThreadState::current()->addInterruptor(interruptor.release()); |
191 ThreadState::current()->addInterruptor(s_messageLoopInterruptor); | |
192 } | 189 } |
193 | 190 |
194 DEFINE_STATIC_LOCAL(ModulesInitializer, initializer, ()); | 191 DEFINE_STATIC_LOCAL(ModulesInitializer, initializer, ()); |
195 initializer.init(); | 192 initializer.init(); |
196 | 193 |
197 setIndexedDBClientCreateFunction(IndexedDBClientImpl::create); | 194 setIndexedDBClientCreateFunction(IndexedDBClientImpl::create); |
198 } | 195 } |
199 | 196 |
200 void shutdown() | 197 void shutdown() |
201 { | 198 { |
202 // currentThread() is null if we are running on a thread without a message l
oop. | 199 // currentThread() is null if we are running on a thread without a message l
oop. |
203 if (Platform::current()->currentThread()) { | 200 if (Platform::current()->currentThread()) { |
204 // We don't need to (cannot) remove s_endOfTaskRunner from the current | 201 // We don't need to (cannot) remove s_endOfTaskRunner from the current |
205 // message loop, because the message loop is already destructed before | 202 // message loop, because the message loop is already destructed before |
206 // the shutdown() is called. | 203 // the shutdown() is called. |
207 delete s_endOfTaskRunner; | 204 delete s_endOfTaskRunner; |
208 s_endOfTaskRunner = 0; | 205 s_endOfTaskRunner = 0; |
209 } | 206 } |
210 | 207 |
211 ASSERT(s_isolateInterruptor); | |
212 ThreadState::current()->removeInterruptor(s_isolateInterruptor); | |
213 | |
214 // currentThread() is null if we are running on a thread without a message l
oop. | 208 // currentThread() is null if we are running on a thread without a message l
oop. |
215 if (Platform::current()->currentThread()) { | 209 if (Platform::current()->currentThread()) { |
216 ASSERT(s_pendingGCRunner); | 210 ASSERT(s_pendingGCRunner); |
217 delete s_pendingGCRunner; | 211 delete s_pendingGCRunner; |
218 s_pendingGCRunner = 0; | 212 s_pendingGCRunner = 0; |
219 | |
220 ASSERT(s_messageLoopInterruptor); | |
221 ThreadState::current()->removeInterruptor(s_messageLoopInterruptor); | |
222 delete s_messageLoopInterruptor; | |
223 s_messageLoopInterruptor = 0; | |
224 } | 213 } |
225 | 214 |
226 // Shutdown V8-related background threads before V8 is ramped down. Note | 215 // Shutdown V8-related background threads before V8 is ramped down. Note |
227 // that this will wait the thread to stop its operations. | 216 // that this will wait the thread to stop its operations. |
228 ScriptStreamerThread::shutdown(); | 217 ScriptStreamerThread::shutdown(); |
229 | 218 |
230 v8::Isolate* isolate = V8PerIsolateData::mainThreadIsolate(); | 219 v8::Isolate* isolate = V8PerIsolateData::mainThreadIsolate(); |
231 V8PerIsolateData::willBeDestroyed(isolate); | 220 V8PerIsolateData::willBeDestroyed(isolate); |
232 | 221 |
233 // Make sure we stop WorkerThreads before the main thread's ThreadState | 222 // Make sure we stop WorkerThreads before the main thread's ThreadState |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 ASSERT(!reloadPages); | 279 ASSERT(!reloadPages); |
291 Page::refreshPlugins(); | 280 Page::refreshPlugins(); |
292 } | 281 } |
293 | 282 |
294 void decommitFreeableMemory() | 283 void decommitFreeableMemory() |
295 { | 284 { |
296 WTF::Partitions::decommitFreeableMemory(); | 285 WTF::Partitions::decommitFreeableMemory(); |
297 } | 286 } |
298 | 287 |
299 } // namespace blink | 288 } // namespace blink |
OLD | NEW |