Index: src/v8.cc |
diff --git a/src/v8.cc b/src/v8.cc |
index 62330c32d482aa9a1a74ba70f38d769bfff240da..6c5375dd4b112974c6f4de5be8c9d956b297853b 100644 |
--- a/src/v8.cc |
+++ b/src/v8.cc |
@@ -79,16 +79,24 @@ bool V8::Initialize(Deserializer* des) { |
} |
-void V8::TearDown() { |
- Isolate* isolate = Isolate::Current(); |
- ASSERT(isolate->IsDefaultIsolate()); |
- if (!isolate->IsInitialized()) return; |
+bool V8::TearDown() { |
+ Isolate* isolate = Isolate::UncheckedCurrent(); |
+ if (isolate != NULL) { |
+ ASSERT(isolate->IsDefaultIsolate()); |
+ if (isolate->IsInitialized()) isolate->TearDown(); |
+ delete isolate; |
+ } |
+ |
+ // V8 was never initialized, nothing to do. |
+ if (Acquire_Load(&init_once) == ONCE_STATE_UNINITIALIZED) return true; |
+ |
+ // TODO(dcarney): Everything below this should be in some sort of mutex... |
+ Atomic32 living_isolates = Isolate::GetLivingIsolates(); |
- // The isolate has to be torn down before clearing the LOperand |
+ // All isolates have to be torn down before clearing the LOperand |
// caches so that the optimizing compiler thread (if running) |
// doesn't see an inconsistent view of the lithium instructions. |
- isolate->TearDown(); |
- delete isolate; |
+ if (living_isolates != 0) return false; |
ElementsAccessor::TearDown(); |
LOperand::TearDownCaches(); |
@@ -100,6 +108,7 @@ void V8::TearDown() { |
call_completed_callbacks_ = NULL; |
Sampler::TearDown(); |
+ return true; |
} |