Index: content/browser/browser_thread_impl.cc |
diff --git a/content/browser/browser_thread_impl.cc b/content/browser/browser_thread_impl.cc |
index 78e3836dadeef038f5db6e1a7fd0b1a3352fd8b6..1aac305bcb8b2a05e247276c36b77c54e9e98c34 100644 |
--- a/content/browser/browser_thread_impl.cc |
+++ b/content/browser/browser_thread_impl.cc |
@@ -159,14 +159,8 @@ void BrowserThreadImpl::Init() { |
AtomicWord stored_pointer = base::subtle::NoBarrier_Load(storage); |
BrowserThreadDelegate* delegate = |
reinterpret_cast<BrowserThreadDelegate*>(stored_pointer); |
- if (delegate) { |
+ if (delegate) |
delegate->Init(); |
- message_loop()->PostTask(FROM_HERE, |
- base::Bind(&BrowserThreadDelegate::InitAsync, |
- // Delegate is expected to exist for the |
- // duration of the thread's lifetime |
- base::Unretained(delegate))); |
- } |
} |
// We disable optimizations for this block of functions so the compiler doesn't |
@@ -300,6 +294,15 @@ BrowserThreadImpl::~BrowserThreadImpl() { |
#endif |
} |
+bool BrowserThreadImpl::StartWithOptions(const Options& options) { |
+ // The global thread table needs to be locked while a new thread is |
+ // starting, as the new thread can asynchronously start touching the |
+ // table (and other thread's message_loop). |
+ BrowserThreadGlobals& globals = g_globals.Get(); |
+ base::AutoLock lock(globals.lock); |
+ return Thread::StartWithOptions(options); |
+} |
+ |
// static |
bool BrowserThreadImpl::PostTaskHelper( |
BrowserThread::ID identifier, |