diff options
author | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 07:45:36 +0000 |
---|---|---|
committer | scottmg@chromium.org <scottmg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-16 07:45:36 +0000 |
commit | d7a2d89aee556017139f6bea76e328423e60277d (patch) | |
tree | 018c1358276c3c551e888568f1a0e19ab840da25 /content/utility | |
parent | ed522c341e491b8aad34f3ac2d9c06669971627e (diff) | |
download | chromium_src-d7a2d89aee556017139f6bea76e328423e60277d.zip chromium_src-d7a2d89aee556017139f6bea76e328423e60277d.tar.gz chromium_src-d7a2d89aee556017139f6bea76e328423e60277d.tar.bz2 |
Set up content in-process main threads via factory
This code was previously #ifdef'd out based on CHROME_MULTIPLE_DLL. This works
for chrome, but not for test targets which link content_browser. content_browser
needs to not link against child-only targets (as they'll cause linking blink
into the browser dll).
Instead of having utility_process_host_impl, et al. own the in-process
implementation, use a factory to create them that's installed in test code, and
in chrome for supporting --single-process.
At the same time, remove the global CHROME_MULTIPLE_DLL define and localize it
to chrome_exe.gypi because it's too easy to use incorrectly.
TBR=darin
R=piman@chromium.org,jam@chromium.org
BUG=237249
Review URL: https://chromiumcodereview.appspot.com/23235002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217968 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/utility')
-rw-r--r-- | content/utility/utility_main_thread.cc | 50 | ||||
-rw-r--r-- | content/utility/utility_main_thread.h | 40 |
2 files changed, 90 insertions, 0 deletions
diff --git a/content/utility/utility_main_thread.cc b/content/utility/utility_main_thread.cc new file mode 100644 index 0000000..7d97399 --- /dev/null +++ b/content/utility/utility_main_thread.cc @@ -0,0 +1,50 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/utility/utility_main_thread.h" + +#include "content/child/child_process.h" +#include "content/utility/utility_thread_impl.h" + +namespace content { + +// We want to ensure there's only one utility thread running at a time, as there +// are many globals used in the utility process. +static base::LazyInstance<base::Lock> g_one_utility_thread_lock; + +UtilityMainThread::UtilityMainThread(const std::string& channel_id) + : Thread("Chrome_InProcUtilityThread"), channel_id_(channel_id) { +} + +UtilityMainThread::~UtilityMainThread() { + Stop(); +} + +void UtilityMainThread::Init() { + // We need to return right away or else the main thread that started us will + // hang. + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&UtilityMainThread::InitInternal, base::Unretained(this))); +} + +void UtilityMainThread::CleanUp() { + child_process_.reset(); + + // See comment in RendererMainThread. + SetThreadWasQuitProperly(true); + g_one_utility_thread_lock.Get().Release(); +} + +void UtilityMainThread::InitInternal() { + g_one_utility_thread_lock.Get().Acquire(); + child_process_.reset(new ChildProcess()); + child_process_->set_main_thread(new UtilityThreadImpl(channel_id_)); +} + +base::Thread* CreateUtilityMainThread(const std::string& channel_id) { + return new UtilityMainThread(channel_id); +} + +} // namespace content diff --git a/content/utility/utility_main_thread.h b/content/utility/utility_main_thread.h new file mode 100644 index 0000000..43e22b7 --- /dev/null +++ b/content/utility/utility_main_thread.h @@ -0,0 +1,40 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_UTILITY_UTILITY_MAIN_THREAD_H_ +#define CONTENT_UTILITY_UTILITY_MAIN_THREAD_H_ + +#include <string> + +#include "base/threading/thread.h" +#include "content/common/content_export.h" + +namespace content { + +class ChildProcess; + +class UtilityMainThread : public base::Thread { + public: + UtilityMainThread(const std::string& channel_id); + virtual ~UtilityMainThread(); + private: + + // base::Thread implementation: + virtual void Init() OVERRIDE; + virtual void CleanUp() OVERRIDE; + + void InitInternal(); + + std::string channel_id_; + scoped_ptr<ChildProcess> child_process_; + + DISALLOW_COPY_AND_ASSIGN(UtilityMainThread); +}; + +CONTENT_EXPORT base::Thread* CreateUtilityMainThread( + const std::string& channel_id); + +} // namespace content + +#endif // CONTENT_UTILITY_UTILITY_MAIN_THREAD_H_ |