1
0
Fork 0

Make shure we leave all contexts we open in the propper sequence.

This commit is contained in:
Willi Goesgens 2015-01-08 17:53:13 +01:00
parent 26b51b35b8
commit aa1cdc09e2
2 changed files with 69 additions and 64 deletions

View File

@ -117,7 +117,7 @@ void ConsoleThread::run () {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void ConsoleThread::inner () { void ConsoleThread::inner () {
v8::Isolate* isolate = v8::Isolate::GetCurrent(); // TODO: this may go away. v8::Isolate* isolate = _context->isolate;
v8::HandleScope globalScope(isolate); v8::HandleScope globalScope(isolate);
// run the shell // run the shell
@ -127,71 +127,74 @@ void ConsoleThread::inner () {
auto localContext = v8::Local<v8::Context>::New(isolate, _context->_context); auto localContext = v8::Local<v8::Context>::New(isolate, _context->_context);
localContext->Enter(); localContext->Enter();
v8::Context::Scope contextScope(localContext); {
v8::Context::Scope contextScope(localContext);
// ............................................................................. // .............................................................................
// run console // run console
// ............................................................................. // .............................................................................
const uint64_t gcInterval = 10; const uint64_t gcInterval = 10;
uint64_t nrCommands = 0; uint64_t nrCommands = 0;
const std::string pretty = "start_pretty_print();"; const std::string pretty = "start_pretty_print();";
TRI_ExecuteJavaScriptString(isolate, TRI_ExecuteJavaScriptString(isolate,
localContext, localContext,
TRI_V8_STD_STRING(pretty), TRI_V8_STD_STRING(pretty),
TRI_V8_ASCII_STRING("(internal)"), TRI_V8_ASCII_STRING("(internal)"),
false); false);
V8LineEditor console(localContext, ".arangod.history"); V8LineEditor console(localContext, ".arangod.history");
console.open(true); console.open(true);
while (! _userAborted) { while (! _userAborted) {
if (nrCommands >= gcInterval) { if (nrCommands >= gcInterval) {
isolate->LowMemoryNotification(); isolate->LowMemoryNotification();
while (! isolate->IdleNotification(1000)) { while (! isolate->IdleNotification(1000)) {
}
nrCommands = 0;
} }
nrCommands = 0; char* input = console.prompt("arangod> ");
}
char* input = console.prompt("arangod> "); if (_userAborted) {
if (input != nullptr) {
TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input);
}
break;
}
if (_userAborted) { if (input == nullptr) {
if (input != nullptr) { _userAborted = true;
localContext->Exit();
break;
}
if (*input == '\0') {
TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input); TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input);
continue;
} }
throw "user aborted";
}
if (input == nullptr) { nrCommands++;
_userAborted = true; console.addHistory(input);
// this will be caught by "run" {
throw "user aborted"; v8::TryCatch tryCatch;
} v8::HandleScope scope(isolate);
if (*input == '\0') { TRI_ExecuteJavaScriptString(isolate, localContext, TRI_V8_STRING(input), name, true);
TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input); TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input);
continue;
}
nrCommands++; if (tryCatch.HasCaught()) {
console.addHistory(input); std::cout << TRI_StringifyV8Exception(isolate, &tryCatch);
}
v8::TryCatch tryCatch; }
v8::HandleScope scope(isolate);
TRI_ExecuteJavaScriptString(isolate, localContext, TRI_V8_STRING(input), name, true);
TRI_FreeString(TRI_UNKNOWN_MEM_ZONE, input);
if (tryCatch.HasCaught()) {
std::cout << TRI_StringifyV8Exception(isolate, &tryCatch);
} }
} }
localContext->Exit();
throw "user aborted"; throw "user aborted";
} }

View File

@ -374,30 +374,31 @@ ApplicationV8::V8Context* ApplicationV8::enterContext (std::string const& name,
v8::HandleScope scope(isolate); v8::HandleScope scope(isolate);
auto localContext = v8::Local<v8::Context>::New(isolate, context->_context); auto localContext = v8::Local<v8::Context>::New(isolate, context->_context);
localContext->Enter(); localContext->Enter();
v8::Context::Scope contextScope(localContext); {
v8::Context::Scope contextScope(localContext);
TRI_ASSERT(context->_locker->IsLocked(isolate)); TRI_ASSERT(context->_locker->IsLocked(isolate));
TRI_ASSERT(v8::Locker::IsLocked(isolate)); TRI_ASSERT(v8::Locker::IsLocked(isolate));
TRI_GET_GLOBALS(); TRI_GET_GLOBALS();
// set the current database // set the current database
v8g->_vocbase = vocbase; v8g->_vocbase = vocbase;
v8g->_allowUseDatabase = allowUseDatabase; v8g->_allowUseDatabase = allowUseDatabase;
LOG_TRACE("entering V8 context %d", (int) context->_id); LOG_TRACE("entering V8 context %d", (int) context->_id);
context->handleGlobalContextMethods(); context->handleGlobalContextMethods();
if (_developmentMode && ! initialise) { if (_developmentMode && ! initialise) {
v8::HandleScope scope(isolate); v8::HandleScope scope(isolate);
TRI_ExecuteJavaScriptString(isolate, TRI_ExecuteJavaScriptString(isolate,
localContext, localContext,
TRI_V8_ASCII_STRING("require(\"internal\").resetEngine()"), TRI_V8_ASCII_STRING("require(\"internal\").resetEngine()"),
TRI_V8_ASCII_STRING("global context method"), TRI_V8_ASCII_STRING("global context method"),
false); false);
}
} }
return context; return context;
} }
@ -505,6 +506,7 @@ void ApplicationV8::exitContext (V8Context* context) {
delete context->_locker; delete context->_locker;
context->_locker = nullptr; context->_locker = nullptr;
TRI_ASSERT(! v8::Locker::IsLocked(isolate)); TRI_ASSERT(! v8::Locker::IsLocked(isolate));
guard.broadcast(); guard.broadcast();