diff --git a/c_src/debug.h b/c_src/debug.h index ea59586..f910db9 100644 --- a/c_src/debug.h +++ b/c_src/debug.h @@ -1,7 +1,7 @@ #ifndef DEBUG_H #define DEBUG_H -#define DEBUG 0 +#define DEBUG 1 #define FTRACE(fmt, ...) \ do { if (DEBUG) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \ diff --git a/c_src/erlang_v8.cc b/c_src/erlang_v8.cc index 2d5b7a8..764bdb3 100644 --- a/c_src/erlang_v8.cc +++ b/c_src/erlang_v8.cc @@ -43,8 +43,10 @@ size_t PacketLength() { } bool NextPacket(Packet* packet) { + TRACE("Ready for next!!\n"); size_t len = PacketLength(); uint32_t ref = 0; + uint32_t timeout = 0; if (len == 0) { return false; @@ -67,11 +69,15 @@ bool NextPacket(Packet* packet) { ref = (((uint8_t)buf[0] << 24) | ((uint8_t)buf[1] << 16) | ((uint8_t)buf[2] << 8) | (uint8_t)buf[3]); + buf.erase(0, 4); + timeout = (((uint8_t)buf[0] << 24) | ((uint8_t)buf[1] << 16) | + ((uint8_t)buf[2] << 8) | (uint8_t)buf[3]); buf.erase(0, 4); packet->op = op; packet->ref = ref; + packet->timeout = timeout; packet->data = buf; return true; @@ -80,17 +86,18 @@ bool NextPacket(Packet* packet) { bool CommandLoop(VM& vm) { HandleScope handle_scope(vm.GetIsolate()); - bool reset = false; Packet packet; - while (!reset && NextPacket(&packet)) { + while (NextPacket(&packet)) { TRACE("In command loop!\n"); vm.Size(); switch(packet.op) { case OP_EVAL: FTRACE("Eval in context: %i\n", packet.ref); + FTRACE("With timeout: %i\n", packet.timeout); vm.Eval(&packet); + TRACE("Evaled!!!\n"); break; case OP_CALL: FTRACE("Call in context: %i\n", packet.ref); @@ -104,16 +111,16 @@ bool CommandLoop(VM& vm) { FTRACE("Destroying context: %i\n", packet.ref); vm.DestroyContext(packet.ref); break; - case OP_RESET_VM: - FTRACE("Ignoring reset: %i\n", packet.ref); - // reset = true; - break; } + + // TODO: Move inside VM-handler? vm.PumpMessageLoop(); + packet = (const Packet){ 0 }; } Isolate::GetCurrent()->ContextDisposedNotification(); - return reset; + + return true; } int main(int argc, char* argv[]) { diff --git a/c_src/packet.h b/c_src/packet.h index f6e5f5e..efcdead 100644 --- a/c_src/packet.h +++ b/c_src/packet.h @@ -10,11 +10,11 @@ const uint8_t OP_EVAL = 1; const uint8_t OP_CALL = 2; const uint8_t OP_CREATE_CONTEXT = 3; const uint8_t OP_DESTROY_CONTEXT = 4; -const uint8_t OP_RESET_VM = 5; struct Packet { uint8_t op; uint32_t ref; + uint32_t timeout; std::string data; }; diff --git a/c_src/vm.cc b/c_src/vm.cc index f7167b1..ab42fb8 100644 --- a/c_src/vm.cc +++ b/c_src/vm.cc @@ -24,14 +24,14 @@ struct TimeoutHandlerArgs { void* TimeoutHandler(void *arg) { struct TimeoutHandlerArgs *args = (struct TimeoutHandlerArgs*)arg; TRACE("Timeout started.\n"); - usleep(1000000); + FTRACE("With timeout: %i\n", args->timeout); + usleep(args->timeout); TRACE("After sleep,\n"); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0x00); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0x00); args->vm->TerminateExecution(); - args->vm->PumpMessageLoop(); return NULL; } @@ -94,7 +94,7 @@ void VM::Eval(Packet* packet) { contexts[packet->ref]); if (context.IsEmpty()) { - Local tt = String::NewFromUtf8(isolate, "empty contextz"); + Local tt = String::NewFromUtf8(isolate, "empty context"); Report(isolate, tt, OP_INVALID_CONTEXT); } else { Context::Scope context_scope(context); @@ -115,12 +115,12 @@ void VM::Eval(Packet* packet) { } else { pthread_t t; void *res; - struct TimeoutHandlerArgs args = { + struct TimeoutHandlerArgs timeout_handler_args = { this, - (long)1 + (long)packet->timeout }; - pthread_create(&t, NULL, TimeoutHandler, &args); + pthread_create(&t, NULL, TimeoutHandler, &timeout_handler_args); Local result = script->Run(); @@ -193,8 +193,21 @@ void VM::Call(Packet* packet) { Local source = String::Concat(String::Concat(prefix, function_name), suffix); Local