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

Unified Diff: content/child/child_process.cc

Issue 17741010: Make ChildThread::current() and ChildProcess::current() only work on the main thread of the child... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: sync and also fix gpu single process case Created 7 years, 6 months 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
Index: content/child/child_process.cc
===================================================================
--- content/child/child_process.cc (revision 208740)
+++ content/child/child_process.cc (working copy)
@@ -8,12 +8,14 @@
#include <signal.h> // For SigUSR1Handler below.
#endif
+#include "base/lazy_instance.h"
#include "base/message_loop.h"
#include "base/metrics/statistics_recorder.h"
#include "base/process_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread.h"
+#include "base/threading/thread_local.h"
#include "content/child/child_thread.h"
#if defined(OS_ANDROID)
@@ -25,15 +27,19 @@
#endif
namespace content {
-// The singleton instance for this process.
-ChildProcess* child_process = NULL;
+namespace {
+
+base::LazyInstance<base::ThreadLocalPointer<ChildProcess> > g_lazy_tls =
+ LAZY_INSTANCE_INITIALIZER;
+}
+
ChildProcess::ChildProcess()
: ref_count_(0),
shutdown_event_(true, false),
io_thread_("Chrome_ChildIOThread") {
- DCHECK(!child_process);
- child_process = this;
+ DCHECK(!g_lazy_tls.Pointer()->Get());
+ g_lazy_tls.Pointer()->Set(this);
base::StatisticsRecorder::Initialize();
@@ -47,7 +53,7 @@
}
ChildProcess::~ChildProcess() {
- DCHECK(child_process == this);
+ DCHECK(g_lazy_tls.Pointer()->Get() == this);
// Signal this event before destroying the child process. That way all
// background threads can cleanup.
@@ -62,7 +68,7 @@
main_thread_.reset();
}
- child_process = NULL;
+ g_lazy_tls.Pointer()->Set(NULL);
}
ChildThread* ChildProcess::main_thread() {
@@ -83,7 +89,6 @@
DCHECK(!main_thread_.get() || // null in unittests.
base::MessageLoop::current() == main_thread_->message_loop());
DCHECK(ref_count_);
- DCHECK(child_process);
if (--ref_count_)
return;
@@ -92,12 +97,11 @@
}
ChildProcess* ChildProcess::current() {
- return child_process;
+ return g_lazy_tls.Pointer()->Get();
}
base::WaitableEvent* ChildProcess::GetShutDownEvent() {
- DCHECK(child_process);
- return &child_process->shutdown_event_;
+ return &shutdown_event_;
}
void ChildProcess::WaitForDebugger(const std::string& label) {

Powered by Google App Engine
This is Rietveld 408576698