1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2026-01-03 09:03:48 +00:00

Modified JS runtime to use ILibMemory_Extra to point to udata structure,

then used that for consistency checks
This commit is contained in:
Bryan Roe
2020-04-17 15:05:47 -07:00
parent 255d20c263
commit 5ba1288cdf
19 changed files with 347 additions and 132 deletions

View File

@@ -114,6 +114,7 @@ int main(int argc, char **argv)
int retCode = 0; int retCode = 0;
int capabilities = 0; int capabilities = 0;
#ifdef WIN32 #ifdef WIN32
int argvi, argvsz; int argvi, argvsz;
char **argv = (char**)ILibMemory_SmartAllocate(argc * sizeof(void*)); char **argv = (char**)ILibMemory_SmartAllocate(argc * sizeof(void*));

View File

@@ -2274,22 +2274,22 @@ void WritePipeResponse(AGENT_RECORD_TYPE recordType, JS_ENGINE_CONTEXT engineCon
duk_context* ScriptEngine_Stop(MeshAgentHostContainer *agent, char *contextGUID) duk_context* ScriptEngine_Stop(MeshAgentHostContainer *agent, char *contextGUID)
{ {
duk_context *oldCtx = agent->meshCoreCtx; SCRIPT_ENGINE_SETTINGS *settings = ILibDuktape_ScriptContainer_GetSettings(agent->meshCoreCtx);
agent->meshCoreCtx = NULL; Duktape_SafeDestroyHeap(agent->meshCoreCtx);
SCRIPT_ENGINE_SETTINGS *settings = ILibDuktape_ScriptContainer_GetSettings(oldCtx);
duk_context *newCtx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx2(settings);
ILibDuktape_MeshAgent_Init(newCtx, agent->chain, agent);
ILibDuktape_SetNativeUncaughtExceptionHandler(newCtx, settings->nExeptionHandler, settings->nExceptionUserObject); agent->meshCoreCtx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx2(settings);
ILibDuktape_MeshAgent_Init(agent->meshCoreCtx, agent->chain, agent);
ILibDuktape_SetNativeUncaughtExceptionHandler(agent->meshCoreCtx, settings->nExeptionHandler, settings->nExceptionUserObject);
if (g_displayFinalizerMessages) { printf("\n\n==> Stopping JavaScript Engine\n"); } if (g_displayFinalizerMessages) { printf("\n\n==> Stopping JavaScript Engine\n"); }
duk_destroy_heap(oldCtx);
agent->meshCoreCtx = newCtx;
if (agent->proxyServer != NULL) if (agent->proxyServer != NULL)
{ {
memcpy_s(&(ILibDuktape_GetNewGlobalTunnel(agent->meshCoreCtx)->proxyServer), sizeof(struct sockaddr_in6), agent->proxyServer, sizeof(struct sockaddr_in6)); memcpy_s(&(ILibDuktape_GetNewGlobalTunnel(agent->meshCoreCtx)->proxyServer), sizeof(struct sockaddr_in6), agent->proxyServer, sizeof(struct sockaddr_in6));
} }
return(newCtx); ILibDuktape_ScriptContainer_FreeSettings(settings);
return(agent->meshCoreCtx);
} }
char* ScriptEngine_Restart(MeshAgentHostContainer *agent, char *contextGUID, char *buffer, int bufferLen) char* ScriptEngine_Restart(MeshAgentHostContainer *agent, char *contextGUID, char *buffer, int bufferLen)
{ {
@@ -3770,10 +3770,10 @@ void MeshAgent_ChainEnd(void *chain, void *user)
if (agent->meshCoreCtx != NULL) if (agent->meshCoreCtx != NULL)
{ {
if (g_displayFinalizerMessages) { printf("\n\n==> Stopping JavaScript Engine\n"); } if (g_displayFinalizerMessages) { printf("\n\n==> Stopping JavaScript Engine\n"); }
duk_destroy_heap(agent->meshCoreCtx); Duktape_SafeDestroyHeap(agent->meshCoreCtx);
if (agent->bootstrapCoreCtx != NULL) if (agent->bootstrapCoreCtx != NULL)
{ {
duk_destroy_heap(agent->bootstrapCoreCtx); Duktape_SafeDestroyHeap(agent->bootstrapCoreCtx);
agent->bootstrapCoreCtx = NULL; agent->bootstrapCoreCtx = NULL;
} }
} }
@@ -4009,7 +4009,7 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
break; break;
} }
duk_destroy_heap(ctxx); Duktape_SafeDestroyHeap(ctxx);
} }
else else
{ {
@@ -4141,7 +4141,7 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
} }
} }
} }
duk_destroy_heap(tmpCtx); Duktape_SafeDestroyHeap(tmpCtx);
// Load the mesh agent certificates // Load the mesh agent certificates
if ((resetNodeId == 1 || agent_LoadCertificates(agentHost) != 0) && agent_GenerateCertificates(agentHost, NULL) != 0) { printf("Certificate error\r\n"); } if ((resetNodeId == 1 || agent_LoadCertificates(agentHost) != 0) && agent_GenerateCertificates(agentHost, NULL) != 0) { printf("Certificate error\r\n"); }

View File

@@ -125,7 +125,7 @@ void UpdateOwnerData()
duk_peval_string_noresult(ctx, "global._noMessagePump=true;var key=require('win-registry').usernameToUserKey(require('user-sessions').getProcessOwnerName(process.pid).name);var reg=require('win-registry');reg.WriteKey(reg.HKEY.LocalMachine, 'SYSTEM\\\\CurrentControlSet\\\\Services\\\\Mesh Agent', '_InstalledBy', key);"); duk_peval_string_noresult(ctx, "global._noMessagePump=true;var key=require('win-registry').usernameToUserKey(require('user-sessions').getProcessOwnerName(process.pid).name);var reg=require('win-registry');reg.WriteKey(reg.HKEY.LocalMachine, 'SYSTEM\\\\CurrentControlSet\\\\Services\\\\Mesh Agent', '_InstalledBy', key);");
duk_destroy_heap(ctx); Duktape_SafeDestroyHeap(ctx);
ILibChain_DestroyEx(chain); ILibChain_DestroyEx(chain);
ILibMemory_Free(exePath); ILibMemory_Free(exePath);
} }

View File

@@ -353,11 +353,7 @@ duk_ret_t ILibDuktape_ModSearch_setModulePath(duk_context *ctx)
void ILibDuktape_ModSearch_Init(duk_context * ctx, void * chain, ILibSimpleDataStore mDB) void ILibDuktape_ModSearch_Init(duk_context * ctx, void * chain, ILibSimpleDataStore mDB)
{ {
duk_module_duktape_init(ctx); duk_module_duktape_init(ctx);
if (duk_ctx_chain(ctx) == NULL) { duk_ctx_context_data(ctx)->chain = chain; }
duk_push_heap_stash(ctx); // [stash]
duk_push_pointer(ctx, chain); // [stash][chain]
duk_put_prop_string(ctx, -2, ILibDuktape_Context_Chain); // [stash]
duk_pop(ctx); // ...
duk_get_global_string(ctx, "Duktape"); // [globalString] duk_get_global_string(ctx, "Duktape"); // [globalString]
duk_push_c_function(ctx, mod_Search, 4); // [globalString][func] duk_push_c_function(ctx, mod_Search, 4); // [globalString][func]

View File

@@ -254,7 +254,7 @@ void ILibDuktape_Debugger_AsyncWaitConn(ILibDuktape_Debugger *dbg)
void ILibDuktape_Debugger_DestroyEx(void *chain, void *user) void ILibDuktape_Debugger_DestroyEx(void *chain, void *user)
{ {
duk_destroy_heap(DebugWebEngine_Context); Duktape_SafeDestroyHeap(DebugWebEngine_Context);
} }
void DebugWebEngine_RunEx(void *chain, void *user) void DebugWebEngine_RunEx(void *chain, void *user)

View File

@@ -105,6 +105,7 @@ typedef struct Duktape_GlobalGeneric_DispatcherData
typedef struct Duktape_GlobalGeneric_Data typedef struct Duktape_GlobalGeneric_Data
{ {
ILibDuktape_EventEmitter *emitter; ILibDuktape_EventEmitter *emitter;
uintptr_t ctxnonce;
void *retVal; void *retVal;
void *chain; void *chain;
sem_t contextWaiter; sem_t contextWaiter;
@@ -836,15 +837,16 @@ void ILibDuktape_GenericMarshal_MethodInvoke_ThreadSink_Return(void *chain, void
} }
void ILibDuktape_GenericMarshal_MethodInvoke_ThreadSink(void *args) void ILibDuktape_GenericMarshal_MethodInvoke_ThreadSink(void *args)
{ {
ILibDuktape_EventEmitter *e = (ILibDuktape_EventEmitter*)((void**)args)[0];
void *chain = ((void**)args)[1]; void *chain = ((void**)args)[1];
PTRSIZE *vars = (PTRSIZE*)((void**)args)[2]; PTRSIZE *vars = (PTRSIZE*)((void**)args)[2];
int parms = (int)(PTRSIZE)((void**)args)[3]; int parms = (int)(PTRSIZE)((void**)args)[3];
void *fptr = ((void**)args)[4]; void *fptr = ((void**)args)[4];
uintptr_t nonce = (uintptr_t)((void**)args)[5];
PTRSIZE retVal = ILibDuktape_GenericMarshal_MethodInvoke_Native(parms, fptr, vars); PTRSIZE retVal = ILibDuktape_GenericMarshal_MethodInvoke_Native(parms, fptr, vars);
((void**)args)[3] = (void*)retVal; ((void**)args)[3] = (void*)retVal;
ILibChain_RunOnMicrostackThreadEx(chain, ILibDuktape_GenericMarshal_MethodInvoke_ThreadSink_Return, args); Duktape_RunOnEventLoop(chain, nonce, e->ctx, ILibDuktape_GenericMarshal_MethodInvoke_ThreadSink_Return, NULL, args);
} }
#define ILibDuktape_FFI_AsyncDataPtr "\xFF_FFI_AsyncDataPtr" #define ILibDuktape_FFI_AsyncDataPtr "\xFF_FFI_AsyncDataPtr"
@@ -927,7 +929,7 @@ void ILibDuktape_GenericMarshal_MethodInvokeAsync_WorkerRunLoop(void *arg)
{ {
if (data->waitingForResult == 0) if (data->waitingForResult == 0)
{ {
ILibChain_RunOnMicrostackThread(data->chain, ILibDuktape_GenericMarshal_MethodInvokeAsync_ChainDispatch, data); Duktape_RunOnEventLoop(data->chain, duk_ctx_nonce(data->ctx), data->ctx, ILibDuktape_GenericMarshal_MethodInvokeAsync_ChainDispatch, NULL, data);
} }
else else
{ {
@@ -1259,7 +1261,7 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvoke(duk_context *ctx)
duk_push_current_function(ctx); // [func] duk_push_current_function(ctx); // [func]
exposedName = Duktape_GetStringPropertyValue(ctx, -1, "_exposedName", NULL); exposedName = Duktape_GetStringPropertyValue(ctx, -1, "_exposedName", NULL);
int spawnThread = Duktape_GetBooleanProperty(ctx, -1, "_spawnThread", 0); int spawnThread = Duktape_GetBooleanProperty(ctx, -1, "_spawnThread", 0);
PTRSIZE *vars = spawnThread == 0 ? ILibMemory_AllocateA(sizeof(PTRSIZE)*parms) : ILibMemory_SmartAllocateEx(sizeof(PTRSIZE)*parms, 5 * sizeof(void*)); PTRSIZE *vars = spawnThread == 0 ? ILibMemory_AllocateA(sizeof(PTRSIZE)*parms) : ILibMemory_SmartAllocateEx(sizeof(PTRSIZE)*parms, 6 * sizeof(void*));
duk_get_prop_string(ctx, -1, "_address"); // [func][addr] duk_get_prop_string(ctx, -1, "_address"); // [func][addr]
fptr = duk_to_pointer(ctx, -1); fptr = duk_to_pointer(ctx, -1);
@@ -1319,6 +1321,7 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvoke(duk_context *ctx)
args[2] = vars; args[2] = vars;
args[3] = (void*)(PTRSIZE)parms; args[3] = (void*)(PTRSIZE)parms;
args[4] = fptr; args[4] = fptr;
args[5] = (void*)duk_ctx_nonce(ctx);
void *thptr = ILibSpawnNormalThread(ILibDuktape_GenericMarshal_MethodInvoke_ThreadSink, args); void *thptr = ILibSpawnNormalThread(ILibDuktape_GenericMarshal_MethodInvoke_ThreadSink, args);
duk_push_fixed_buffer(ctx, sizeof(void*)); // [ret][buffer] duk_push_fixed_buffer(ctx, sizeof(void*)); // [ret][buffer]
@@ -1591,6 +1594,7 @@ void* ILibDuktape_GlobalGenericCallback_Process(int numParms, ...)
#endif #endif
sem_init(&(user->contextWaiter), 0, 0); sem_init(&(user->contextWaiter), 0, 0);
user->chain = refList[i]->chain; user->chain = refList[i]->chain;
user->ctxnonce = refList[i]->ctxnonce;
user->emitter = refList[i]->emitter; user->emitter = refList[i]->emitter;
user->numArgs = numParms; user->numArgs = numParms;
if (numParms > 0) if (numParms > 0)
@@ -1603,7 +1607,7 @@ void* ILibDuktape_GlobalGenericCallback_Process(int numParms, ...)
} }
va_end(vlist); va_end(vlist);
} }
ILibChain_RunOnMicrostackThreadEx3(refList[i]->chain, ILibDuktape_GlobalGenericCallback_ProcessEx, ILibDuktape_GlobalGenericCallback_ProcessEx_Abort, user); Duktape_RunOnEventLoop(refList[i]->chain, refList[i]->ctxnonce, refList[i]->emitter->ctx, ILibDuktape_GlobalGenericCallback_ProcessEx, ILibDuktape_GlobalGenericCallback_ProcessEx_Abort, user);
} }
else else
{ {
@@ -1897,6 +1901,7 @@ duk_ret_t ILibDuktape_GenericMarshal_GetGlobalGenericCallback(duk_context *ctx)
data = (Duktape_GlobalGeneric_Data*)ILibMemory_SmartAllocate(sizeof(Duktape_GlobalGeneric_Data)); data = (Duktape_GlobalGeneric_Data*)ILibMemory_SmartAllocate(sizeof(Duktape_GlobalGeneric_Data));
data->emitter = ILibDuktape_EventEmitter_Create(ctx); data->emitter = ILibDuktape_EventEmitter_Create(ctx);
data->ctxnonce = duk_ctx_nonce(ctx);
data->chain = Duktape_GetChain(ctx); data->chain = Duktape_GetChain(ctx);
ILibDuktape_EventEmitter_CreateEventEx(data->emitter, "GlobalCallback"); ILibDuktape_EventEmitter_CreateEventEx(data->emitter, "GlobalCallback");
ILibDuktape_CreateInstanceMethod(ctx, "CallingThread", ILibDuktape_GenericMarshal_GlobalCallback_CallingThread, 0); ILibDuktape_CreateInstanceMethod(ctx, "CallingThread", ILibDuktape_GenericMarshal_GlobalCallback_CallingThread, 0);

View File

@@ -60,6 +60,7 @@ struct HECI_CONNECT_client_data
#define ILibDuktape_HECI_IoctlWaitHandle "\xFF_HECI_IoctlWaitHandle" #define ILibDuktape_HECI_IoctlWaitHandle "\xFF_HECI_IoctlWaitHandle"
#define ILibDuktape_HECI_Child "\xFF_HECI_Child" #define ILibDuktape_HECI_Child "\xFF_HECI_Child"
#define ILibDuktape_HECI_Parent "\xFF_HECI_Parent" #define ILibDuktape_HECI_Parent "\xFF_HECI_Parent"
#define ILibDuktape_HECI_Root "\xFF_HECI_Root"
#define ILibDuktape_HECI_MaxBufferSize "\xFF_HECI_MaxBufSize" #define ILibDuktape_HECI_MaxBufferSize "\xFF_HECI_MaxBufSize"
#define ILibDuktape_HECI_SessionMemPtr "\xFF_HECI_SessionMemPtr" #define ILibDuktape_HECI_SessionMemPtr "\xFF_HECI_SessionMemPtr"
#define ILibDuktape_HECI_Session_NoPipeline "\xFF_HECI_Session_NoPipeline" #define ILibDuktape_HECI_Session_NoPipeline "\xFF_HECI_Session_NoPipeline"
@@ -90,6 +91,7 @@ public:
typedef struct ILibDuktape_HECI_ioctl_data typedef struct ILibDuktape_HECI_ioctl_data
{ {
duk_context *ctx; duk_context *ctx;
uintptr_t ctxnonce;
void *heciObject; void *heciObject;
void *data; void *data;
void *Q; void *Q;
@@ -263,9 +265,9 @@ duk_ret_t ILibDuktape_HECI_SessionFinalizer(duk_context *ctx)
void ILibDuktape_HECI_Session_EmitErrorEvent(void *chain, void *session) void ILibDuktape_HECI_Session_EmitErrorEvent(void *chain, void *session)
{ {
if (ILibIsRunningOnChainThread(chain) == 0) { ILibChain_RunOnMicrostackThreadEx(chain, ILibDuktape_HECI_Session_EmitErrorEvent, session); return; }
ILibDuktape_HECI_Session *s = (ILibDuktape_HECI_Session*)session; ILibDuktape_HECI_Session *s = (ILibDuktape_HECI_Session*)session;
duk_context *ctx = s->stream->readableStream->ctx; duk_context *ctx = s->stream->readableStream->ctx;
if (ILibIsRunningOnChainThread(chain) == 0) { Duktape_RunOnEventLoop(chain, duk_ctx_nonce(ctx), ctx, ILibDuktape_HECI_Session_EmitErrorEvent, NULL, session); return; }
duk_push_heapptr(ctx, s->stream->ParentObject); // [session] duk_push_heapptr(ctx, s->stream->ParentObject); // [session]
duk_get_prop_string(ctx, -1, "emit"); // [session][emit] duk_get_prop_string(ctx, -1, "emit"); // [session][emit]
@@ -277,7 +279,7 @@ void ILibDuktape_HECI_Session_EmitErrorEvent(void *chain, void *session)
} }
void ILibDuktape_HECI_Session_EmitStreamReady(void *chain, void *session) void ILibDuktape_HECI_Session_EmitStreamReady(void *chain, void *session)
{ {
if (ILibIsRunningOnChainThread(chain) == 0) { ILibChain_RunOnMicrostackThreadEx(chain, ILibDuktape_HECI_Session_EmitStreamReady, session); return; } if (ILibIsRunningOnChainThread(chain) == 0) { Duktape_RunOnEventLoop(chain, duk_ctx_nonce(((ILibDuktape_HECI_Session*)session)->stream->writableStream->ctx), ((ILibDuktape_HECI_Session*)session)->stream->writableStream->ctx, ILibDuktape_HECI_Session_EmitStreamReady, NULL, session); return; }
ILibDuktape_DuplexStream_Ready(((ILibDuktape_HECI_Session*)session)->stream); ILibDuktape_DuplexStream_Ready(((ILibDuktape_HECI_Session*)session)->stream);
} }
@@ -492,7 +494,7 @@ ILibTransport_DoneState ILibDuktape_HECI_Session_WriteSink(ILibDuktape_DuplexStr
else else
{ {
state->returnIgnored = 1; state->returnIgnored = 1;
ILibChain_RunOnMicrostackThreadEx(stream->readableStream->chain, (ILibChain_StartEvent)ILibDuktape_HECI_Session_WriteSink_NoPipeline, state); Duktape_RunOnEventLoop(stream->readableStream->chain, duk_ctx_nonce(stream->readableStream->ctx), stream->readableStream->ctx, (Duktape_EventLoopDispatch)ILibDuktape_HECI_Session_WriteSink_NoPipeline, NULL, state);
} }
} }
@@ -553,7 +555,7 @@ void ILibDuktape_HECI_Session_ResumeSink(ILibDuktape_DuplexStream *sender, void
ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user;
if (session->noPipelining != 0) if (session->noPipelining != 0)
{ {
ILibChain_RunOnMicrostackThread(sender->readableStream->chain, ILibDuktape_HECI_Session_ResumeSink_NoPipeline, session); Duktape_RunOnEventLoop(sender->readableStream->chain, duk_ctx_nonce(sender->readableStream->ctx), sender->readableStream->ctx, ILibDuktape_HECI_Session_ResumeSink_NoPipeline, NULL, session);
// Note: DO NOT 'return' here, because we still need to QueueUserAPC, to resume the stream on Windows // Note: DO NOT 'return' here, because we still need to QueueUserAPC, to resume the stream on Windows
} }
@@ -587,7 +589,7 @@ BOOL ILibDuktape_HECI_Session_ReceiveSink(HANDLE event, ILibWaitHandle_ErrorStat
ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user; ILibDuktape_HECI_Session *session = (ILibDuktape_HECI_Session*)user;
if (ILibMemory_CanaryOK(session)) if (ILibMemory_CanaryOK(session))
{ {
if (GetOverlappedResult(session->descriptor, &(session->v), &(session->bytesRead), FALSE) == TRUE) { ILibChain_RunOnMicrostackThreadEx(session->chain, ILibDuktape_HECI_Session_ReceiveSink2, session); } if (GetOverlappedResult(session->descriptor, &(session->v), &(session->bytesRead), FALSE) == TRUE) { Duktape_RunOnEventLoop(session->chain, duk_ctx_nonce(session->stream->readableStream->ctx), session->stream->readableStream->ctx, ILibDuktape_HECI_Session_ReceiveSink2, NULL, session); }
} }
return(FALSE); return(FALSE);
} }
@@ -770,6 +772,11 @@ duk_ret_t ILibDuktape_HECI_Session_close(duk_context *ctx)
} }
#endif #endif
duk_push_this(ctx); // [Session]
duk_get_prop_string(ctx, -1, ILibDuktape_HECI_Root); // [Session][root]
ILibDuktape_Push_ObjectStash(ctx); // [Session][root][stash]
duk_del_prop_string(ctx, -1, Duktape_GetStashKey(duk_get_heapptr(ctx, -3)));
return(0); return(0);
} }
duk_ret_t ILibDuktape_HECI_create(duk_context *ctx) duk_ret_t ILibDuktape_HECI_create(duk_context *ctx)
@@ -779,8 +786,17 @@ duk_ret_t ILibDuktape_HECI_create(duk_context *ctx)
ILibDuktape_HECI_Push(ctx, NULL); // [Session][HECI] ILibDuktape_HECI_Push(ctx, NULL); // [Session][HECI]
duk_dup(ctx, -2); // [Session][HECI][Session] duk_dup(ctx, -2); // [Session][HECI][Session]
duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Parent); // [Session][HECI] duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Parent); // [Session][HECI]
duk_push_this(ctx); // [session][HECI][root]
duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Root); // [session][HECI]
duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Child); // [Session] duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Child); // [Session]
duk_push_this(ctx); // [Session][root]
ILibDuktape_Push_ObjectStash(ctx); // [Session][root][stash]
duk_dup(ctx, -3); // [Session][root][stash][Session]
duk_put_prop_string(ctx, -2, Duktape_GetStashKey(duk_get_heapptr(ctx, -1))); // [Session][root][stash]
duk_pop(ctx); // [Session][root]
duk_put_prop_string(ctx, -2, ILibDuktape_HECI_Root); // [Session]
ILibDuktape_EventEmitter *emitter = ILibDuktape_EventEmitter_Create(ctx); ILibDuktape_EventEmitter *emitter = ILibDuktape_EventEmitter_Create(ctx);
ILibDuktape_EventEmitter_CreateEventEx(emitter, "connect"); ILibDuktape_EventEmitter_CreateEventEx(emitter, "connect");
ILibDuktape_EventEmitter_CreateEventEx(emitter, "error"); ILibDuktape_EventEmitter_CreateEventEx(emitter, "error");
@@ -872,7 +888,7 @@ BOOL ILibDuktape_HECI_IoctlHandler(HANDLE h, ILibWaitHandle_ErrorStatus errors,
return(FALSE); return(FALSE);
} }
ILibChain_RunOnMicrostackThread(data->chain, ILibDuktape_HECI_IoctlHandler_Dispatch, data); Duktape_RunOnEventLoop(data->chain, data->ctxnonce, data->ctx, ILibDuktape_HECI_IoctlHandler_Dispatch, NULL, data);
if (ILibQueue_GetCount(Q) > 0) if (ILibQueue_GetCount(Q) > 0)
{ {
@@ -961,6 +977,7 @@ duk_ret_t ILibDuktape_HECI_doIoctl(duk_context *ctx)
duk_push_array(ctx); // [heci][stash][array] duk_push_array(ctx); // [heci][stash][array]
ILibDuktape_HECI_ioctl_data *data; ILibDuktape_HECI_ioctl_data *data;
data = (ILibDuktape_HECI_ioctl_data*)ILibMemory_SmartAllocate(bufferLen + sizeof(ILibDuktape_HECI_ioctl_data)); data = (ILibDuktape_HECI_ioctl_data*)ILibMemory_SmartAllocate(bufferLen + sizeof(ILibDuktape_HECI_ioctl_data));
data->ctxnonce = duk_ctx_nonce(ctx);
if (ILibDuktape_HECI_Debug) { printf("-> Allocate HECI Ioctl Data [%p]\n", (void*)data); } if (ILibDuktape_HECI_Debug) { printf("-> Allocate HECI Ioctl Data [%p]\n", (void*)data); }
data->reserved = Duktape_PushBuffer(ctx, sizeof(void*)); // [heci][stash][array][ptr] data->reserved = Duktape_PushBuffer(ctx, sizeof(void*)); // [heci][stash][array][ptr]
duk_put_prop_index(ctx, -2, 0); // [heci][stash][array] duk_put_prop_index(ctx, -2, 0); // [heci][stash][array]
@@ -1058,7 +1075,7 @@ duk_ret_t ILibDuktape_HECI_Finalizer(duk_context *ctx)
ILibQueue Q = (ILibQueue)Duktape_GetPointerProperty(ctx, 0, ILibDuktape_HECI_Q); ILibQueue Q = (ILibQueue)Duktape_GetPointerProperty(ctx, 0, ILibDuktape_HECI_Q);
duk_get_prop_string(ctx, 0, ILibDuktape_HECI_ChildProcess); duk_get_prop_string(ctx, 0, ILibDuktape_HECI_ChildProcess);
ILibProcessPipe_Manager mgr = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager); ILibProcessPipe_Manager mgr = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager);
QueueUserAPC((PAPCFUNC)ILibDuktape_HECI_Finalizer2, ILibProcessPipe_Manager_GetWorkerThread(mgr), (ULONG_PTR)Q); if (mgr != NULL) { QueueUserAPC((PAPCFUNC)ILibDuktape_HECI_Finalizer2, ILibProcessPipe_Manager_GetWorkerThread(mgr), (ULONG_PTR)Q); }
#else #else
duk_get_prop_string(ctx, 0, ILibDuktape_HECI_Q); duk_get_prop_string(ctx, 0, ILibDuktape_HECI_Q);
ILibQueue_Destroy((ILibQueue)duk_get_pointer(ctx, -1)); ILibQueue_Destroy((ILibQueue)duk_get_pointer(ctx, -1));

View File

@@ -40,6 +40,56 @@ struct sockaddr_in6 duktape_internalAddress;
#define ILibDuktape_UncaughtException_NativeHandler "\xFF_UncaughtNativeHandler" #define ILibDuktape_UncaughtException_NativeHandler "\xFF_UncaughtNativeHandler"
#define ILibDuktape_UncaughtException_NativeUser "\xFF_UncaughtNativeUser" #define ILibDuktape_UncaughtException_NativeUser "\xFF_UncaughtNativeUser"
typedef struct Duktape_EventLoopDispatchData
{
duk_context *ctx;
uintptr_t nonce;
Duktape_EventLoopDispatch handler;
Duktape_EventLoopDispatch abortHandler;
void *user;
}Duktape_EventLoopDispatchData;
void Duktape_RunOnEventLoop_AbortSink(void *chain, void *user)
{
Duktape_EventLoopDispatchData *tmp = (Duktape_EventLoopDispatchData*)user;
if (tmp->abortHandler == (Duktape_EventLoopDispatch)(uintptr_t)0x01)
{
if (tmp->user != NULL) { free(tmp->user); }
}
else if(tmp->abortHandler != NULL)
{
tmp->abortHandler(chain, tmp->user);
}
ILibMemory_Free(tmp);
}
void Duktape_RunOnEventLoop_Sink(void *chain, void *user)
{
Duktape_EventLoopDispatchData *tmp = (Duktape_EventLoopDispatchData*)user;
if (duk_ctx_is_alive(tmp->ctx) && duk_ctx_is_valid(tmp->nonce, tmp->ctx))
{
// duk_context matches the intended context
if (tmp->handler != NULL) { tmp->handler(chain, tmp->user); }
}
else
{
// duk_context does not match the intended context
Duktape_RunOnEventLoop_AbortSink(chain, user);
return;
}
ILibMemory_Free(tmp);
}
void Duktape_RunOnEventLoop(void *chain, uintptr_t nonce, duk_context *ctx, Duktape_EventLoopDispatch handler, Duktape_EventLoopDispatch abortHandler, void *user)
{
Duktape_EventLoopDispatchData* tmp = (Duktape_EventLoopDispatchData*)ILibMemory_SmartAllocate(sizeof(Duktape_EventLoopDispatchData));
tmp->ctx = ctx;
tmp->nonce = nonce;
tmp->handler = handler;
tmp->abortHandler = abortHandler;
tmp->user = user;
ILibChain_RunOnMicrostackThreadEx3(chain, Duktape_RunOnEventLoop_Sink, Duktape_RunOnEventLoop_AbortSink, tmp);
}
int ILibDuktape_GetReferenceCount(duk_context *ctx, duk_idx_t i) int ILibDuktape_GetReferenceCount(duk_context *ctx, duk_idx_t i)
{ {
int retVal = -1; int retVal = -1;
@@ -119,6 +169,21 @@ void *Duktape_GetBufferPropertyEx(duk_context *ctx, duk_idx_t i, char* propertyN
} }
return(retVal); return(retVal);
} }
void *Duktape_Duplicate_GetBufferPropertyEx(duk_context *ctx, duk_idx_t i, char* propertyName, duk_size_t* bufferLen)
{
duk_size_t sourceLen = 0;
void *retVal = NULL, *source;
if (bufferLen != NULL) { *bufferLen = 0; }
source = Duktape_GetBufferPropertyEx(ctx, i, propertyName, &sourceLen);
if (sourceLen > 0)
{
retVal = ILibMemory_SmartAllocate(sourceLen);
memcpy_s(retVal, sourceLen, source, sourceLen);
if (bufferLen != NULL) { *bufferLen = sourceLen; }
}
return(retVal);
}
void *Duktape_GetPointerProperty(duk_context *ctx, duk_idx_t i, char* propertyName) void *Duktape_GetPointerProperty(duk_context *ctx, duk_idx_t i, char* propertyName)
{ {
void *retVal = NULL; void *retVal = NULL;
@@ -146,6 +211,36 @@ char* Duktape_GetStringPropertyValueEx(duk_context *ctx, duk_idx_t i, char* prop
} }
return retVal; return retVal;
} }
char* Duktape_Duplicate_GetStringPropertyValueEx(duk_context *ctx, duk_idx_t i, char* propertyName, char* defaultValue, duk_size_t *len)
{
char *ret = NULL;
if (len != NULL) { *len = 0; }
duk_size_t sourceLen = 0;
char *source = Duktape_GetStringPropertyValueEx(ctx, i, propertyName, defaultValue, &sourceLen);
if (sourceLen > 0)
{
if (len != NULL) { *len = sourceLen; }
ret = (char*)ILibMemory_SmartAllocate(sourceLen + 1);
memcpy_s(ret, sourceLen, source, sourceLen);
}
return(ret);
}
char *Duktape_Duplicate_GetStringEx(duk_context *ctx, duk_idx_t i, duk_size_t *len)
{
char *ret = NULL;
duk_size_t srcLen = 0;
char* src = (char*)duk_get_lstring(ctx, i, &srcLen);
if (len != NULL) { *len = srcLen; }
if (srcLen > 0)
{
ret = ILibMemory_SmartAllocate(srcLen);
memcpy_s(ret, srcLen, src, srcLen);
}
return(ret);
}
int Duktape_GetIntPropertyValue(duk_context *ctx, duk_idx_t i, char* propertyName, int defaultValue) int Duktape_GetIntPropertyValue(duk_context *ctx, duk_idx_t i, char* propertyName, int defaultValue)
{ {
int retVal = defaultValue; int retVal = defaultValue;
@@ -544,21 +639,26 @@ char* Duktape_GetContextGuidHex(duk_context *ctx, void *db)
duk_pop(ctx); // ... duk_pop(ctx); // ...
return retVal; return retVal;
} }
ILibDuktape_ContextData* ILibDuktape_GetContextData(duk_context *ctx)
{
duk_memory_functions mfuncs;
memset(&mfuncs, 0, sizeof(duk_memory_functions));
duk_get_memory_functions(ctx, &mfuncs);
return((ILibDuktape_ContextData*)mfuncs.udata);
}
void Duktape_SafeDestroyHeap(duk_context *ctx)
{
ILibDuktape_ContextData *ctxd = duk_ctx_context_data(ctx);
ctxd->flags |= duk_destroy_heap_in_progress;
duk_destroy_heap(ctx);
ILibMemory_Free(ctxd);
}
void *Duktape_GetChain(duk_context *ctx) void *Duktape_GetChain(duk_context *ctx)
{ {
void *retVal = NULL; void *ret = duk_ctx_chain(ctx);
duk_push_heap_stash(ctx); // [stash] return(ret);
if (duk_has_prop_string(ctx, -1, ILibDuktape_Context_Chain))
{
duk_get_prop_string(ctx, -1, ILibDuktape_Context_Chain); // [stash][ptr]
retVal = duk_get_pointer(ctx, -1);
duk_pop_2(ctx); // ...
}
else
{
duk_pop(ctx); // ...
}
return retVal;
} }
duk_ret_t ILibDuktape_ExternalEventEmitter(duk_context *ctx) duk_ret_t ILibDuktape_ExternalEventEmitter(duk_context *ctx)
{ {

View File

@@ -30,7 +30,6 @@ typedef void(*ILibDuktape_HelperEvent)(duk_context *ctx, void *user);
#define ILibDuktape_MeshAgent_Cert_NonLeaf "\xFF_selfcert" #define ILibDuktape_MeshAgent_Cert_NonLeaf "\xFF_selfcert"
#define ILibDuktape_MeshAgent_Cert_Server "\xFF_selftlscert" #define ILibDuktape_MeshAgent_Cert_Server "\xFF_selftlscert"
#define CONTEXT_GUID_BUFFER "_CONTEXT_GUID" #define CONTEXT_GUID_BUFFER "_CONTEXT_GUID"
#define ILibDuktape_Context_Chain "\xFF_chainptr"
#define ILibDuktape_OBJID "_ObjectID" #define ILibDuktape_OBJID "_ObjectID"
#define ILibDuktape_CR2HTTP "\xFF_CR2HTTP" #define ILibDuktape_CR2HTTP "\xFF_CR2HTTP"
@@ -47,8 +46,29 @@ typedef enum ILibDuktape_LogTypes
ILibDuktape_LogType_Info3 ILibDuktape_LogType_Info3
}ILibDuktape_LogTypes; }ILibDuktape_LogTypes;
typedef struct ILibDuktape_ContextData
{
uintptr_t nonce;
uint32_t flags;
void *chain;
void *user;
}ILibDuktape_ContextData;
#define duk_destroy_heap_in_progress 0x01
#define duk_ctx_context_data(ctx) ((ILibDuktape_ContextData*)(ILibMemory_CanaryOK(ctx)?((void**)ILibMemory_Extra(ctx))[0]:NULL))
#define duk_ctx_nonce(ctx) (duk_ctx_context_data(ctx)->nonce)
#define duk_ctx_is_alive(ctx) (ILibMemory_CanaryOK(ctx))
#define duk_ctx_is_valid(nvalue, ctx) (duk_ctx_is_alive(ctx) && duk_ctx_nonce(ctx) == nvalue)
#define duk_ctx_shutting_down(ctx) ((duk_ctx_context_data(ctx)->flags & duk_destroy_heap_in_progress)==duk_destroy_heap_in_progress)
#define duk_ctx_chain(ctx) (duk_ctx_is_alive(ctx)?duk_ctx_context_data(ctx)->chain:NULL)
typedef void(*Duktape_EventLoopDispatch)(void *chain, void *user);
void Duktape_RunOnEventLoop(void *chain, uintptr_t nonce, duk_context *ctx, Duktape_EventLoopDispatch handler, Duktape_EventLoopDispatch abortHandler, void *user);
#define Duktape_RunOnEventLoopEx(chain, nonce, ctx, handler, user, freeOnShutdown) Duktape_RunOnEventLoop(chain, nonce, ctx, handler, (freeOnShutdown==0?NULL:(Duktape_EventLoopDispatch)(uintptr_t)0x01), user)
void ILibDuktape_Log_Object(duk_context *ctx, duk_idx_t i, char *meta); void ILibDuktape_Log_Object(duk_context *ctx, duk_idx_t i, char *meta);
char* Duktape_GetContextGuidHex(duk_context *ctx, void *db); char* Duktape_GetContextGuidHex(duk_context *ctx, void *db);
void Duktape_SafeDestroyHeap(duk_context *ctx);
void *Duktape_GetChain(duk_context *ctx); void *Duktape_GetChain(duk_context *ctx);
char *Duktape_GetStashKey(void* value); char *Duktape_GetStashKey(void* value);
char* Duktape_GetBuffer(duk_context *ctx, duk_idx_t i, duk_size_t *bufLen); char* Duktape_GetBuffer(duk_context *ctx, duk_idx_t i, duk_size_t *bufLen);
@@ -61,6 +81,14 @@ void *Duktape_GetPointerProperty(duk_context *ctx, duk_idx_t i, char* propertyNa
void *Duktape_GetHeapptrProperty(duk_context *ctx, duk_idx_t i, char* propertyName); void *Duktape_GetHeapptrProperty(duk_context *ctx, duk_idx_t i, char* propertyName);
void *Duktape_GetBufferPropertyEx(duk_context *ctx, duk_idx_t i, char* propertyName, duk_size_t* bufferLen); void *Duktape_GetBufferPropertyEx(duk_context *ctx, duk_idx_t i, char* propertyName, duk_size_t* bufferLen);
#define Duktape_GetBufferProperty(ctx, i, propertyName) Duktape_GetBufferPropertyEx(ctx, i, propertyName, NULL) #define Duktape_GetBufferProperty(ctx, i, propertyName) Duktape_GetBufferPropertyEx(ctx, i, propertyName, NULL)
char* Duktape_Duplicate_GetStringPropertyValueEx(duk_context *ctx, duk_idx_t i, char* propertyName, char* defaultValue, duk_size_t *len);
#define Duktape_Duplicate_GetStringPropertyValue(ctx, i, propertyName, defaultValue) Duktape_Duplicate_GetStringPropertyValueEx(ctx, i, propertyName, defaultValue, NULL)
void *Duktape_Duplicate_GetBufferPropertyEx(duk_context *ctx, duk_idx_t i, char* propertyName, duk_size_t* bufferLen);
#define Duktape_Duplicate_GetBufferProperty(ctx, i, propertyName) Duktape_Duplicate_GetBufferPropertyEx(ctx, i, propertyName, NULL)
char *Duktape_Duplicate_GetStringEx(duk_context *ctx, duk_idx_t i, duk_size_t *len);
#define Duktape_Duplicate_GetString(ctx, i) Duktape_Duplicate_GetStringEx(ctx, i, NULL)
int Duktape_GetBooleanProperty(duk_context *ctx, duk_idx_t i, char *propertyName, int defaultValue); int Duktape_GetBooleanProperty(duk_context *ctx, duk_idx_t i, char *propertyName, int defaultValue);
struct sockaddr_in6* Duktape_IPAddress4_FromString(char* address, unsigned short port); struct sockaddr_in6* Duktape_IPAddress4_FromString(char* address, unsigned short port);
struct sockaddr_in6* Duktape_IPAddress6_FromString(char* address, unsigned short port); struct sockaddr_in6* Duktape_IPAddress6_FromString(char* address, unsigned short port);

View File

@@ -1894,7 +1894,7 @@ ILibTransport_DoneState ILibDuktape_HttpStream_WriteSink(ILibDuktape_DuplexStrea
tmp->httpStream = data; tmp->httpStream = data;
tmp->bufferLen = bufferLen; tmp->bufferLen = bufferLen;
memcpy_s(tmp->buffer, bufferLen, buffer, bufferLen); memcpy_s(tmp->buffer, bufferLen, buffer, bufferLen);
ILibChain_RunOnMicrostackThread(data->chain, ILibDuktape_HttpStream_WriteSink_ChainSink, tmp); Duktape_RunOnEventLoop(data->chain, duk_ctx_nonce(data->DS->readableStream->ctx), data->DS->readableStream->ctx, ILibDuktape_HttpStream_WriteSink_ChainSink, NULL, tmp);
return(ILibTransport_DoneState_INCOMPLETE); return(ILibTransport_DoneState_INCOMPLETE);
} }
@@ -2195,8 +2195,8 @@ ILibTransport_DoneState ILibDuktape_HttpStream_ServerResponse_WriteSink(struct I
buffered->endBytes = stream->endBytes; buffered->endBytes = stream->endBytes;
buffered->chunk = state->chunkSupported; buffered->chunk = state->chunkSupported;
if (bufferLen > 0) { memcpy_s(buffered->buffer, bufferLen, buffer, bufferLen); } if (bufferLen > 0) { memcpy_s(buffered->buffer, bufferLen, buffer, bufferLen); }
ILibChain_RunOnMicrostackThreadEx(state->chain, ILibDuktape_HttpStream_ServerResponse_WriteImplicitHeaders, buffered); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(state->ctx), state->ctx, ILibDuktape_HttpStream_ServerResponse_WriteImplicitHeaders, NULL, buffered);
return(ILibTransport_DoneState_INCOMPLETE); return(ILibTransport_DoneState_INCOMPLETE);
} }
} }
@@ -2283,7 +2283,7 @@ ILibTransport_DoneState ILibDuktape_HttpStream_ServerResponse_WriteSink(struct I
data->writeStream = state->writeStream; data->writeStream = state->writeStream;
data->bufferLen = bufferLen; data->bufferLen = bufferLen;
memcpy_s(data->buffer, bufferLen, buffer, bufferLen); memcpy_s(data->buffer, bufferLen, buffer, bufferLen);
ILibChain_RunOnMicrostackThreadEx(state->chain, ILibDuktape_HttpStream_ServerResponse_WriteSink_Chain, data); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(state->ctx), state->ctx, ILibDuktape_HttpStream_ServerResponse_WriteSink_Chain, NULL, data);
return(ILibTransport_DoneState_INCOMPLETE); return(ILibTransport_DoneState_INCOMPLETE);
} }
} }
@@ -2384,7 +2384,7 @@ void ILibDuktape_HttpStream_ServerResponse_EndSink(struct ILibDuktape_WritableSt
else else
{ {
// Need to context switch before sending Implicit Headers // Need to context switch before sending Implicit Headers
ILibChain_RunOnMicrostackThreadEx(state->chain, ILibDuktape_HttpStream_ServerResponse_EndSink_Chain, stream); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(stream->ctx), stream->ctx, ILibDuktape_HttpStream_ServerResponse_EndSink_Chain, NULL, stream);
} }
} }
else else
@@ -2396,7 +2396,7 @@ void ILibDuktape_HttpStream_ServerResponse_EndSink(struct ILibDuktape_WritableSt
} }
else else
{ {
ILibChain_RunOnMicrostackThread(state->chain, ILibDuktape_HttpStream_ServerResponse_EndSink_ZeroChunk_Chain, state); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(stream->ctx), stream->ctx, ILibDuktape_HttpStream_ServerResponse_EndSink_ZeroChunk_Chain, NULL, state);
} }
} }
} }
@@ -2890,6 +2890,10 @@ int ILibDuktape_HttpStream_IncomingMessage_UnshiftBytes(ILibDuktape_readableStre
data->bodyStream_unshiftedBytes = unshiftBytes; data->bodyStream_unshiftedBytes = unshiftBytes;
return(unshiftBytes); return(unshiftBytes);
} }
void ILibDuktape_HttpStream_DispatchEnd_ABORT(void *chain, void *user)
{
free(user);
}
void ILibDuktape_HttpStream_DispatchEnd(void *chain, void *user) void ILibDuktape_HttpStream_DispatchEnd(void *chain, void *user)
{ {
if(ILibMemory_CanaryOK(((void**)user)[1])) if(ILibMemory_CanaryOK(((void**)user)[1]))
@@ -2931,6 +2935,7 @@ void ILibDuktape_HttpStream_OnReceive(ILibWebClient_StateObject WebStateObject,
{ {
ILibDuktape_HttpStream_Data *data = (ILibDuktape_HttpStream_Data*)user1; ILibDuktape_HttpStream_Data *data = (ILibDuktape_HttpStream_Data*)user1;
duk_context *ctx = data->DS->writableStream->ctx; duk_context *ctx = data->DS->writableStream->ctx;
uintptr_t ctxnonce = duk_ctx_nonce(ctx);
if (data->bodyStream != NULL) if (data->bodyStream != NULL)
{ {
@@ -3170,7 +3175,7 @@ void ILibDuktape_HttpStream_OnReceive(ILibWebClient_StateObject WebStateObject,
tmp[0] = ctx; tmp[0] = ctx;
tmp[1] = data->DS; tmp[1] = data->DS;
tmp[2] = data; tmp[2] = data;
ILibChain_RunOnMicrostackThread(data->chain, ILibDuktape_HttpStream_DispatchEnd, tmp); Duktape_RunOnEventLoop(data->chain, ctxnonce, ctx, ILibDuktape_HttpStream_DispatchEnd, ILibDuktape_HttpStream_DispatchEnd_ABORT, tmp);
} }
} }
} }
@@ -3221,7 +3226,6 @@ duk_ret_t ILibduktape_HttpStream_create(duk_context *ctx)
duk_put_prop_string(ctx, -2, ILibDuktape_HTTPStream2Data); // [httpStream] duk_put_prop_string(ctx, -2, ILibDuktape_HTTPStream2Data); // [httpStream]
data->maxHeaderSize = 4096; data->maxHeaderSize = 4096;
ILibDuktape_EventEmitter_CreateEventEx(emitter, "end"); ILibDuktape_EventEmitter_CreateEventEx(emitter, "end");
ILibDuktape_EventEmitter_CreateEventEx(emitter, "error"); ILibDuktape_EventEmitter_CreateEventEx(emitter, "error");
ILibDuktape_EventEmitter_CreateEventEx(emitter, "parseError"); ILibDuktape_EventEmitter_CreateEventEx(emitter, "parseError");
@@ -3972,7 +3976,7 @@ void ILibDuktape_httpStream_webSocket_EncodedPauseSink(ILibDuktape_DuplexStream
} }
else else
{ {
ILibChain_RunOnMicrostackThreadEx(state->chain, ILibDuktape_httpStream_webSocket_EncodedPauseSink_Chain, state); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(state->ctx), state->ctx, ILibDuktape_httpStream_webSocket_EncodedPauseSink_Chain, NULL, state);
} }
} }
} }
@@ -4007,7 +4011,7 @@ void ILibDuktape_httpStream_webSocket_EncodedResumeSink(ILibDuktape_DuplexStream
} }
else else
{ {
ILibChain_RunOnMicrostackThreadEx(state->chain, ILibDuktape_httpStream_webSocket_EncodedResumeSink_Chain, state); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(state->ctx), state->ctx, ILibDuktape_httpStream_webSocket_EncodedResumeSink_Chain, NULL, state);
} }
} }
} }
@@ -4064,7 +4068,7 @@ void ILibDuktape_httpStream_webSocket_DecodedPauseSink(ILibDuktape_DuplexStream
} }
else else
{ {
ILibChain_RunOnMicrostackThreadEx(state->chain, ILibDuktape_httpStream_webSocket_DecodedPauseSink_Chain, state); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(state->ctx), state->ctx, ILibDuktape_httpStream_webSocket_DecodedPauseSink_Chain, NULL, state);
} }
} }
} }
@@ -4102,7 +4106,7 @@ void ILibDuktape_httpStream_webSocket_DecodedResumeSink(ILibDuktape_DuplexStream
} }
else else
{ {
ILibChain_RunOnMicrostackThreadEx(state->chain, ILibDuktape_httpStream_webSocket_DecodedResumeSink_Chain, state); Duktape_RunOnEventLoop(state->chain, duk_ctx_nonce(state->ctx), state->ctx, ILibDuktape_httpStream_webSocket_DecodedResumeSink_Chain, NULL, state);
} }
} }
} }

File diff suppressed because one or more lines are too long

View File

@@ -102,6 +102,7 @@ public:
typedef struct ILibDuktape_readableStream_bufferedData typedef struct ILibDuktape_readableStream_bufferedData
{ {
struct ILibDuktape_readableStream_bufferedData *Next; struct ILibDuktape_readableStream_bufferedData *Next;
duk_context *ctx;
int bufferLen; int bufferLen;
int Reserved; int Reserved;
char buffer[]; char buffer[];
@@ -123,6 +124,7 @@ void ILibDuktape_ReadableStream_DestroyPausedData(ILibDuktape_readableStream *st
void ILibDuktape_readableStream_WriteData_buffer(ILibDuktape_readableStream *stream, int streamReserved, char *buffer, int bufferLen) void ILibDuktape_readableStream_WriteData_buffer(ILibDuktape_readableStream *stream, int streamReserved, char *buffer, int bufferLen)
{ {
ILibDuktape_readableStream_bufferedData *buffered = (ILibDuktape_readableStream_bufferedData*)ILibMemory_Allocate(bufferLen + sizeof(ILibDuktape_readableStream_bufferedData), 0, NULL, NULL); ILibDuktape_readableStream_bufferedData *buffered = (ILibDuktape_readableStream_bufferedData*)ILibMemory_Allocate(bufferLen + sizeof(ILibDuktape_readableStream_bufferedData), 0, NULL, NULL);
buffered->ctx = stream->ctx;
buffered->Reserved = streamReserved; buffered->Reserved = streamReserved;
buffered->bufferLen = bufferLen; buffered->bufferLen = bufferLen;
memcpy_s(buffered->buffer, bufferLen, buffer, bufferLen); memcpy_s(buffered->buffer, bufferLen, buffer, bufferLen);
@@ -282,7 +284,7 @@ void __stdcall ILibDuktape_readableStream_WriteData_OnData_ChainThread_APC(ULONG
// This APC interrupted a winsock (select) call, so we must unroll the callstack to continue, // This APC interrupted a winsock (select) call, so we must unroll the callstack to continue,
// because winsock is not re-entrant, so we cannot risk making another winsock call directly. // because winsock is not re-entrant, so we cannot risk making another winsock call directly.
// //
ILibChain_RunOnMicrostackThreadEx2(chain, ILibDuktape_readableStream_WriteData_OnData_ChainThread, (void*)obj, 0); Duktape_RunOnEventLoop(chain, duk_ctx_nonce(data->ctx), data->ctx, ILibDuktape_readableStream_WriteData_OnData_ChainThread, NULL, (void*)obj);
} }
else else
{ {
@@ -351,13 +353,14 @@ int ILibDuktape_readableStream_WriteDataEx(ILibDuktape_readableStream *stream, i
if (ILibIsRunningOnChainThread(stream->chain) == 0) if (ILibIsRunningOnChainThread(stream->chain) == 0)
{ {
ILibDuktape_readableStream_bufferedData *tmp = (ILibDuktape_readableStream_bufferedData*)ILibMemory_Allocate(sizeof(ILibDuktape_readableStream_bufferedData) + bufferLen, 0, NULL, NULL); ILibDuktape_readableStream_bufferedData *tmp = (ILibDuktape_readableStream_bufferedData*)ILibMemory_Allocate(sizeof(ILibDuktape_readableStream_bufferedData) + bufferLen, 0, NULL, NULL);
tmp->ctx = stream->ctx;
tmp->Next = (ILibDuktape_readableStream_bufferedData*)stream; tmp->Next = (ILibDuktape_readableStream_bufferedData*)stream;
tmp->Reserved = streamReserved; tmp->Reserved = streamReserved;
tmp->bufferLen = bufferLen; tmp->bufferLen = bufferLen;
memcpy_s(tmp->buffer, bufferLen, buffer, bufferLen); memcpy_s(tmp->buffer, bufferLen, buffer, bufferLen);
dispatchedNonNative = 1; dispatchedNonNative = 1;
needPause = 1; needPause = 1;
ILibChain_RunOnMicrostackThreadEx(stream->chain, ILibDuktape_readableStream_WriteDataEx_Chain, tmp); Duktape_RunOnEventLoop(stream->chain, duk_ctx_nonce(stream->ctx), stream->ctx, ILibDuktape_readableStream_WriteDataEx_Chain, NULL, tmp);
} }
else else
{ {
@@ -423,6 +426,7 @@ int ILibDuktape_readableStream_WriteDataEx(ILibDuktape_readableStream *stream, i
#else #else
ILibDuktape_readableStream_bufferedData *tmp = (ILibDuktape_readableStream_bufferedData*)ILibMemory_Allocate(sizeof(ILibDuktape_readableStream_bufferedData) + bufferLen, 0, NULL, NULL); ILibDuktape_readableStream_bufferedData *tmp = (ILibDuktape_readableStream_bufferedData*)ILibMemory_Allocate(sizeof(ILibDuktape_readableStream_bufferedData) + bufferLen, 0, NULL, NULL);
#endif #endif
tmp->ctx = stream->ctx;
tmp->bufferLen = bufferLen; tmp->bufferLen = bufferLen;
tmp->Reserved = streamReserved; tmp->Reserved = streamReserved;
tmp->Next = (ILibDuktape_readableStream_bufferedData*)stream; tmp->Next = (ILibDuktape_readableStream_bufferedData*)stream;
@@ -435,7 +439,7 @@ int ILibDuktape_readableStream_WriteDataEx(ILibDuktape_readableStream *stream, i
QueueUserAPC((PAPCFUNC)ILibDuktape_readableStream_WriteData_OnData_ChainThread_APC, ILibChain_GetMicrostackThreadHandle(stream->chain), (ULONG_PTR)tmp); QueueUserAPC((PAPCFUNC)ILibDuktape_readableStream_WriteData_OnData_ChainThread_APC, ILibChain_GetMicrostackThreadHandle(stream->chain), (ULONG_PTR)tmp);
return(stream->paused); return(stream->paused);
#else #else
ILibChain_RunOnMicrostackThread(stream->chain, ILibDuktape_readableStream_WriteData_OnData_ChainThread, tmp); Duktape_RunOnEventLoop(stream->chain, duk_ctx_nonce(stream->ctx), stream->ctx, ILibDuktape_readableStream_WriteData_OnData_ChainThread, NULL, tmp);
#endif #endif
} }
} }
@@ -469,7 +473,7 @@ int ILibDuktape_readableStream_WriteEnd(ILibDuktape_readableStream *stream)
if (ILibIsRunningOnChainThread(stream->chain) == 0) if (ILibIsRunningOnChainThread(stream->chain) == 0)
{ {
// Must context switch to Microstack Thread, in order to dispatch into Java Script // Must context switch to Microstack Thread, in order to dispatch into Java Script
ILibChain_RunOnMicrostackThread(stream->chain, ILibDuktape_readableStream_WriteEnd_ChainSink, stream); Duktape_RunOnEventLoop(stream->chain, duk_ctx_nonce(stream->ctx), stream->ctx, ILibDuktape_readableStream_WriteEnd_ChainSink, NULL, stream);
} }
else else
{ {

View File

@@ -165,6 +165,7 @@ typedef struct ILibDuktape_ScriptContainer_Master
ILibProcessPipe_Process child; ILibProcessPipe_Process child;
void *chain; void *chain;
void *PeerThread, *PeerChain; void *PeerThread, *PeerChain;
duk_context *PeerCTX;
unsigned int ChildSecurityFlags; unsigned int ChildSecurityFlags;
}ILibDuktape_ScriptContainer_Master; }ILibDuktape_ScriptContainer_Master;
@@ -225,7 +226,7 @@ void ILibDuktape_ScriptContainer_Slave_SendJSON(duk_context *ctx)
cmd->container.master = master; cmd->container.master = master;
memcpy_s(cmd->json, jsonLen, json, jsonLen); memcpy_s(cmd->json, jsonLen, json, jsonLen);
cmd->json[jsonLen] = 0; cmd->json[jsonLen] = 0;
ILibChain_RunOnMicrostackThread2(master->chain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1); Duktape_RunOnEventLoopEx(master->chain, duk_ctx_nonce(master->ctx), master->ctx, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1);
return; return;
} }
@@ -496,7 +497,7 @@ void ILibDuktape_ScriptContainer_Process_ExitCallback(void *obj)
if (ILibMemory_CanaryOK(obj)) if (ILibMemory_CanaryOK(obj))
{ {
duk_context *ctx = ((void**)obj)[0]; duk_context *ctx = ((void**)obj)[0];
duk_destroy_heap(ctx); Duktape_SafeDestroyHeap(ctx);
} }
} }
duk_ret_t ILibDuktape_ScriptContainer_Process_Exit(duk_context *ctx) duk_ret_t ILibDuktape_ScriptContainer_Process_Exit(duk_context *ctx)
@@ -1313,51 +1314,71 @@ void ILibDuktape_ScriptContainer_ExecTimeout(void *obj)
duk_put_prop_string(ctx, -2, ILibDuktape_ScriptContainer_ExitCode); // [g][process] duk_put_prop_string(ctx, -2, ILibDuktape_ScriptContainer_ExitCode); // [g][process]
duk_pop_2(ctx); // ... duk_pop_2(ctx); // ...
duk_destroy_heap(ctx); Duktape_SafeDestroyHeap(ctx);
} }
SCRIPT_ENGINE_SETTINGS *ILibDuktape_ScriptContainer_GetSettings(duk_context *ctx) SCRIPT_ENGINE_SETTINGS* ILibDuktape_ScriptContainer_GetSettings(duk_context *ctx)
{ {
SCRIPT_ENGINE_SETTINGS *retVal = (SCRIPT_ENGINE_SETTINGS*)ILibScratchPad; SCRIPT_ENGINE_SETTINGS *settings = (SCRIPT_ENGINE_SETTINGS*)ILibMemory_SmartAllocate(sizeof(SCRIPT_ENGINE_SETTINGS));
memset(retVal, 0, sizeof(SCRIPT_ENGINE_SETTINGS)); memset(settings, 0, sizeof(SCRIPT_ENGINE_SETTINGS));
retVal->chain = Duktape_GetChain(ctx); settings->chain = Duktape_GetChain(ctx);
duk_push_heap_stash(ctx); // [s] duk_push_heap_stash(ctx); // [s]
retVal->securityFlags = (SCRIPT_ENGINE_SECURITY_FLAGS)Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_ScriptContainer_Settings_SecurityFlags, 0); // [s] settings->securityFlags = (SCRIPT_ENGINE_SECURITY_FLAGS)Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_ScriptContainer_Settings_SecurityFlags, 0); // [s]
retVal->executionTimeout = (unsigned int)Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_ScriptContainer_Settings_ExecutionTimeout, 0); // [s] settings->executionTimeout = (unsigned int)Duktape_GetIntPropertyValue(ctx, -1, ILibDuktape_ScriptContainer_Settings_ExecutionTimeout, 0); // [s]
retVal->exitHandler = (ILibDuktape_HelperEvent)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Settings_ExitHandler); // [s] settings->exitHandler = (ILibDuktape_HelperEvent)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Settings_ExitHandler); // [s]
retVal->exitUserObject = Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Settings_ExitUser); // [s] settings->exitUserObject = Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Settings_ExitUser); // [s]
retVal->db = (ILibSimpleDataStore)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Settings_DB); // [s] settings->db = (ILibSimpleDataStore)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_Settings_DB); // [s]
retVal->exePath = Duktape_GetStringPropertyValue(ctx, -1, ILibDuktape_ScriptContainer_ExePath, NULL); // [s] settings->exePath = Duktape_Duplicate_GetStringPropertyValue(ctx, -1, ILibDuktape_ScriptContainer_ExePath, NULL); // [s]
retVal->pipeManager = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_PipeManager); // [s] settings->pipeManager = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ScriptContainer_PipeManager); // [s]
duk_pop(ctx); // ... duk_pop(ctx); // ...
duk_push_global_object(ctx); // [g] duk_push_global_object(ctx); // [g]
duk_get_prop_string(ctx, -1, "process"); // [g][process] duk_get_prop_string(ctx, -1, "process"); // [g][process]
retVal->coreDumpLocation = (char*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_ScriptContainer_Process_CoreDumpPath); settings->coreDumpLocation = (char*)Duktape_Duplicate_GetBufferProperty(ctx, -1, ILibDuktape_ScriptContainer_Process_CoreDumpPath);
duk_get_prop_string(ctx, -1, ILibDuktape_ScriptContainer_Process_ArgArray); // [g][process][array] duk_get_prop_string(ctx, -1, ILibDuktape_ScriptContainer_Process_ArgArray); // [g][process][array]
int i, count = (int)duk_get_length(ctx, -1); int i, count = (int)duk_get_length(ctx, -1);
for (i = 0; i < count; ++i) if (count > 0)
{ {
duk_get_prop_index(ctx, -1, i); // [g][process][array][index] settings->argList = (char**)ILibMemory_SmartAllocate((1 + count) * sizeof(char*));
retVal->argList[i] = (char*)duk_get_string(ctx, -1); for (i = 0; i < count; ++i)
duk_pop(ctx); // [g][process][array] {
duk_get_prop_index(ctx, -1, i); // [g][process][array][index]
settings->argList[i] = Duktape_Duplicate_GetString(ctx, -1);
duk_pop(ctx); // [g][process][array]
}
settings->argList[i] = NULL;
} }
retVal->argList[i] = NULL;
duk_pop(ctx); // [g][process] duk_pop(ctx); // [g][process]
if (duk_has_prop_string(ctx, -1, ILibDuktape_NativeUncaughtExceptionPtr)) if (duk_has_prop_string(ctx, -1, ILibDuktape_NativeUncaughtExceptionPtr))
{ {
duk_get_prop_string(ctx, -1, ILibDuktape_NativeUncaughtExceptionPtr); // [g][process][handler] duk_get_prop_string(ctx, -1, ILibDuktape_NativeUncaughtExceptionPtr); // [g][process][handler]
duk_get_prop_string(ctx, -2, ILibDuktape_NativeUncaughtExceptionUserPtr); // [g][process][handler][user] duk_get_prop_string(ctx, -2, ILibDuktape_NativeUncaughtExceptionUserPtr); // [g][process][handler][user]
retVal->nExeptionHandler = (ILibDuktape_NativeUncaughtExceptionHandler)duk_get_pointer(ctx, -2); settings->nExeptionHandler = (ILibDuktape_NativeUncaughtExceptionHandler)duk_get_pointer(ctx, -2);
retVal->nExceptionUserObject = duk_get_pointer(ctx, -1); settings->nExceptionUserObject = duk_get_pointer(ctx, -1);
duk_pop_2(ctx); // [g][process] duk_pop_2(ctx); // [g][process]
} }
duk_pop_2(ctx); // ... duk_pop_2(ctx); // ...
return(settings);
}
void ILibDuktape_ScriptContainer_FreeSettings(SCRIPT_ENGINE_SETTINGS *settings)
{
if (!ILibMemory_CanaryOK(settings)) { return; }
ILibMemory_Free(settings->exePath);
ILibMemory_Free(settings->coreDumpLocation);
return(retVal); if (settings->argList != NULL)
{
int i;
for (i = 0; settings->argList[i] != NULL; ++i)
{
ILibMemory_Free(settings->argList[i]);
}
ILibMemory_Free(settings->argList);
}
ILibMemory_Free(settings);
} }
duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx2(SCRIPT_ENGINE_SETTINGS *settings) duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx2(SCRIPT_ENGINE_SETTINGS *settings)
{ {
@@ -1381,20 +1402,15 @@ size_t ILibDuktape_ScriptContainer_TotalAllocations = 0;
void *ILibDuktape_ScriptContainer_Engine_malloc(void *udata, duk_size_t size) void *ILibDuktape_ScriptContainer_Engine_malloc(void *udata, duk_size_t size)
{ {
ILibDuktape_ScriptContainer_TotalAllocations += size; ILibDuktape_ScriptContainer_TotalAllocations += size;
return(ILibMemory_SmartAllocate(size)); void *ptr = ILibMemory_SmartAllocateEx(size, sizeof(void*));
((void**)ILibMemory_Extra(ptr))[0] = udata;
return(ptr);
} }
void *ILibDuktape_ScriptContainer_Engine_realloc(void *udata, void *ptr, duk_size_t size) void *ILibDuktape_ScriptContainer_Engine_realloc(void *udata, void *ptr, duk_size_t size)
{ {
size_t difference = 0; size_t difference = 0;
if (ptr != NULL) if (ptr != NULL)
{ {
ptr = ILibMemory_RawPtr(ptr);
if ((ptr = realloc(ptr, size + sizeof(ILibMemory_Header))) == NULL)
{
ILIBCRITICALEXITMSG(255, "REALLOC FAILURE");
}
ptr = ILibMemory_FromRaw(ptr);
if (ILibMemory_Size(ptr) > size) if (ILibMemory_Size(ptr) > size)
{ {
// Memory Shrink // Memory Shrink
@@ -1406,13 +1422,22 @@ void *ILibDuktape_ScriptContainer_Engine_realloc(void *udata, void *ptr, duk_siz
difference = size - ILibMemory_Size(ptr); difference = size - ILibMemory_Size(ptr);
ILibDuktape_ScriptContainer_TotalAllocations += difference; ILibDuktape_ScriptContainer_TotalAllocations += difference;
} }
ILibMemory_Size(ptr) = size; if (size == 0)
{
ILibMemory_Free(ptr);
ptr = NULL;
}
else
{
ptr = ILibMemory_SmartReAllocate(ptr, size);
}
} }
else else
{ {
if (size > 0) if (size > 0)
{ {
ptr = ILibMemory_SmartAllocate(size); ptr = ILibMemory_SmartAllocateEx(size, sizeof(void*));
((void**)ILibMemory_Extra(ptr))[0] = udata;
ILibDuktape_ScriptContainer_TotalAllocations += size; ILibDuktape_ScriptContainer_TotalAllocations += size;
} }
} }
@@ -1421,9 +1446,11 @@ void *ILibDuktape_ScriptContainer_Engine_realloc(void *udata, void *ptr, duk_siz
} }
void ILibDuktape_ScriptContainer_Engine_free(void *udata, void *ptr) void ILibDuktape_ScriptContainer_Engine_free(void *udata, void *ptr)
{ {
size_t sz = ptr == NULL ? 0 : ILibMemory_Size(ptr);
ILibDuktape_ContextData *x = ptr != NULL ? (ILibDuktape_ContextData*)ILibMemory_Extra(ptr) : NULL;
if (ptr != NULL) if (ptr != NULL)
{ {
size_t sz = ILibMemory_Size(ptr);
ILibDuktape_ScriptContainer_TotalAllocations -= ILibMemory_Size(ptr); ILibDuktape_ScriptContainer_TotalAllocations -= ILibMemory_Size(ptr);
memset(ptr, 0xDEADBEEF, sz); memset(ptr, 0xDEADBEEF, sz);
ILibMemory_Free(ptr); ILibMemory_Free(ptr);
@@ -2246,7 +2273,10 @@ void ILibDuktape_ScriptContainer_OS_Init(duk_context *ctx)
extern void ILibDuktape_HttpStream_Init(duk_context *ctx); extern void ILibDuktape_HttpStream_Init(duk_context *ctx);
duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngine_minimal() duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngine_minimal()
{ {
duk_context *ctx = duk_create_heap(ILibDuktape_ScriptContainer_Engine_malloc, ILibDuktape_ScriptContainer_Engine_realloc, ILibDuktape_ScriptContainer_Engine_free, NULL, ILibDuktape_ScriptContainer_Engine_fatal); ILibDuktape_ContextData *ctxd = (ILibDuktape_ContextData*)ILibMemory_SmartAllocate(sizeof(ILibDuktape_ContextData));
do { util_random(sizeof(ctxd->nonce), (char*)&(ctxd->nonce)); } while (ctxd->nonce == 0);
duk_context *ctx = duk_create_heap(ILibDuktape_ScriptContainer_Engine_malloc, ILibDuktape_ScriptContainer_Engine_realloc, ILibDuktape_ScriptContainer_Engine_free, ctxd, ILibDuktape_ScriptContainer_Engine_fatal);
if (ctx == NULL) { ILIBCRITICALEXIT(254); } if (ctx == NULL) { ILIBCRITICALEXIT(254); }
return(ctx); return(ctx);
} }
@@ -2261,10 +2291,9 @@ int ILibDuktape_ScriptContainer_DebuggingOK(duk_context *ctx)
duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx3(duk_context *ctx, SCRIPT_ENGINE_SECURITY_FLAGS securityFlags, unsigned int executionTimeout, void *chain, char **argList, ILibSimpleDataStore *db, char *exePath, ILibProcessPipe_Manager pipeManager, ILibDuktape_HelperEvent exitHandler, void *exitUser) duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx3(duk_context *ctx, SCRIPT_ENGINE_SECURITY_FLAGS securityFlags, unsigned int executionTimeout, void *chain, char **argList, ILibSimpleDataStore *db, char *exePath, ILibProcessPipe_Manager pipeManager, ILibDuktape_HelperEvent exitHandler, void *exitUser)
{ {
void **timeoutKey = executionTimeout > 0 ? (void**)ILibMemory_Allocate(sizeof(void*), 0, NULL, NULL) : NULL; void **timeoutKey = executionTimeout > 0 ? (void**)ILibMemory_Allocate(sizeof(void*), 0, NULL, NULL) : NULL;
duk_ctx_context_data(ctx)->chain = chain;
duk_push_heap_stash(ctx); // [s] duk_push_heap_stash(ctx); // [s]
duk_push_pointer(ctx, chain); // [s][chain]
duk_put_prop_string(ctx, -2, ILibDuktape_Context_Chain); // [s]
duk_push_int(ctx, (int)securityFlags); // [s][flags] duk_push_int(ctx, (int)securityFlags); // [s][flags]
duk_put_prop_string(ctx, -2, ILibDuktape_ScriptContainer_Settings_SecurityFlags); // [s] duk_put_prop_string(ctx, -2, ILibDuktape_ScriptContainer_Settings_SecurityFlags); // [s]
duk_push_int(ctx, (int)executionTimeout); // [s][timeout] duk_push_int(ctx, (int)executionTimeout); // [s][timeout]
@@ -2520,7 +2549,7 @@ void ILibDuktape_ScriptContainer_Slave_ProcessCommands(ILibDuktape_ScriptContain
} }
} }
if (slave->ctx != NULL) { duk_destroy_heap(slave->ctx); slave->ctx = codec = NULL; } if (slave->ctx != NULL) { Duktape_SafeDestroyHeap(slave->ctx); slave->ctx = codec = NULL; }
slave->ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngine(securityFlags, executionTimeout, slave->chain, (char**)argList, NULL, ILibDuktape_ScriptContainer_Slave_HeapDestroyed, slave); slave->ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngine(securityFlags, executionTimeout, slave->chain, (char**)argList, NULL, ILibDuktape_ScriptContainer_Slave_HeapDestroyed, slave);
duk_push_heap_stash(slave->ctx); // [s] duk_push_heap_stash(slave->ctx); // [s]
@@ -2692,7 +2721,7 @@ void ILibDuktape_ScriptContainer_Slave_ProcessCommands(ILibDuktape_ScriptContain
break; break;
} }
case SCRIPT_ENGINE_COMMAND_EXIT: case SCRIPT_ENGINE_COMMAND_EXIT:
if (slave->ctx != NULL) { duk_destroy_heap(slave->ctx); } if (slave->ctx != NULL) { Duktape_SafeDestroyHeap(slave->ctx); }
break; break;
default: default:
break; break;
@@ -2701,7 +2730,7 @@ void ILibDuktape_ScriptContainer_Slave_ProcessCommands(ILibDuktape_ScriptContain
if (codec != NULL && slave->ctx == NULL) if (codec != NULL && slave->ctx == NULL)
{ {
duk_destroy_heap(codec); Duktape_SafeDestroyHeap(codec);
} }
} }
@@ -2731,7 +2760,7 @@ void ILibDuktape_ScriptContainer_Slave_OnReadStdIn(ILibProcessPipe_Pipe sender,
((void**)ILibMemory_Extra(sender))[1] = buffer; ((void**)ILibMemory_Extra(sender))[1] = buffer;
ILibProcessPipe_Pipe_Pause(sender); ILibProcessPipe_Pipe_Pause(sender);
ILibChain_RunOnMicrostackThread(slave->chain, ILibDuktape_ScriptContainer_Slave_OnReadStdInEx, sender); Duktape_RunOnEventLoop(slave->chain, duk_ctx_nonce(slave->ctx), slave->ctx, ILibDuktape_ScriptContainer_Slave_OnReadStdInEx, NULL, sender);
#else #else
ILibDuktape_ScriptContainer_Slave_ProcessCommands(slave, buffer, sender); ILibDuktape_ScriptContainer_Slave_ProcessCommands(slave, buffer, sender);
#endif #endif
@@ -2853,7 +2882,7 @@ duk_ret_t ILibDuktape_ScriptContainer_Exit(duk_context *ctx)
ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL); ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL);
cmd->container.slave = ((void**)ILibMemory_GetExtraMemory(master->PeerChain, ILibMemory_CHAIN_CONTAINERSIZE))[1]; cmd->container.slave = ((void**)ILibMemory_GetExtraMemory(master->PeerChain, ILibMemory_CHAIN_CONTAINERSIZE))[1];
memcpy_s(cmd->json, sizeof(json), json, sizeof(json)); memcpy_s(cmd->json, sizeof(json), json, sizeof(json));
ILibChain_RunOnMicrostackThread2(master->PeerChain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1); Duktape_RunOnEventLoopEx(master->PeerChain, duk_ctx_nonce(master->PeerCTX), master->PeerCTX, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1);
return(0); return(0);
} }
@@ -2912,7 +2941,7 @@ duk_ret_t ILibDuktape_ScriptContainer_ExecuteString(duk_context *ctx)
i += ILibBase64Encode((unsigned char*)payload, (int)payloadLen, (unsigned char**)&output); i += ILibBase64Encode((unsigned char*)payload, (int)payloadLen, (unsigned char**)&output);
sprintf_s(cmd->json + i - 2, 3, "\"}"); sprintf_s(cmd->json + i - 2, 3, "\"}");
ILibChain_RunOnMicrostackThread2(master->PeerChain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1); Duktape_RunOnEventLoopEx(master->PeerChain, duk_ctx_nonce(master->PeerCTX), master->PeerCTX, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1);
return(0); return(0);
} }
@@ -2987,7 +3016,7 @@ void ILibDuktape_ScriptContainer_StdOutSink(ILibProcessPipe_Process sender, char
void *tmp = ILibMemory_SmartAllocateEx(sizeof(void*), bufferLen + 1); void *tmp = ILibMemory_SmartAllocateEx(sizeof(void*), bufferLen + 1);
((void**)tmp)[0] = master; ((void**)tmp)[0] = master;
memcpy_s(ILibMemory_Extra(tmp), ILibMemory_ExtraSize(tmp), buffer, bufferLen); memcpy_s(ILibMemory_Extra(tmp), ILibMemory_ExtraSize(tmp), buffer, bufferLen);
ILibChain_RunOnMicrostackThread(master->chain, ILibDuktape_ScriptContainer_StdOutSink_Chain, tmp); Duktape_RunOnEventLoop(master->chain, duk_ctx_nonce(master->ctx), master->ctx, ILibDuktape_ScriptContainer_StdOutSink_Chain, NULL, tmp);
} }
*bytesConsumed = bufferLen; *bytesConsumed = bufferLen;
@@ -3102,7 +3131,7 @@ void ILibDuktape_ScriptContainer_StdErrSink(ILibProcessPipe_Process sender, char
ptr[0] = master; ptr[0] = master;
ptr[1] = buffer; ptr[1] = buffer;
ILibProcessPipe_Pipe_Pause(ILibProcessPipe_Process_GetStdErr(sender)); ILibProcessPipe_Pipe_Pause(ILibProcessPipe_Process_GetStdErr(sender));
ILibChain_RunOnMicrostackThread(master->chain, ILibDuktape_ScriptContainer_StdErrSink_MicrostackThread, ptr); Duktape_RunOnEventLoop(master->chain, duk_ctx_nonce(master->ctx), master->ctx, ILibDuktape_ScriptContainer_StdErrSink_MicrostackThread, NULL, ptr);
} }
#else #else
void *ptr[2] = { master, buffer }; void *ptr[2] = { master, buffer };
@@ -3126,7 +3155,7 @@ duk_ret_t ILibDuktape_ScriptContainer_Finalizer(duk_context *ctx)
ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL); ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL);
cmd->container.slave = ((void**)ILibMemory_GetExtraMemory(master->PeerChain, ILibMemory_CHAIN_CONTAINERSIZE))[1]; cmd->container.slave = ((void**)ILibMemory_GetExtraMemory(master->PeerChain, ILibMemory_CHAIN_CONTAINERSIZE))[1];
memcpy_s(cmd->json, sizeof(json), json, sizeof(json)); memcpy_s(cmd->json, sizeof(json), json, sizeof(json));
ILibChain_RunOnMicrostackThread2(master->PeerChain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1); Duktape_RunOnEventLoopEx(master->PeerChain, duk_ctx_nonce(master->PeerCTX), master->PeerCTX, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1);
#ifdef WIN32 #ifdef WIN32
WaitForSingleObject(master->PeerThread, INFINITE); WaitForSingleObject(master->PeerThread, INFINITE);
#endif #endif
@@ -3166,7 +3195,7 @@ duk_ret_t ILibDuktape_ScriptContainer_SendToSlave(duk_context *ctx)
ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = ILibMemory_Allocate(sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command) + (int)payloadLen + 1, 0, NULL, NULL); ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = ILibMemory_Allocate(sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command) + (int)payloadLen + 1, 0, NULL, NULL);
cmd->container.slave = (ILibDuktape_ScriptContainer_Slave*)((void**)ILibMemory_GetExtraMemory(master->PeerChain, ILibMemory_CHAIN_CONTAINERSIZE))[1]; cmd->container.slave = (ILibDuktape_ScriptContainer_Slave*)((void**)ILibMemory_GetExtraMemory(master->PeerChain, ILibMemory_CHAIN_CONTAINERSIZE))[1];
memcpy_s(cmd->json, payloadLen + 1, payload, payloadLen + 1); memcpy_s(cmd->json, payloadLen + 1, payload, payloadLen + 1);
ILibChain_RunOnMicrostackThread2(master->PeerChain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1); Duktape_RunOnEventLoopEx(master->PeerChain, duk_ctx_nonce(master->PeerCTX), master->PeerCTX, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, cmd, 1);
} }
return(0); return(0);
} }
@@ -3217,7 +3246,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster(void *chain,
ILibDuktape_ScriptContainer_NonIsolated_Command* initCmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL); ILibDuktape_ScriptContainer_NonIsolated_Command* initCmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL);
initCmd->container.slave = slave; initCmd->container.slave = slave;
memcpy_s(initCmd->json, sizeof(json), json, sizeof(json)); memcpy_s(initCmd->json, sizeof(json), json, sizeof(json));
ILibChain_RunOnMicrostackThread2(master->PeerChain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, initCmd, 1); Duktape_RunOnEventLoopEx(master->PeerChain, duk_ctx_nonce(master->PeerCTX), master->PeerCTX, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave, initCmd, 1);
break; break;
} }
case 1: case 1:
@@ -3250,6 +3279,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster(void *chain,
if (duk_pcall_method(master->ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(master->ctx, "Error Emitting ScriptContainer Exit: "); } if (duk_pcall_method(master->ctx, 2) != 0) { ILibDuktape_Process_UncaughtExceptionEx(master->ctx, "Error Emitting ScriptContainer Exit: "); }
duk_pop(master->ctx); // [json] duk_pop(master->ctx); // [json]
master->PeerChain = NULL; master->PeerChain = NULL;
master->PeerCTX = NULL;
break; break;
case SCRIPT_ENGINE_COMMAND_SEND_JSON: case SCRIPT_ENGINE_COMMAND_SEND_JSON:
ILibDuktape_EventEmitter_SetupEmit(master->ctx, master->emitter->object, "data"); // [json][emit][this][data] ILibDuktape_EventEmitter_SetupEmit(master->ctx, master->emitter->object, "data"); // [json][emit][this][data]
@@ -3285,7 +3315,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker_ExceptionSink(duk_context *ct
duk_pop(ctx); // ... duk_pop(ctx); // ...
ILibChain_RunOnMicrostackThread2(cmd->container.master->chain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1); Duktape_RunOnEventLoopEx(cmd->container.master->chain, duk_ctx_nonce(cmd->container.master->ctx), cmd->container.master->ctx, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1);
} }
void ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave(void *chain, void *user) void ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave(void *chain, void *user)
{ {
@@ -3308,7 +3338,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave(void *chain, v
ILibDuktape_ScriptContainer_NonIsolated_Command* cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL); ILibDuktape_ScriptContainer_NonIsolated_Command* cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL);
cmd->container.master = master; cmd->container.master = master;
memcpy_s(cmd->json, sizeof(json), json, sizeof(json)); memcpy_s(cmd->json, sizeof(json), json, sizeof(json));
ILibChain_RunOnMicrostackThread2(master->chain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1); Duktape_RunOnEventLoopEx(master->chain, duk_ctx_nonce(master->ctx), master->ctx, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1);
break; break;
case SCRIPT_ENGINE_COMMAND_EXEC: case SCRIPT_ENGINE_COMMAND_EXEC:
{ {
@@ -3350,7 +3380,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsSlave(void *chain, v
case SCRIPT_ENGINE_COMMAND_EXIT: case SCRIPT_ENGINE_COMMAND_EXIT:
slave->noRespond = Duktape_GetIntPropertyValue(slave->ctx, -1, "noResponse", 0); slave->noRespond = Duktape_GetIntPropertyValue(slave->ctx, -1, "noResponse", 0);
duk_pop(slave->ctx); duk_pop(slave->ctx);
duk_destroy_heap(slave->ctx); Duktape_SafeDestroyHeap(slave->ctx);
return; return;
} }
duk_pop(slave->ctx); // ... duk_pop(slave->ctx); // ...
@@ -3367,6 +3397,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker(void *arg)
((void**)ILibMemory_GetExtraMemory(slave->chain, ILibMemory_CHAIN_CONTAINERSIZE))[1] = slave; ((void**)ILibMemory_GetExtraMemory(slave->chain, ILibMemory_CHAIN_CONTAINERSIZE))[1] = slave;
master->PeerChain = slave->chain; master->PeerChain = slave->chain;
slave->ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngine_minimal(); slave->ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngine_minimal();
master->PeerCTX = slave->ctx;
duk_push_heap_stash(slave->ctx); duk_push_heap_stash(slave->ctx);
duk_push_pointer(slave->ctx, slave); duk_push_pointer(slave->ctx, slave);
@@ -3378,7 +3409,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker(void *arg)
ILibDuktape_ScriptContainer_NonIsolated_Command* cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL); ILibDuktape_ScriptContainer_NonIsolated_Command* cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(sizeof(json) + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL);
cmd->container.master = master; cmd->container.master = master;
memcpy_s(cmd->json, sizeof(json), json, sizeof(json)); memcpy_s(cmd->json, sizeof(json), json, sizeof(json));
ILibChain_RunOnMicrostackThread2(master->chain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1); Duktape_RunOnEventLoopEx(master->chain, duk_ctx_nonce(master->ctx), master->ctx, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1);
ILibChain_DisableWatchDog(slave->chain); ILibChain_DisableWatchDog(slave->chain);
ILibStartChain(slave->chain); ILibStartChain(slave->chain);
@@ -3387,7 +3418,7 @@ void ILibDuktape_ScriptContainer_NonIsolatedWorker(void *arg)
cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(64 + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL); cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(64 + sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command), 0, NULL, NULL);
cmd->container.master = master; cmd->container.master = master;
sprintf_s(cmd->json, 64, "{\"command\": \"128\", \"exitCode\": \"%d\"}", slave->exitCode); sprintf_s(cmd->json, 64, "{\"command\": \"128\", \"exitCode\": \"%d\"}", slave->exitCode);
ILibChain_RunOnMicrostackThread2(master->chain, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1); Duktape_RunOnEventLoopEx(master->chain, duk_ctx_nonce(master->ctx), master->ctx, ILibDuktape_ScriptContainer_NonIsolatedWorker_ProcessAsMaster, cmd, 1);
} }
} }
duk_ret_t ILibDuktape_ScriptContainer_Create(duk_context *ctx) duk_ret_t ILibDuktape_ScriptContainer_Create(duk_context *ctx)

View File

@@ -138,7 +138,7 @@ typedef struct SCRIPT_ENGINE_SETTINGS
char *coreDumpLocation; char *coreDumpLocation;
ILibProcessPipe_Manager pipeManager; ILibProcessPipe_Manager pipeManager;
char *argList[]; char **argList;
}SCRIPT_ENGINE_SETTINGS; }SCRIPT_ENGINE_SETTINGS;
void ILibDuktape_ScriptContainer_CheckEmbedded(char **script, int *scriptLen); void ILibDuktape_ScriptContainer_CheckEmbedded(char **script, int *scriptLen);
@@ -154,7 +154,8 @@ duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx2(SCRIPT_EN
#define ILibDuktape_ScriptContainer_InitializeJavaScriptEngine(securityFlags, executionTimeout, chain, pp_argList, db, exitHandler, exitUser) ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx((securityFlags), (executionTimeout), (chain), (pp_argList), (db), NULL, NULL, (exitHandler), (exitUser)) #define ILibDuktape_ScriptContainer_InitializeJavaScriptEngine(securityFlags, executionTimeout, chain, pp_argList, db, exitHandler, exitUser) ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx((securityFlags), (executionTimeout), (chain), (pp_argList), (db), NULL, NULL, (exitHandler), (exitUser))
int ILibDuktape_ScriptContainer_DebuggingOK(duk_context *ctx); int ILibDuktape_ScriptContainer_DebuggingOK(duk_context *ctx);
SCRIPT_ENGINE_SETTINGS *ILibDuktape_ScriptContainer_GetSettings(duk_context *ctx); SCRIPT_ENGINE_SETTINGS* ILibDuktape_ScriptContainer_GetSettings(duk_context *ctx);
void ILibDuktape_ScriptContainer_FreeSettings(SCRIPT_ENGINE_SETTINGS *settings);
int ILibDuktape_ScriptContainer_CompileJavaScript_FromFile(duk_context *ctx, char *path, int pathLen); int ILibDuktape_ScriptContainer_CompileJavaScript_FromFile(duk_context *ctx, char *path, int pathLen);
int ILibDuktape_ScriptContainer_CompileJavaScriptEx(duk_context *ctx, char *payload, int payloadLen, char *filename, int filenameLen); int ILibDuktape_ScriptContainer_CompileJavaScriptEx(duk_context *ctx, char *payload, int payloadLen, char *filename, int filenameLen);
#define ILibDuktape_ScriptContainer_CompileJavaScript(ctx, payload, payloadLen) ILibDuktape_ScriptContainer_CompileJavaScriptEx(ctx, payload, payloadLen, NULL, 0) #define ILibDuktape_ScriptContainer_CompileJavaScript(ctx, payload, payloadLen) ILibDuktape_ScriptContainer_CompileJavaScriptEx(ctx, payload, payloadLen, NULL, 0)

View File

@@ -1047,11 +1047,11 @@ void ILibDuktape_fs_watch_iocompletionEx(void *chain, void *user)
} }
BOOL ILibDuktape_fs_watch_iocompletion(HANDLE h, ILibWaitHandle_ErrorStatus errors, void *user) BOOL ILibDuktape_fs_watch_iocompletion(HANDLE h, ILibWaitHandle_ErrorStatus errors, void *user)
{ {
if (errors != ILibWaitHandle_ErrorStatus_NONE) { return(FALSE); } if (errors != ILibWaitHandle_ErrorStatus_NONE || !ILibMemory_CanaryOK(user)) { return(FALSE); }
ILibDuktape_fs_watcherData *data = (ILibDuktape_fs_watcherData*)user; ILibDuktape_fs_watcherData *data = (ILibDuktape_fs_watcherData*)user;
ILibProcessPipe_WaitHandle_Remove(data->pipeManager, h); ILibProcessPipe_WaitHandle_Remove(data->pipeManager, h);
ILibChain_RunOnMicrostackThread(data->chain, ILibDuktape_fs_watch_iocompletionEx, data); Duktape_RunOnEventLoop(data->chain, duk_ctx_nonce(data->ctx), data->ctx, ILibDuktape_fs_watch_iocompletionEx, NULL, data);
return(TRUE); return(TRUE);
} }
#endif #endif

View File

@@ -84,7 +84,7 @@ typedef struct ILibDuktape_net_WindowsIPC
{ {
ILibProcessPipe_Manager manager; ILibProcessPipe_Manager manager;
duk_context *ctx; duk_context *ctx;
void *mServer, *mSocket; void *mServer, *mSocket, *mChain;
HANDLE mPipeHandle; HANDLE mPipeHandle;
ILibProcessPipe_Pipe mPipe; ILibProcessPipe_Pipe mPipe;
@@ -380,6 +380,7 @@ duk_ret_t ILibDuktape_net_socket_connect(duk_context *ctx)
winIPC->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); winIPC->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
winIPC->ctx = ctx; winIPC->ctx = ctx;
winIPC->mSocket = duk_get_heapptr(ctx, -1); winIPC->mSocket = duk_get_heapptr(ctx, -1);
winIPC->mChain = Duktape_GetChain(ctx);
duk_eval_string(ctx, "require('child_process');"); duk_eval_string(ctx, "require('child_process');");
winIPC->manager = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager); winIPC->manager = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager);
@@ -905,7 +906,7 @@ void ILibDuktape_net_server_IPC_readsink(ILibProcessPipe_Pipe sender, void *user
winIPC->_reserved[3] = (ULONG_PTR)buffer; winIPC->_reserved[3] = (ULONG_PTR)buffer;
winIPC->_reserved[4] = (ULONG_PTR)bufferLen; winIPC->_reserved[4] = (ULONG_PTR)bufferLen;
ILibChain_RunOnMicrostackThreadEx(Duktape_GetChain(winIPC->ctx), ILibDuktape_net_server_IPC_readsink_safe, winIPC); Duktape_RunOnEventLoop(winIPC->mChain, duk_ctx_nonce(winIPC->ctx), winIPC->ctx, ILibDuktape_net_server_IPC_readsink_safe, NULL, winIPC);
} }
void ILibDuktape_net_server_IPC_PauseSink(ILibDuktape_DuplexStream *sender, void *user) void ILibDuktape_net_server_IPC_PauseSink(ILibDuktape_DuplexStream *sender, void *user)
{ {
@@ -1211,7 +1212,7 @@ duk_ret_t ILibDuktape_net_server_listen(duk_context *ctx)
winIPC->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); winIPC->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
winIPC->ctx = ctx; winIPC->ctx = ctx;
winIPC->mServer = duk_get_heapptr(ctx, -1); winIPC->mServer = duk_get_heapptr(ctx, -1);
winIPC->mChain = Duktape_GetChain(ctx);
duk_eval_string(ctx, "require('child_process');"); duk_eval_string(ctx, "require('child_process');");
winIPC->manager = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager); winIPC->manager = (ILibProcessPipe_Manager)Duktape_GetPointerProperty(ctx, -1, ILibDuktape_ChildProcess_Manager);

View File

@@ -936,11 +936,30 @@ void* ILibMemory_SmartReAllocate(void *ptr, size_t len)
{ {
if (ILibMemory_CanaryOK(ptr)) if (ILibMemory_CanaryOK(ptr))
{ {
size_t originalRawSize = ILibMemory_Init_Size(ILibMemory_Size(ptr), ILibMemory_ExtraSize(ptr));
size_t originalSize = ILibMemory_Size(ptr);
size_t originalExtraSize = ILibMemory_ExtraSize(ptr);
size_t newRawSize = ILibMemory_Init_Size(len, originalExtraSize);
if (newRawSize < originalRawSize && originalExtraSize > 0)
{
// Memory is going to contract, so we need to move the extra block before we realloc
size_t offset = originalSize - len;
memmove_s((char*)ILibMemory_Extra(ptr) - sizeof(ILibMemory_Header) - offset, originalExtraSize + sizeof(ILibMemory_Header), ILibMemory_Extra(ptr) - sizeof(ILibMemory_Header), originalExtraSize + sizeof(ILibMemory_Header));
}
void *ret = NULL; void *ret = NULL;
void *raw = ILibMemory_RawPtr(ptr); void *raw = ILibMemory_RawPtr(ptr);
if ((raw = realloc(raw, len + sizeof(ILibMemory_Header))) == NULL) { ILIBCRITICALEXIT(254); } if ((raw = realloc(raw, newRawSize)) == NULL) { ILIBCRITICALEXIT(254); }
ret = ILibMemory_FromRaw(raw); ret = ILibMemory_FromRaw(raw);
if (newRawSize > originalRawSize && originalExtraSize > 0)
{
// Memory was expanded, so now we need to move the extra block, before we adjust the headers
size_t offset = len - originalSize;
memmove_s(ILibMemory_Extra(ret) - sizeof(ILibMemory_Header) + offset, originalExtraSize + sizeof(ILibMemory_Header), ILibMemory_Extra(ret) - sizeof(ILibMemory_Header), originalExtraSize + sizeof(ILibMemory_Header));
}
ILibMemory_Size(ret) = len; ILibMemory_Size(ret) = len;
return(ret); return(ret);
} }
@@ -1830,7 +1849,7 @@ void ILibPrependToChain(void *Chain, void *object)
void* ILibGetBaseTimer(void *chain) void* ILibGetBaseTimer(void *chain)
{ {
//return ILibCreateLifeTime(chain); //return ILibCreateLifeTime(chain);
return ((struct ILibBaseChain*)chain)->Timer; return (chain == NULL ? NULL : ((struct ILibBaseChain*)chain)->Timer);
} }
#ifdef WIN32 #ifdef WIN32
@@ -6473,7 +6492,7 @@ void ILibLifeTime_Remove(void *LifeTimeToken, void *data)
struct ILibLifeTime *UPnPLifeTime = (struct ILibLifeTime*)LifeTimeToken; struct ILibLifeTime *UPnPLifeTime = (struct ILibLifeTime*)LifeTimeToken;
void *EventQueue; void *EventQueue;
if (UPnPLifeTime->ObjectList == NULL) return; if (UPnPLifeTime == NULL || UPnPLifeTime->ObjectList == NULL) return;
EventQueue = ILibQueue_Create(); EventQueue = ILibQueue_Create();
ILibLinkedList_Lock(UPnPLifeTime->ObjectList); ILibLinkedList_Lock(UPnPLifeTime->ObjectList);

View File

@@ -375,6 +375,7 @@ int ILibIsRunningOnChainThread(void* chain);
#define ILibMemory_SmartAllocate(len) ILibMemory_Init(malloc(len+sizeof(ILibMemory_Header)), (int)len, 0, ILibMemory_Types_HEAP) #define ILibMemory_SmartAllocate(len) ILibMemory_Init(malloc(len+sizeof(ILibMemory_Header)), (int)len, 0, ILibMemory_Types_HEAP)
#define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_Init(malloc(primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header):0)), (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_Init(malloc(primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header):0)), (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP)
void* ILibMemory_SmartReAllocate(void *ptr, size_t len); void* ILibMemory_SmartReAllocate(void *ptr, size_t len);
void ILibMemory_Free(void *ptr); void ILibMemory_Free(void *ptr);
void* ILibMemory_AllocateTemp(void* chain, size_t sz); void* ILibMemory_AllocateTemp(void* chain, size_t sz);

View File

@@ -61,9 +61,11 @@ function WindowsMessagePump(options)
this.wndclass.hinstance.pointerBuffer().copy(this.wndclass.Deref(GM.PointerSize == 4 ? 20 : 24, GM.PointerSize).toBuffer()); this.wndclass.hinstance.pointerBuffer().copy(this.wndclass.Deref(GM.PointerSize == 4 ? 20 : 24, GM.PointerSize).toBuffer());
this.wndclass.wndproc.on('GlobalCallback', function onWndProc(xhwnd, xmsg, wparam, lparam) this.wndclass.wndproc.on('GlobalCallback', function onWndProc(xhwnd, xmsg, wparam, lparam)
{ {
var processed = false;
if (this.mp._hwnd != null && this.mp._hwnd.Val == xhwnd.Val) if (this.mp._hwnd != null && this.mp._hwnd.Val == xhwnd.Val)
{ {
// This is for us // This is for us
processed = true;
var d = this.StartDispatcher(); var d = this.StartDispatcher();
this.mp.emit('message', { message: xmsg.Val, wparam: wparam.Val, lparam: lparam.Val, lparam_hex: lparam.pointerBuffer().toString('hex'), lparam_raw: lparam, hwnd: xhwnd, dispatcher: d }); this.mp.emit('message', { message: xmsg.Val, wparam: wparam.Val, lparam: lparam.Val, lparam_hex: lparam.pointerBuffer().toString('hex'), lparam_raw: lparam, hwnd: xhwnd, dispatcher: d });
@@ -88,6 +90,8 @@ function WindowsMessagePump(options)
else if(this.mp._hwnd == null && this.CallingThread() == this.mp._user32.RegisterClassExA.async.threadId()) else if(this.mp._hwnd == null && this.CallingThread() == this.mp._user32.RegisterClassExA.async.threadId())
{ {
// This message was generated from our CreateWindowExA method // This message was generated from our CreateWindowExA method
processed = true;
var d = this.StartDispatcher(); var d = this.StartDispatcher();
this.mp.emit('message', { message: xmsg.Val, wparam: wparam.Val, lparam: lparam.Val, lparam_hex: lparam.pointerBuffer().toString('hex'), hwnd: xhwnd, dispatcher: d }); this.mp.emit('message', { message: xmsg.Val, wparam: wparam.Val, lparam: lparam.Val, lparam_hex: lparam.pointerBuffer().toString('hex'), hwnd: xhwnd, dispatcher: d });
@@ -111,7 +115,7 @@ function WindowsMessagePump(options)
} }
} }
_debugGC(); if (processed) { _debugGC(); }
}); });
this._user32.RegisterClassExA.async(this.wndclass).then(function () this._user32.RegisterClassExA.async(this.wndclass).then(function ()