Revert "Removed default Isolate."

This reverts commit r21167, cctest/test-serialize has to be fixed first.

TBR=dcarney@chromium.org

Review URL: https://codereview.chromium.org/267163002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21170 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 14c023c7
......@@ -4958,6 +4958,12 @@ void v8::V8::SetArrayBufferAllocator(
bool v8::V8::Dispose() {
i::Isolate* isolate = i::Isolate::Current();
if (!Utils::ApiCheck(isolate != NULL && isolate->IsDefaultIsolate(),
"v8::V8::Dispose()",
"Use v8::Isolate::Dispose() for non-default isolate.")) {
return false;
}
i::V8::TearDown();
return true;
}
......
......@@ -1659,7 +1659,7 @@ int Shell::Main(int argc, char* argv[]) {
v8::V8::SetArrayBufferAllocator(&array_buffer_allocator);
}
int result = 0;
Isolate* isolate = Isolate::New();
Isolate* isolate = Isolate::GetCurrent();
#ifndef V8_SHARED
v8::ResourceConstraints constraints;
constraints.ConfigureDefaults(i::OS::TotalPhysicalMemory(),
......@@ -1669,7 +1669,6 @@ int Shell::Main(int argc, char* argv[]) {
#endif
DumbLineEditor dumb_line_editor(isolate);
{
Isolate::Scope scope(isolate);
Initialize(isolate);
#ifdef ENABLE_VTUNE_JIT_INTERFACE
vTune::InitializeVtuneForV8();
......
......@@ -103,6 +103,7 @@ v8::TryCatch* ThreadLocalTop::TryCatchHandler() {
}
Isolate* Isolate::default_isolate_ = NULL;
Thread::LocalStorageKey Isolate::isolate_key_;
Thread::LocalStorageKey Isolate::thread_id_key_;
Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_;
......@@ -165,7 +166,7 @@ void Isolate::SetCrashIfDefaultIsolateInitialized() {
void Isolate::EnsureDefaultIsolate() {
LockGuard<Mutex> lock_guard(&process_wide_mutex_);
CHECK(default_isolate_status_ != kDefaultIsolateCrashIfInitialized);
if (thread_data_table_ == NULL) {
if (default_isolate_ == NULL) {
isolate_key_ = Thread::CreateThreadLocalKey();
thread_id_key_ = Thread::CreateThreadLocalKey();
per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey();
......@@ -173,6 +174,12 @@ void Isolate::EnsureDefaultIsolate() {
PerThreadAssertScopeBase::thread_local_key = Thread::CreateThreadLocalKey();
#endif // DEBUG
thread_data_table_ = new Isolate::ThreadDataTable();
default_isolate_ = new Isolate();
}
// Can't use SetIsolateThreadLocals(default_isolate_, NULL) here
// because a non-null thread data may be already set.
if (Thread::GetThreadLocal(isolate_key_) == NULL) {
Thread::SetThreadLocal(isolate_key_, default_isolate_);
}
}
......@@ -1516,7 +1523,9 @@ void Isolate::TearDown() {
serialize_partial_snapshot_cache_ = NULL;
}
delete this;
if (!IsDefaultIsolate()) {
delete this;
}
// Restore the previous current isolate.
SetIsolateThreadLocals(saved_isolate, saved_data);
......
......@@ -478,6 +478,8 @@ class Isolate {
static void GlobalTearDown();
bool IsDefaultIsolate() const { return this == default_isolate_; }
static void SetCrashIfDefaultIsolateInitialized();
// Ensures that process-wide resources and the default isolate have been
// allocated. It is only necessary to call this method in rare cases, for
......@@ -1132,12 +1134,14 @@ class Isolate {
DISALLOW_COPY_AND_ASSIGN(EntryStackItem);
};
// This mutex protects highest_thread_id_ and thread_data_table_.
// This mutex protects highest_thread_id_, thread_data_table_ and
// default_isolate_.
static Mutex process_wide_mutex_;
static Thread::LocalStorageKey per_isolate_thread_data_key_;
static Thread::LocalStorageKey isolate_key_;
static Thread::LocalStorageKey thread_id_key_;
static Isolate* default_isolate_;
static ThreadDataTable* thread_data_table_;
// A global counter for all generated Isolates, might overflow.
......
......@@ -1936,48 +1936,58 @@ void Logger::LogAccessorCallbacks() {
static void AddIsolateIdIfNeeded(Isolate* isolate, StringStream* stream) {
if (FLAG_logfile_per_isolate) stream->Add("isolate-%p-", isolate);
if (isolate->IsDefaultIsolate() || !FLAG_logfile_per_isolate) return;
stream->Add("isolate-%p-", isolate);
}
static SmartArrayPointer<const char> PrepareLogFileName(
Isolate* isolate, const char* file_name) {
HeapStringAllocator allocator;
StringStream stream(&allocator);
AddIsolateIdIfNeeded(isolate, &stream);
for (const char* p = file_name; *p; p++) {
if (*p == '%') {
p++;
switch (*p) {
case '\0':
// If there's a % at the end of the string we back up
// one character so we can escape the loop properly.
p--;
break;
case 'p':
stream.Add("%d", OS::GetCurrentProcessId());
break;
case 't': {
// %t expands to the current time in milliseconds.
double time = OS::TimeCurrentMillis();
stream.Add("%.0f", FmtElm(time));
break;
if (strchr(file_name, '%') != NULL || !isolate->IsDefaultIsolate()) {
// If there's a '%' in the log file name we have to expand
// placeholders.
HeapStringAllocator allocator;
StringStream stream(&allocator);
AddIsolateIdIfNeeded(isolate, &stream);
for (const char* p = file_name; *p; p++) {
if (*p == '%') {
p++;
switch (*p) {
case '\0':
// If there's a % at the end of the string we back up
// one character so we can escape the loop properly.
p--;
break;
case 'p':
stream.Add("%d", OS::GetCurrentProcessId());
break;
case 't': {
// %t expands to the current time in milliseconds.
double time = OS::TimeCurrentMillis();
stream.Add("%.0f", FmtElm(time));
break;
}
case '%':
// %% expands (contracts really) to %.
stream.Put('%');
break;
default:
// All other %'s expand to themselves.
stream.Put('%');
stream.Put(*p);
break;
}
case '%':
// %% expands (contracts really) to %.
stream.Put('%');
break;
default:
// All other %'s expand to themselves.
stream.Put('%');
stream.Put(*p);
break;
} else {
stream.Put(*p);
}
} else {
stream.Put(*p);
}
return SmartArrayPointer<const char>(stream.ToCString());
}
return SmartArrayPointer<const char>(stream.ToCString());
int length = StrLength(file_name);
char* str = NewArray<char>(length + 1);
OS::MemCopy(str, file_name, length);
str[length] = '\0';
return SmartArrayPointer<const char>(str);
}
......
......@@ -393,10 +393,6 @@ int main(int argc, char** argv) {
isolate->Exit();
isolate->Dispose();
// TODO(svenpanne) Alas, we can't cleanly dispose V8 here, because
// Serializer::code_address_map_ is static (a.k.a. a global variable), and
// disposing that would involve accessing the Isolate just disposed.
// code_address_map_ really has to be an instance variable...
// V8::Dispose();
V8::Dispose();
return 0;
}
......@@ -53,6 +53,16 @@ bool V8::Initialize(Deserializer* des) {
void V8::TearDown() {
Isolate* isolate = Isolate::Current();
ASSERT(isolate->IsDefaultIsolate());
if (!isolate->IsInitialized()) return;
// 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->TearDown();
delete isolate;
Bootstrapper::TearDownExtensions();
ElementsAccessor::TearDown();
LOperand::TearDownCaches();
......
......@@ -152,7 +152,6 @@ int main(int argc, char* argv[]) {
i::TraceExtension trace_extension;
v8::RegisterExtension(&trace_extension);
v8::V8::Initialize();
int tests_run = 0;
bool print_run_count = true;
for (int i = 1; i < argc; i++) {
......
......@@ -19269,6 +19269,7 @@ TEST(IsolateNewDispose) {
v8::Isolate* current_isolate = CcTest::isolate();
v8::Isolate* isolate = v8::Isolate::New();
CHECK(isolate != NULL);
CHECK(!reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate());
CHECK(current_isolate != isolate);
CHECK(current_isolate == CcTest::isolate());
......@@ -22338,7 +22339,6 @@ TEST(EventLogging) {
TEST(Promises) {
i::FLAG_harmony_promises = true;
i::FLAG_harmony_weak_collections = true; // Implied
LocalContext context;
v8::Isolate* isolate = context->GetIsolate();
......
......@@ -37,7 +37,6 @@ class HarmonyIsolate {
public:
HarmonyIsolate() {
i::FLAG_harmony_promises = true;
i::FLAG_harmony_weak_collections = true; // Implied
isolate_ = Isolate::New();
isolate_->Enter();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment