Chromium Code Reviews| Index: content/utility/utility_main.cc |
| diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc |
| index c93c1eca5366ae0c3c53f75af3de4a88593262fc..0f64c866892f2675992aa819462a0f03558954d5 100644 |
| --- a/content/utility/utility_main.cc |
| +++ b/content/utility/utility_main.cc |
| @@ -17,6 +17,12 @@ |
| #include "sandbox/win/src/sandbox.h" |
| #endif |
| +#if defined(TOOLKIT_GTK) |
| +#include <gtk/gtk.h> |
| + |
| +#include "ui/gfx/gtk_util.h" |
| +#endif |
| + |
| namespace content { |
| // Mainline routine for running as the utility process. |
| @@ -25,9 +31,41 @@ int UtilityMain(const MainFunctionParams& parameters) { |
| base::MessageLoop main_message_loop; |
| base::PlatformThread::SetName("CrUtilityMain"); |
| +#if defined(OS_POSIX) |
| + // The utility process is used to load plugins (see OnLoadPlugins() in |
| + // utility_thread_impl.cc). Some plugins expect the browser to have loaded |
| + // GLib/GTK. |
| + // Due to bugs in GLib we need to initialize GLib/GTK before we start threads, |
| + // see crbug.com/309093. |
| + |
| + bool do_init_gtk = false; |
| + |
| +#if defined(OS_LINUX) |
| + // On Linux, we only initialize GLib/GTK if we're not sandboxed. |
|
jln (very slow on Chromium)
2013/10/22 01:23:55
This is super weird-looking. The utility process r
Jorge Lucangeli Obes
2013/10/22 16:14:54
Well, we do know our cmdline flags, and we use --n
jln (very slow on Chromium)
2013/10/22 16:42:40
It's error prone though. You could have a DCHECK t
Jorge Lucangeli Obes
2013/10/22 17:56:14
Done.
|
| + LinuxSandbox::GetInstance()->PreinitializeSandbox(); |
| + const int sandbox_status = LinuxSandbox::GetInstance()->GetStatus(); |
| + do_init_gtk = !(sandbox_status & kSandboxLinuxSUID); |
| +#endif |
| + |
| +#if defined(TOOLKIT_GTK) |
| + if (do_init_gtk) { |
| + // g_thread_init() is deprecated since glib 2.31.0, please see release note: |
| + // http://mail.gnome.org/archives/gnome-announce-list/2011-October/msg00041.html |
| +#if !(GLIB_CHECK_VERSION(2, 31, 0)) |
| + if (!g_thread_get_initialized()) { |
| + g_thread_init(NULL); |
| + } |
| +#endif |
| + gfx::GtkInitFromCommandLine(*CommandLine::ForCurrentProcess()); |
| + } |
| +#endif |
| +#endif |
| + |
| #if defined(OS_LINUX) |
| - // Initialize the sandbox before any thread is created. |
| - LinuxSandbox::InitializeSandbox(); |
| + // If we didn't initialize GLib/GTK, initialize the sandbox. |
| + if (!do_init_gtk) { |
| + LinuxSandbox::InitializeSandbox(); |
|
jln (very slow on Chromium)
2013/10/22 01:23:55
This is ugly. You should create a "const bool is_s
Jorge Lucangeli Obes
2013/10/22 16:14:54
GTK starts threads, so we actually do need to know
jln (very slow on Chromium)
2013/10/22 16:42:40
I realize, but again, there should be some "logic"
Jorge Lucangeli Obes
2013/10/22 16:58:43
I'm worried that we'll change the BPF policy and t
|
| + } |
| #endif |
| ChildProcess utility_process; |