Reviewers: Sven Panne,
Description:
Fix multiple V8::Dispose calls since r16563.
[email protected]
BUG=v8:2744
TEST=cctest/test-api/InitializeAndDisposeMultiple
Please review this at https://codereview.chromium.org/23775007/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+13, -2 lines):
M src/isolate.h
M src/v8.cc
Index: src/isolate.h
diff --git a/src/isolate.h b/src/isolate.h
index
741c4c02ffb17cf409f16a4067e3fd560bc5e2b2..5ca776d580d2b3575d546515b1350f497d06f022
100644
--- a/src/isolate.h
+++ b/src/isolate.h
@@ -1383,6 +1383,7 @@ class Isolate {
friend class v8::Isolate;
friend class v8::Locker;
friend class v8::Unlocker;
+ friend class V8;
DISALLOW_COPY_AND_ASSIGN(Isolate);
};
Index: src/v8.cc
diff --git a/src/v8.cc b/src/v8.cc
index
d9ce8404acddea3391c511ee03ce20e475a27055..c4ce0629c8021b89d39f59c8703dc64371330bb8
100644
--- a/src/v8.cc
+++ b/src/v8.cc
@@ -63,8 +63,8 @@ bool V8::Initialize(Deserializer* des) {
// The current thread may not yet had entered an isolate to run.
// Note the Isolate::Current() may be non-null because for various
- // initialization purposes an initializing thread may be assigned an
isolate
- // but not actually enter it.
+ // initialization purposes an initializing thread may be assigned an
+ // isolate but not actually enter it.
if (i::Isolate::CurrentPerIsolateThreadData() == NULL) {
i::Isolate::EnterDefaultIsolate();
}
@@ -84,6 +84,15 @@ bool V8::Initialize(Deserializer* des) {
void V8::TearDown() {
+ // The current thread may not yet had entered an isolate to run or may
+ // have already disposed the entered isolated before.
+ // Note the Isolate::Current() may be non-null because for various
+ // initialization purposes an initializing thread may be assigned an
+ // isolate but not actually enter it.
+ if (i::Isolate::CurrentPerIsolateThreadData() == NULL) {
+ return;
+ }
+
Isolate* isolate = Isolate::Current();
ASSERT(isolate->IsDefaultIsolate());
if (!isolate->IsInitialized()) return;
@@ -91,6 +100,7 @@ void V8::TearDown() {
// The isolate has 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::SetIsolateThreadLocals(isolate, NULL);
isolate->TearDown();
delete isolate;
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.