public IScriptLogger GetLogger() { return(_runtime.GetLogger()); }
// 在主线程回调 private static unsafe void _PostMessage(ScriptRuntime runtime, JSAction action) { var worker = action.worker; try { if (worker._runtime.isRunning && worker._parentRuntime.isRunning) { var context = runtime.GetMainContext(); var ctx = (JSContext)context; var onmessage = JSApi.JS_GetProperty(ctx, worker._self, context.GetAtom("onmessage")); if (onmessage.IsException()) { var exceptionString = ctx.GetExceptionString(); var logger = runtime.GetLogger(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } else { if (JSApi.JS_IsFunction(ctx, onmessage) == 1) { // read object => jsvalue JSValue data; fixed(byte *buf = action.buffer.data) { data = JSApi.JS_ReadObject(ctx, buf, action.buffer.readableBytes, 0); } if (data.IsException()) { var exceptionString = ctx.GetExceptionString(); var logger = runtime.GetLogger(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } else { var argv = stackalloc JSValue[1] { data }; var rval = JSApi.JS_Call(ctx, onmessage, worker._self, 1, argv); JSApi.JS_FreeValue(ctx, rval); } } else { // not function } JSApi.JS_FreeValue(ctx, onmessage); } } } finally { action.buffer.Release(); } }
/// <summary> /// master 处理 worker 发送的消息 (在master线程回调) /// </summary> private static unsafe void _MasterOnMessage(ScriptRuntime runtime, JSAction action) { var args = (JSWorkerArgs)action.args; var buffer = args.buffer; try { var worker = args.worker; if (worker._runtime.isRunning && worker._parentRuntime.isRunning) { var context = runtime.GetMainContext(); var ctx = (JSContext)context; var onmessage = JSApi.JS_GetProperty(ctx, worker._self, context.GetAtom("onmessage")); if (onmessage.IsException()) { var exceptionString = ctx.GetExceptionString(); var logger = runtime.GetLogger(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } else { if (JSApi.JS_IsFunction(ctx, onmessage) == 1) { // read object => jsvalue JSValue data; fixed(byte *buf = buffer.data) { data = JSApi.JS_ReadObject(ctx, buf, buffer.readableBytes, JSApi.JS_READ_OBJ_REFERENCE); } do { if (!data.IsException()) { var evt = JSApi.JS_NewObject(ctx); if (!evt.IsException()) { JSApi.JS_SetProperty(ctx, evt, context.GetAtom("data"), data); var argv = stackalloc JSValue[1] { evt }; var rval = JSApi.JS_Call(ctx, onmessage, worker._self, 1, argv); JSApi.JS_FreeValue(ctx, rval); JSApi.JS_FreeValue(ctx, evt); break; } else { JSApi.JS_FreeValue(ctx, data); } } var exceptionString = ctx.GetExceptionString(); var logger = runtime.GetLogger(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } while (false); } else { // not function } JSApi.JS_FreeValue(ctx, onmessage); } } } finally { buffer.Release(); } }
private void Run() { var tick = Environment.TickCount; var list = new List <IO.ByteBuffer>(); var context = _runtime.GetMainContext(); var globalObject = context.GetGlobalObject(); var onmessage = JSApi.JS_GetPropertyStr(context, globalObject, "onmessage"); JSContext ctx = context; var logger = _runtime.GetLogger(); while (_runtime.isRunning) { lock (_inbox) { list.AddRange(_inbox); _inbox.Clear(); } if (list.Count == 0) { Thread.Yield(); } else { for (int i = 0, count = list.Count; i < count; i++) { var byteBuffer = list[i]; unsafe { JSValue data; fixed(byte *buf = byteBuffer.data) { data = JSApi.JS_ReadObject(ctx, buf, byteBuffer.readableBytes, 0); } if (data.IsException()) { var exceptionString = ctx.GetExceptionString(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } else { var argv = stackalloc JSValue[1] { data }; var rval = JSApi.JS_Call(ctx, onmessage, globalObject, 1, argv); JSApi.JS_FreeValue(ctx, rval); } } byteBuffer.Release(); } list.Clear(); } var now = Environment.TickCount; var dt = now - tick; tick = now; _runtime.Update(dt); } JSApi.JS_FreeValue(ctx, onmessage); JSApi.JS_FreeValue(ctx, globalObject); _runtime.Destroy(); }
private void Run() { var tick = Environment.TickCount; var list = new List <IO.ByteBuffer>(); var context = _runtime.GetMainContext(); var logger = _runtime.GetLogger(); while (_runtime.isRunning) { lock (_inbox) { list.AddRange(_inbox); _inbox.Clear(); } if (list.Count == 0) { Thread.Yield(); } else { JSContext ctx = context; var globalObject = context.GetGlobalObject(); var onmessage = JSApi.JS_GetPropertyStr(context, globalObject, "onmessage"); var callable = JSApi.JS_IsFunction(ctx, onmessage) == 1; for (int i = 0, count = list.Count; i < count; i++) { var byteBuffer = list[i]; if (callable) { unsafe { JSValue data; fixed(byte *buf = byteBuffer.data) { data = JSApi.JS_ReadObject(ctx, buf, byteBuffer.readableBytes, JSApi.JS_READ_OBJ_REFERENCE); } do { if (!data.IsException()) { var evt = JSApi.JS_NewObject(ctx); if (!evt.IsException()) { JSApi.JS_SetProperty(ctx, evt, context.GetAtom("data"), data); var argv = stackalloc JSValue[1] { evt }; var rval = JSApi.JS_Call(ctx, onmessage, globalObject, 1, argv); JSApi.JS_FreeValue(ctx, rval); JSApi.JS_FreeValue(ctx, evt); break; } else { JSApi.JS_FreeValue(ctx, data); } } var exceptionString = ctx.GetExceptionString(); if (logger != null) { logger.Write(LogLevel.Error, exceptionString); } } while (false); } } byteBuffer.Release(); } JSApi.JS_FreeValue(ctx, onmessage); JSApi.JS_FreeValue(ctx, globalObject); list.Clear(); } var now = Environment.TickCount; if (now < tick) { _runtime.Update((now - int.MinValue) + (int.MaxValue - tick)); } else { _runtime.Update(now - tick); } tick = now; } _runtime.Destroy(); }