mirror of https://gitee.com/bigwinds/arangodb
Make shure we leave all contexts we open in the propper sequence.
This commit is contained in:
parent
26b51b35b8
commit
aa1cdc09e2
|
@ -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";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue