From: binji Date: Thu, 16 Jul 2015 16:40:37 +0000 (-0700) Subject: d8: Leak context_mutex_ so it will never be destroyed while locked X-Git-Tag: upstream/4.7.83~1331 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=162f116a913058cb02f0e5fe1becf7c11d1db56b;p=platform%2Fupstream%2Fv8.git 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} --- 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_;