| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ios/web/web_thread_impl.h" | 5 #include "ios/web/web_thread_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/atomicops.h" | 9 #include "base/atomicops.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "base/run_loop.h" |
| 15 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
| 16 #include "base/threading/sequenced_worker_pool.h" | 17 #include "base/threading/sequenced_worker_pool.h" |
| 17 #include "base/threading/thread_restrictions.h" | 18 #include "base/threading/thread_restrictions.h" |
| 18 #include "ios/web/public/web_thread_delegate.h" | 19 #include "ios/web/public/web_thread_delegate.h" |
| 19 #include "net/disk_cache/simple/simple_backend_impl.h" | 20 #include "net/disk_cache/simple/simple_backend_impl.h" |
| 20 #include "net/url_request/url_fetcher.h" | 21 #include "net/url_request/url_fetcher.h" |
| 21 | 22 |
| 22 namespace web { | 23 namespace web { |
| 23 | 24 |
| 24 namespace { | 25 namespace { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 | 162 |
| 162 if (WebThread::CurrentlyOn(WebThread::IO)) { | 163 if (WebThread::CurrentlyOn(WebThread::IO)) { |
| 163 // Though this thread is called the "IO" thread, it actually just routes | 164 // Though this thread is called the "IO" thread, it actually just routes |
| 164 // messages around; it shouldn't be allowed to perform any blocking disk | 165 // messages around; it shouldn't be allowed to perform any blocking disk |
| 165 // I/O. | 166 // I/O. |
| 166 base::ThreadRestrictions::SetIOAllowed(false); | 167 base::ThreadRestrictions::SetIOAllowed(false); |
| 167 base::ThreadRestrictions::DisallowWaiting(); | 168 base::ThreadRestrictions::DisallowWaiting(); |
| 168 } | 169 } |
| 169 } | 170 } |
| 170 | 171 |
| 171 NOINLINE void WebThreadImpl::UIThreadRun(base::MessageLoop* message_loop) { | 172 NOINLINE void WebThreadImpl::UIThreadRun(base::RunLoop* run_loop) { |
| 172 volatile int line_number = __LINE__; | 173 volatile int line_number = __LINE__; |
| 173 Thread::Run(message_loop); | 174 Thread::Run(run_loop); |
| 174 CHECK_GT(line_number, 0); | 175 CHECK_GT(line_number, 0); |
| 175 } | 176 } |
| 176 | 177 |
| 177 NOINLINE void WebThreadImpl::DBThreadRun(base::MessageLoop* message_loop) { | 178 NOINLINE void WebThreadImpl::DBThreadRun(base::RunLoop* run_loop) { |
| 178 volatile int line_number = __LINE__; | 179 volatile int line_number = __LINE__; |
| 179 Thread::Run(message_loop); | 180 Thread::Run(run_loop); |
| 180 CHECK_GT(line_number, 0); | 181 CHECK_GT(line_number, 0); |
| 181 } | 182 } |
| 182 | 183 |
| 183 NOINLINE void WebThreadImpl::FileThreadRun(base::MessageLoop* message_loop) { | 184 NOINLINE void WebThreadImpl::FileThreadRun(base::RunLoop* run_loop) { |
| 184 volatile int line_number = __LINE__; | 185 volatile int line_number = __LINE__; |
| 185 Thread::Run(message_loop); | 186 Thread::Run(run_loop); |
| 186 CHECK_GT(line_number, 0); | 187 CHECK_GT(line_number, 0); |
| 187 } | 188 } |
| 188 | 189 |
| 189 NOINLINE void WebThreadImpl::FileUserBlockingThreadRun( | 190 NOINLINE void WebThreadImpl::FileUserBlockingThreadRun( |
| 190 base::MessageLoop* message_loop) { | 191 base::RunLoop* run_loop) { |
| 191 volatile int line_number = __LINE__; | 192 volatile int line_number = __LINE__; |
| 192 Thread::Run(message_loop); | 193 Thread::Run(run_loop); |
| 193 CHECK_GT(line_number, 0); | 194 CHECK_GT(line_number, 0); |
| 194 } | 195 } |
| 195 | 196 |
| 196 NOINLINE void WebThreadImpl::CacheThreadRun(base::MessageLoop* message_loop) { | 197 NOINLINE void WebThreadImpl::CacheThreadRun(base::RunLoop* run_loop) { |
| 197 volatile int line_number = __LINE__; | 198 volatile int line_number = __LINE__; |
| 198 Thread::Run(message_loop); | 199 Thread::Run(run_loop); |
| 199 CHECK_GT(line_number, 0); | 200 CHECK_GT(line_number, 0); |
| 200 } | 201 } |
| 201 | 202 |
| 202 NOINLINE void WebThreadImpl::IOThreadRun(base::MessageLoop* message_loop) { | 203 NOINLINE void WebThreadImpl::IOThreadRun(base::RunLoop* run_loop) { |
| 203 volatile int line_number = __LINE__; | 204 volatile int line_number = __LINE__; |
| 204 Thread::Run(message_loop); | 205 Thread::Run(run_loop); |
| 205 CHECK_GT(line_number, 0); | 206 CHECK_GT(line_number, 0); |
| 206 } | 207 } |
| 207 | 208 |
| 208 void WebThreadImpl::Run(base::MessageLoop* message_loop) { | 209 void WebThreadImpl::Run(base::RunLoop* run_loop) { |
| 209 WebThread::ID thread_id = ID_COUNT; | 210 WebThread::ID thread_id = ID_COUNT; |
| 210 if (!GetCurrentThreadIdentifier(&thread_id)) | 211 if (!GetCurrentThreadIdentifier(&thread_id)) |
| 211 return Thread::Run(message_loop); | 212 return Thread::Run(run_loop); |
| 212 | 213 |
| 213 switch (thread_id) { | 214 switch (thread_id) { |
| 214 case WebThread::UI: | 215 case WebThread::UI: |
| 215 return UIThreadRun(message_loop); | 216 return UIThreadRun(run_loop); |
| 216 case WebThread::DB: | 217 case WebThread::DB: |
| 217 return DBThreadRun(message_loop); | 218 return DBThreadRun(run_loop); |
| 218 case WebThread::FILE: | 219 case WebThread::FILE: |
| 219 return FileThreadRun(message_loop); | 220 return FileThreadRun(run_loop); |
| 220 case WebThread::FILE_USER_BLOCKING: | 221 case WebThread::FILE_USER_BLOCKING: |
| 221 return FileUserBlockingThreadRun(message_loop); | 222 return FileUserBlockingThreadRun(run_loop); |
| 222 case WebThread::CACHE: | 223 case WebThread::CACHE: |
| 223 return CacheThreadRun(message_loop); | 224 return CacheThreadRun(run_loop); |
| 224 case WebThread::IO: | 225 case WebThread::IO: |
| 225 return IOThreadRun(message_loop); | 226 return IOThreadRun(run_loop); |
| 226 case WebThread::ID_COUNT: | 227 case WebThread::ID_COUNT: |
| 227 CHECK(false); // This shouldn't actually be reached! | 228 CHECK(false); // This shouldn't actually be reached! |
| 228 break; | 229 break; |
| 229 } | 230 } |
| 230 Thread::Run(message_loop); | 231 Thread::Run(run_loop); |
| 231 } | 232 } |
| 232 | 233 |
| 233 void WebThreadImpl::CleanUp() { | 234 void WebThreadImpl::CleanUp() { |
| 234 if (WebThread::CurrentlyOn(WebThread::IO)) | 235 if (WebThread::CurrentlyOn(WebThread::IO)) |
| 235 IOThreadPreCleanUp(); | 236 IOThreadPreCleanUp(); |
| 236 | 237 |
| 237 WebThreadGlobals& globals = g_globals.Get(); | 238 WebThreadGlobals& globals = g_globals.Get(); |
| 238 | 239 |
| 239 using base::subtle::AtomicWord; | 240 using base::subtle::AtomicWord; |
| 240 AtomicWord* storage = | 241 AtomicWord* storage = |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 AtomicWord* storage = | 496 AtomicWord* storage = |
| 496 reinterpret_cast<AtomicWord*>(&globals.thread_delegates[identifier]); | 497 reinterpret_cast<AtomicWord*>(&globals.thread_delegates[identifier]); |
| 497 AtomicWord old_pointer = base::subtle::NoBarrier_AtomicExchange( | 498 AtomicWord old_pointer = base::subtle::NoBarrier_AtomicExchange( |
| 498 storage, reinterpret_cast<AtomicWord>(delegate)); | 499 storage, reinterpret_cast<AtomicWord>(delegate)); |
| 499 | 500 |
| 500 // This catches registration when previously registered. | 501 // This catches registration when previously registered. |
| 501 DCHECK(!delegate || !old_pointer); | 502 DCHECK(!delegate || !old_pointer); |
| 502 } | 503 } |
| 503 | 504 |
| 504 } // namespace web | 505 } // namespace web |
| OLD | NEW |