| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/browser/browser_thread.h" | 5 #include "chrome/browser/browser_thread.h" |
| 6 | 6 |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/message_loop_proxy.h" | 8 #include "base/message_loop_proxy.h" |
| 9 #include "base/threading/thread_restrictions.h" | 9 #include "base/threading/thread_restrictions.h" |
| 10 | 10 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 virtual bool BelongsToCurrentThread() { | 56 virtual bool BelongsToCurrentThread() { |
| 57 return BrowserThread::CurrentlyOn(id_); | 57 return BrowserThread::CurrentlyOn(id_); |
| 58 } | 58 } |
| 59 | 59 |
| 60 private: | 60 private: |
| 61 BrowserThread::ID id_; | 61 BrowserThread::ID id_; |
| 62 DISALLOW_COPY_AND_ASSIGN(BrowserThreadMessageLoopProxy); | 62 DISALLOW_COPY_AND_ASSIGN(BrowserThreadMessageLoopProxy); |
| 63 }; | 63 }; |
| 64 | 64 |
| 65 | 65 |
| 66 Lock BrowserThread::lock_; | 66 base::Lock BrowserThread::lock_; |
| 67 | 67 |
| 68 BrowserThread* BrowserThread::browser_threads_[ID_COUNT]; | 68 BrowserThread* BrowserThread::browser_threads_[ID_COUNT]; |
| 69 | 69 |
| 70 BrowserThread::BrowserThread(BrowserThread::ID identifier) | 70 BrowserThread::BrowserThread(BrowserThread::ID identifier) |
| 71 : Thread(browser_thread_names[identifier]), | 71 : Thread(browser_thread_names[identifier]), |
| 72 identifier_(identifier) { | 72 identifier_(identifier) { |
| 73 Initialize(); | 73 Initialize(); |
| 74 } | 74 } |
| 75 | 75 |
| 76 BrowserThread::BrowserThread(ID identifier, MessageLoop* message_loop) | 76 BrowserThread::BrowserThread(ID identifier, MessageLoop* message_loop) |
| 77 : Thread(message_loop->thread_name().c_str()), | 77 : Thread(message_loop->thread_name().c_str()), |
| 78 identifier_(identifier) { | 78 identifier_(identifier) { |
| 79 set_message_loop(message_loop); | 79 set_message_loop(message_loop); |
| 80 Initialize(); | 80 Initialize(); |
| 81 } | 81 } |
| 82 | 82 |
| 83 void BrowserThread::Initialize() { | 83 void BrowserThread::Initialize() { |
| 84 AutoLock lock(lock_); | 84 base::AutoLock lock(lock_); |
| 85 DCHECK(identifier_ >= 0 && identifier_ < ID_COUNT); | 85 DCHECK(identifier_ >= 0 && identifier_ < ID_COUNT); |
| 86 DCHECK(browser_threads_[identifier_] == NULL); | 86 DCHECK(browser_threads_[identifier_] == NULL); |
| 87 browser_threads_[identifier_] = this; | 87 browser_threads_[identifier_] = this; |
| 88 } | 88 } |
| 89 | 89 |
| 90 BrowserThread::~BrowserThread() { | 90 BrowserThread::~BrowserThread() { |
| 91 // Stop the thread here, instead of the parent's class destructor. This is so | 91 // Stop the thread here, instead of the parent's class destructor. This is so |
| 92 // that if there are pending tasks that run, code that checks that it's on the | 92 // that if there are pending tasks that run, code that checks that it's on the |
| 93 // correct BrowserThread succeeds. | 93 // correct BrowserThread succeeds. |
| 94 Stop(); | 94 Stop(); |
| 95 | 95 |
| 96 AutoLock lock(lock_); | 96 base::AutoLock lock(lock_); |
| 97 browser_threads_[identifier_] = NULL; | 97 browser_threads_[identifier_] = NULL; |
| 98 #ifndef NDEBUG | 98 #ifndef NDEBUG |
| 99 // Double check that the threads are ordered correctly in the enumeration. | 99 // Double check that the threads are ordered correctly in the enumeration. |
| 100 for (int i = identifier_ + 1; i < ID_COUNT; ++i) { | 100 for (int i = identifier_ + 1; i < ID_COUNT; ++i) { |
| 101 DCHECK(!browser_threads_[i]) << | 101 DCHECK(!browser_threads_[i]) << |
| 102 "Threads must be listed in the reverse order that they die"; | 102 "Threads must be listed in the reverse order that they die"; |
| 103 } | 103 } |
| 104 #endif | 104 #endif |
| 105 } | 105 } |
| 106 | 106 |
| 107 // static | 107 // static |
| 108 bool BrowserThread::IsWellKnownThread(ID identifier) { | 108 bool BrowserThread::IsWellKnownThread(ID identifier) { |
| 109 AutoLock lock(lock_); | 109 base::AutoLock lock(lock_); |
| 110 return (identifier >= 0 && identifier < ID_COUNT && | 110 return (identifier >= 0 && identifier < ID_COUNT && |
| 111 browser_threads_[identifier]); | 111 browser_threads_[identifier]); |
| 112 } | 112 } |
| 113 | 113 |
| 114 // static | 114 // static |
| 115 bool BrowserThread::CurrentlyOn(ID identifier) { | 115 bool BrowserThread::CurrentlyOn(ID identifier) { |
| 116 // We shouldn't use MessageLoop::current() since it uses LazyInstance which | 116 // We shouldn't use MessageLoop::current() since it uses LazyInstance which |
| 117 // may be deleted by ~AtExitManager when a WorkerPool thread calls this | 117 // may be deleted by ~AtExitManager when a WorkerPool thread calls this |
| 118 // function. | 118 // function. |
| 119 // http://crbug.com/63678 | 119 // http://crbug.com/63678 |
| 120 base::ThreadRestrictions::ScopedAllowSingleton allow_singleton; | 120 base::ThreadRestrictions::ScopedAllowSingleton allow_singleton; |
| 121 AutoLock lock(lock_); | 121 base::AutoLock lock(lock_); |
| 122 DCHECK(identifier >= 0 && identifier < ID_COUNT); | 122 DCHECK(identifier >= 0 && identifier < ID_COUNT); |
| 123 return browser_threads_[identifier] && | 123 return browser_threads_[identifier] && |
| 124 browser_threads_[identifier]->message_loop() == MessageLoop::current(); | 124 browser_threads_[identifier]->message_loop() == MessageLoop::current(); |
| 125 } | 125 } |
| 126 | 126 |
| 127 // static | 127 // static |
| 128 bool BrowserThread::IsMessageLoopValid(ID identifier) { | 128 bool BrowserThread::IsMessageLoopValid(ID identifier) { |
| 129 AutoLock lock(lock_); | 129 base::AutoLock lock(lock_); |
| 130 DCHECK(identifier >= 0 && identifier < ID_COUNT); | 130 DCHECK(identifier >= 0 && identifier < ID_COUNT); |
| 131 return browser_threads_[identifier] && | 131 return browser_threads_[identifier] && |
| 132 browser_threads_[identifier]->message_loop(); | 132 browser_threads_[identifier]->message_loop(); |
| 133 } | 133 } |
| 134 | 134 |
| 135 // static | 135 // static |
| 136 bool BrowserThread::PostTask(ID identifier, | 136 bool BrowserThread::PostTask(ID identifier, |
| 137 const tracked_objects::Location& from_here, | 137 const tracked_objects::Location& from_here, |
| 138 Task* task) { | 138 Task* task) { |
| 139 return PostTaskHelper(identifier, from_here, task, 0, true); | 139 return PostTaskHelper(identifier, from_here, task, 0, true); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 } | 224 } |
| 225 } else { | 225 } else { |
| 226 delete task; | 226 delete task; |
| 227 } | 227 } |
| 228 | 228 |
| 229 if (!guaranteed_to_outlive_target_thread) | 229 if (!guaranteed_to_outlive_target_thread) |
| 230 lock_.Release(); | 230 lock_.Release(); |
| 231 | 231 |
| 232 return !!message_loop; | 232 return !!message_loop; |
| 233 } | 233 } |
| OLD | NEW |