1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-21 10:43:36 +00:00

Added ILibChain_ReadAndSaveStateEx()

Updated Windows IPC Socket, so client connection uses ReadAndSaveState, to start in paused state.
This commit is contained in:
Bryan Roe
2020-05-29 00:02:59 -07:00
parent 69c29eee81
commit 9e6387599a
3 changed files with 27 additions and 0 deletions

View File

@@ -139,6 +139,7 @@ void ILibDuktape_net_server_IPC_PauseSink(ILibDuktape_DuplexStream *sender, void
void ILibDuktape_net_server_IPC_ResumeSink(ILibDuktape_DuplexStream *sender, void *user); void ILibDuktape_net_server_IPC_ResumeSink(ILibDuktape_DuplexStream *sender, void *user);
int ILibDuktape_net_server_IPC_unshiftSink(ILibDuktape_DuplexStream *sender, int unshiftBytes, void *user); int ILibDuktape_net_server_IPC_unshiftSink(ILibDuktape_DuplexStream *sender, int unshiftBytes, void *user);
duk_ret_t ILibDuktape_net_server_IPC_ConnectSink_Finalizer(duk_context *ctx); duk_ret_t ILibDuktape_net_server_IPC_ConnectSink_Finalizer(duk_context *ctx);
BOOL ILibDuktape_server_ipc_ReadSink(void *chain, HANDLE h, ILibWaitHandle_ErrorStatus status, char *buffer, int bytesRead, void* user);
#endif #endif
@@ -416,6 +417,9 @@ duk_ret_t ILibDuktape_net_socket_connect(duk_context *ctx)
winIPC->mSocket = duk_get_heapptr(ctx, -1); winIPC->mSocket = duk_get_heapptr(ctx, -1);
winIPC->mChain = duk_ctx_chain(ctx); winIPC->mChain = duk_ctx_chain(ctx);
winIPC->paused = 1; winIPC->paused = 1;
winIPC->metadata = "net.ipcSocket";
winIPC->bufferLength = ILibDuktape_net_IPC_BUFFERSIZE;
ILibMemory_ReallocateRaw(&(winIPC->buffer), ILibDuktape_net_IPC_BUFFERSIZE);
if ((winIPC->mPipeHandle = CreateFileA(path, GENERIC_READ | FILE_WRITE_DATA, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0)) == INVALID_HANDLE_VALUE) if ((winIPC->mPipeHandle = CreateFileA(path, GENERIC_READ | FILE_WRITE_DATA, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0)) == INVALID_HANDLE_VALUE)
{ {
@@ -429,6 +433,7 @@ duk_ret_t ILibDuktape_net_socket_connect(duk_context *ctx)
winIPC->ds->readableStream->paused = 1; winIPC->ds->readableStream->paused = 1;
ILibDuktape_EventEmitter_AddHook(ILibDuktape_EventEmitter_GetEmitter(winIPC->ctx, -1), "data", ILibDuktape_net_socket_ipc_dataHookCallback); ILibDuktape_EventEmitter_AddHook(ILibDuktape_EventEmitter_GetEmitter(winIPC->ctx, -1), "data", ILibDuktape_net_socket_ipc_dataHookCallback);
ILibDuktape_EventEmitter_AddHook(ILibDuktape_EventEmitter_GetEmitter(winIPC->ctx, -1), "end", ILibDuktape_net_socket_ipc_dataHookCallback); ILibDuktape_EventEmitter_AddHook(ILibDuktape_EventEmitter_GetEmitter(winIPC->ctx, -1), "end", ILibDuktape_net_socket_ipc_dataHookCallback);
winIPC->reservedState = ILibChain_ReadAndSaveStateEx(winIPC->mChain, winIPC->mPipeHandle, &(winIPC->read_overlapped), winIPC->buffer, winIPC->bufferLength, ILibDuktape_server_ipc_ReadSink, winIPC, winIPC->metadata);
if (onConnectSpecified == 0) if (onConnectSpecified == 0)
{ {

View File

@@ -3346,6 +3346,27 @@ void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h)
} }
return(ret); return(ret);
} }
void* ILibChain_ReadAndSaveStateEx(void *chain, HANDLE h, OVERLAPPED *p, char *buffer, int bufferLen, ILibChain_ReadEx_Handler handler, void *user, char *metadata)
{
int metaDataLen = (int)(metadata == NULL ? 0 : strnlen_s(metadata, 1024));
ILibChain_WaitHandleInfo *ret = (ILibChain_WaitHandleInfo*)ILibMemory_SmartAllocate(8 + metaDataLen + sizeof(ILibChain_WaitHandleInfo));
ILibChain_ReadEx_data *state = (ILibChain_ReadEx_data*)ILibMemory_SmartAllocate(sizeof(ILibChain_ReadEx_data));
BOOL r = ReadFile(h, buffer, bufferLen, NULL, p);
int e = GetLastError();
state->buffer = buffer;
state->p = p;
state->handler = handler;
state->fileHandle = h;
state->user = user;
ret->node = p->hEvent;
ret->user = state;
ret->handler = ILibChain_ReadEx_Sink;
sprintf_s(ret->metaData, metaDataLen + 8, "%s [READ]", metadata == NULL ? "" : metadata);
return(ret);
}
void ILibChain_WaitHandle_RestoreState(void *chain, void *state) void ILibChain_WaitHandle_RestoreState(void *chain, void *state)
{ {
ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)state; ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)state;

View File

@@ -1008,6 +1008,7 @@ int ILibIsRunningOnChainThread(void* chain);
void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h); void* ILibChain_WaitHandle_RemoveAndSaveState(void *chain, HANDLE h);
void ILibChain_WaitHandle_RestoreState(void *chain, void *state); void ILibChain_WaitHandle_RestoreState(void *chain, void *state);
void ILibChain_WaitHandle_DestroySavedState(void *chain, void *state); void ILibChain_WaitHandle_DestroySavedState(void *chain, void *state);
void* ILibChain_ReadAndSaveStateEx(void *chain, HANDLE h, OVERLAPPED *p, char *buffer, int bufferLen, ILibChain_ReadEx_Handler handler, void *user, char *metadata);
BOOL ILibChain_WaitHandleAdded(void *chain, HANDLE h); BOOL ILibChain_WaitHandleAdded(void *chain, HANDLE h);
void ILibChain_WaitHandle_UpdateMetadata(void *chain, HANDLE h, char *metadata); void ILibChain_WaitHandle_UpdateMetadata(void *chain, HANDLE h, char *metadata);