From 162f116a913058cb02f0e5fe1becf7c11d1db56b Mon Sep 17 00:00:00 2001 From: binji Date: Thu, 16 Jul 2015 09:40:37 -0700 Subject: [PATCH] d8: Leak context_mutex_ so it will never be destroyed while locked Calling quit() from d8 will call exit(), which will run static destructors. If context_mutex_ is statically allocated, pthread_mutex_destroy will be called. When running d8 in "isolates" mode, another thread may be running. If it calls CreateEvaluationContext, it will lock the context_mutex_. If the mutex is destroyed while it is locked, it will return an error. This CL changes the Mutex to a LazyMutex, which will leak instead of being destroyed. BUG=v8:4279 R=jarin@chromium.org R=machenbach@chromium.org LOG=n Review URL: https://codereview.chromium.org/1240553003 Cr-Commit-Position: refs/heads/master@{#29709} --- src/d8.cc | 12 ++++++------ src/d8.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/d8.cc b/src/d8.cc index b68e4ba..344325e 100644 --- a/src/d8.cc +++ b/src/d8.cc @@ -202,11 +202,11 @@ CounterMap* Shell::counter_map_; base::OS::MemoryMappedFile* Shell::counters_file_ = NULL; CounterCollection Shell::local_counters_; CounterCollection* Shell::counters_ = &local_counters_; -base::Mutex Shell::context_mutex_; +base::LazyMutex Shell::context_mutex_; const base::TimeTicks Shell::kInitialTicks = base::TimeTicks::HighResolutionNow(); Persistent Shell::utility_context_; -base::Mutex Shell::workers_mutex_; +base::LazyMutex Shell::workers_mutex_; bool Shell::allow_new_workers_ = true; i::List Shell::workers_; i::List Shell::externalized_shared_contents_; @@ -699,7 +699,7 @@ void Shell::WorkerNew(const v8::FunctionCallbackInfo& args) { } { - base::LockGuard lock_guard(&workers_mutex_); + base::LockGuard lock_guard(workers_mutex_.Pointer()); if (!allow_new_workers_) return; Worker* worker = new Worker; @@ -1203,7 +1203,7 @@ void Shell::InitializeDebugger(Isolate* isolate) { Local Shell::CreateEvaluationContext(Isolate* isolate) { #ifndef V8_SHARED // This needs to be a critical section since this is not thread-safe - base::LockGuard lock_guard(&context_mutex_); + base::LockGuard lock_guard(context_mutex_.Pointer()); #endif // !V8_SHARED // Initialize the global objects Handle global_template = CreateGlobalTemplate(isolate); @@ -2252,7 +2252,7 @@ void Shell::CleanupWorkers() { // create a new Worker, it would deadlock. i::List workers_copy; { - base::LockGuard lock_guard(&workers_mutex_); + base::LockGuard lock_guard(workers_mutex_.Pointer()); allow_new_workers_ = false; workers_copy.AddAll(workers_); workers_.Clear(); @@ -2266,7 +2266,7 @@ void Shell::CleanupWorkers() { // Now that all workers are terminated, we can re-enable Worker creation. { - base::LockGuard lock_guard(&workers_mutex_); + base::LockGuard lock_guard(workers_mutex_.Pointer()); allow_new_workers_ = true; } diff --git a/src/d8.h b/src/d8.h index bb5592b..ae61dcc 100644 --- a/src/d8.h +++ b/src/d8.h @@ -481,10 +481,10 @@ class Shell : public i::AllStatic { static CounterCollection local_counters_; static CounterCollection* counters_; static base::OS::MemoryMappedFile* counters_file_; - static base::Mutex context_mutex_; + static base::LazyMutex context_mutex_; static const base::TimeTicks kInitialTicks; - static base::Mutex workers_mutex_; + static base::LazyMutex workers_mutex_; static bool allow_new_workers_; static i::List workers_; static i::List externalized_shared_contents_; -- 2.7.4