diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-21 01:12:09 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-21 01:12:09 +0000 |
commit | 363b3b0800174428306597483e0f42ea8f502ad3 (patch) | |
tree | 9cca1044c75f516905893b15c5c5dbde7ae9b0e6 /chrome/browser/browser_process_impl.cc | |
parent | b01998a811ed26bee97b9fb51358235af54a53ac (diff) | |
download | chromium_src-363b3b0800174428306597483e0f42ea8f502ad3.zip chromium_src-363b3b0800174428306597483e0f42ea8f502ad3.tar.gz chromium_src-363b3b0800174428306597483e0f42ea8f502ad3.tar.bz2 |
Linux: move X operations from the IO to UI2 thread.
Currently we perform several X operations on the IO thread including
geometry and clipboard work. This is causing races inside Xlib and
crashing the browser.
These are the result of synchronous calls from the renderer, so we
cannot route these requests to the UI thread without risking deadlock.
Thus we introduce the UI2 thread. This thread has a second connection
to the X server and can perform X operations safely the without UI
thread.
Work remains to be done:
Since we still have the hack where we pass GtkWidget pointers into the
renderer and back, we still have to access these structures from the
IO and UI2 threads. This still needs to be fixed, but this is not the
patch for it.
Also, not all the X calls from the IO thread have been moved over in
this patch; just a few small ones.
http://codereview.chromium.org/67145
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14075 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser_process_impl.cc')
-rw-r--r-- | chrome/browser/browser_process_impl.cc | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 5e1d9f3..5b7b6b6 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc @@ -171,6 +171,11 @@ BrowserProcessImpl::~BrowserProcessImpl() { io_thread_->message_loop()->PostTask(FROM_HERE, NewRunnableFunction(chrome_browser_net::EnsureDnsPrefetchShutdown)); +#if defined(OS_LINUX) + // The IO thread must outlive the BACKGROUND_X11 thread. + background_x11_thread_.reset(); +#endif + // Need to stop io_thread_ before resource_dispatcher_host_, since // io_thread_ may still deref ResourceDispatcherHost and handle resource // request before going away. @@ -284,6 +289,16 @@ void BrowserProcessImpl::CreateIOThread() { // invoke the io_thread() accessor. PluginService::GetInstance(); +#if defined(OS_LINUX) + // The lifetime of the BACKGROUND_X11 thread is a subset of the IO thread so + // we start it now. + scoped_ptr<base::Thread> background_x11_thread( + new BrowserProcessSubThread(ChromeThread::BACKGROUND_X11)); + if (!background_x11_thread->Start()) + return; + background_x11_thread_.swap(background_x11_thread); +#endif + scoped_ptr<base::Thread> thread( new BrowserProcessSubThread(ChromeThread::IO)); base::Thread::Options options; |