Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(849)

Unified Diff: content/browser/browser_thread_impl.cc

Issue 2558943002: Explicitly make BrowserThread::SetDelegate specific to the IO thread. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/io_thread.cc ('k') | content/public/browser/browser_thread.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/browser_thread_impl.cc
diff --git a/content/browser/browser_thread_impl.cc b/content/browser/browser_thread_impl.cc
index 18eff7c8672e37ecf83381b566474c4d75fc9af3..72345852c0f5e7e64f5c3d501839dda16748c5e5 100644
--- a/content/browser/browser_thread_impl.cc
+++ b/content/browser/browser_thread_impl.cc
@@ -99,6 +99,8 @@ struct BrowserThreadTaskRunners {
base::LazyInstance<BrowserThreadTaskRunners>::Leaky g_task_runners =
LAZY_INSTANCE_INITIALIZER;
+using BrowserThreadDelegateAtomicPtr = base::subtle::AtomicWord;
+
struct BrowserThreadGlobals {
BrowserThreadGlobals()
: blocking_pool(
@@ -107,8 +109,6 @@ struct BrowserThreadGlobals {
base::TaskPriority::USER_VISIBLE)) {
memset(threads, 0, BrowserThread::ID_COUNT * sizeof(threads[0]));
memset(thread_ids, 0, BrowserThread::ID_COUNT * sizeof(thread_ids[0]));
- memset(thread_delegates, 0,
- BrowserThread::ID_COUNT * sizeof(thread_delegates[0]));
}
// This lock protects |threads| and |thread_ids|. Do not read or modify those
@@ -125,9 +125,10 @@ struct BrowserThreadGlobals {
// array upon destruction.
BrowserThreadImpl* threads[BrowserThread::ID_COUNT];
- // Only atomic operations are used on this array. The delegates are not owned
- // by this array, rather by whoever calls BrowserThread::SetDelegate.
- BrowserThreadDelegate* thread_delegates[BrowserThread::ID_COUNT];
+ // Only atomic operations are used on this pointer. The delegate isn't owned
+ // by BrowserThreadGlobals, rather by whoever calls
+ // BrowserThread::SetIOThreadDelegate.
+ BrowserThreadDelegateAtomicPtr io_thread_delegate = 0;
const scoped_refptr<base::SequencedWorkerPool> blocking_pool;
};
@@ -185,24 +186,22 @@ void BrowserThreadImpl::FlushThreadPoolHelperForTesting() {
void BrowserThreadImpl::Init() {
BrowserThreadGlobals& globals = g_globals.Get();
- if (BrowserThread::CurrentlyOn(BrowserThread::DB) ||
- BrowserThread::CurrentlyOn(BrowserThread::FILE) ||
- BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING) ||
- BrowserThread::CurrentlyOn(BrowserThread::PROCESS_LAUNCHER) ||
- BrowserThread::CurrentlyOn(BrowserThread::CACHE)) {
+ if (identifier_ == BrowserThread::DB ||
+ identifier_ == BrowserThread::FILE ||
+ identifier_ == BrowserThread::FILE_USER_BLOCKING ||
+ identifier_ == BrowserThread::PROCESS_LAUNCHER ||
+ identifier_ == BrowserThread::CACHE) {
base::MessageLoop* message_loop = base::MessageLoop::current();
message_loop->DisallowNesting();
message_loop->DisallowTaskObservers();
}
- using base::subtle::AtomicWord;
- AtomicWord* storage =
- reinterpret_cast<AtomicWord*>(&globals.thread_delegates[identifier_]);
- AtomicWord stored_pointer = base::subtle::NoBarrier_Load(storage);
- BrowserThreadDelegate* delegate =
- reinterpret_cast<BrowserThreadDelegate*>(stored_pointer);
- if (delegate)
- delegate->Init();
+ if (identifier_ == BrowserThread::IO) {
+ BrowserThreadDelegateAtomicPtr delegate =
+ base::subtle::NoBarrier_Load(&globals.io_thread_delegate);
+ if (delegate)
+ reinterpret_cast<BrowserThreadDelegate*>(delegate)->Init();
+ }
}
// We disable optimizations for this block of functions so the compiler doesn't
@@ -299,15 +298,12 @@ void BrowserThreadImpl::Run(base::RunLoop* run_loop) {
void BrowserThreadImpl::CleanUp() {
BrowserThreadGlobals& globals = g_globals.Get();
- using base::subtle::AtomicWord;
- AtomicWord* storage =
- reinterpret_cast<AtomicWord*>(&globals.thread_delegates[identifier_]);
- AtomicWord stored_pointer = base::subtle::NoBarrier_Load(storage);
- BrowserThreadDelegate* delegate =
- reinterpret_cast<BrowserThreadDelegate*>(stored_pointer);
-
- if (delegate)
- delegate->CleanUp();
+ if (identifier_ == BrowserThread::IO) {
+ BrowserThreadDelegateAtomicPtr delegate =
+ base::subtle::NoBarrier_Load(&globals.io_thread_delegate);
+ if (delegate)
+ reinterpret_cast<BrowserThreadDelegate*>(delegate)->CleanUp();
+ }
// PostTaskHelper() accesses the message loop while holding this lock.
// However, the message loop will soon be destructed without any locking. So
@@ -571,17 +567,16 @@ BrowserThread::GetTaskRunnerForThread(ID identifier) {
return g_task_runners.Get().proxies[identifier];
}
-void BrowserThread::SetDelegate(ID identifier,
- BrowserThreadDelegate* delegate) {
- using base::subtle::AtomicWord;
+// static
+void BrowserThread::SetIOThreadDelegate(BrowserThreadDelegate* delegate) {
BrowserThreadGlobals& globals = g_globals.Get();
- AtomicWord* storage = reinterpret_cast<AtomicWord*>(
- &globals.thread_delegates[identifier]);
- AtomicWord old_pointer = base::subtle::NoBarrier_AtomicExchange(
- storage, reinterpret_cast<AtomicWord>(delegate));
+ BrowserThreadDelegateAtomicPtr old_delegate =
+ base::subtle::NoBarrier_AtomicExchange(
+ &globals.io_thread_delegate,
+ reinterpret_cast<BrowserThreadDelegateAtomicPtr>(delegate));
// This catches registration when previously registered.
- DCHECK(!delegate || !old_pointer);
+ DCHECK(!delegate || !old_delegate);
}
} // namespace content
« no previous file with comments | « chrome/browser/io_thread.cc ('k') | content/public/browser/browser_thread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698