1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-23 03:33:35 +00:00

Added WaitHandles array to chain

This commit is contained in:
Bryan Roe
2020-05-04 21:08:43 -07:00
parent ed418bd695
commit a58c3279b7

View File

@@ -945,13 +945,11 @@ typedef struct ILibBaseChain
HANDLE ChainProcessHandle; HANDLE ChainProcessHandle;
HANDLE MicrostackThreadHandle; HANDLE MicrostackThreadHandle;
CONTEXT MicrostackThreadContext; CONTEXT MicrostackThreadContext;
#else
pthread_t ChainThreadID;
#endif
#if defined(WIN32)
int UnblockFlag; int UnblockFlag;
void* auxSelectHandles; void* auxSelectHandles;
HANDLE WaitHandles[FD_SETSIZE * 2];
#else #else
pthread_t ChainThreadID;
int TerminatePipe[2]; int TerminatePipe[2];
#endif #endif
@@ -2845,9 +2843,8 @@ ILibExportMethod void ILibStartChain(void *Chain)
void *node; void *node;
DWORD waitTimeout; DWORD waitTimeout;
HANDLE selectHandles[FD_SETSIZE]; HANDLE selectHandles[FD_SETSIZE];
HANDLE selectEvents[FD_SETSIZE*2];
memset(selectHandles, 0, sizeof(selectHandles)); memset(selectHandles, 0, sizeof(selectHandles));
memset(selectEvents, 0, sizeof(selectEvents)); memset(chain->WaitHandles, 0, sizeof(chain->WaitHandles));
struct timeval currentTime; struct timeval currentTime;
struct timeval expirationTime; struct timeval expirationTime;
#endif #endif
@@ -3005,21 +3002,21 @@ ILibExportMethod void ILibStartChain(void *Chain)
} }
for (i = 0; i < x; ++i) for (i = 0; i < x; ++i)
{ {
if (selectEvents[i] == NULL || selectEvents[ILibChain_HandleInfoIndex(i)] != NULL) if (chain->WaitHandles[i] == NULL || chain->WaitHandles[ILibChain_HandleInfoIndex(i)] != NULL)
{ {
selectEvents[i] = WSACreateEvent(); chain->WaitHandles[i] = WSACreateEvent();
} }
else else
{ {
WSAResetEvent(selectEvents[i]); WSAResetEvent(chain->WaitHandles[i]);
} }
flags = 0; flags = 0;
selectEvents[ILibChain_HandleInfoIndex(i)] = NULL; chain->WaitHandles[ILibChain_HandleInfoIndex(i)] = NULL;
if (FD_ISSET(selectHandles[i], &readset)) { flags |= (FD_READ | FD_ACCEPT); } if (FD_ISSET(selectHandles[i], &readset)) { flags |= (FD_READ | FD_ACCEPT); }
if (FD_ISSET(selectHandles[i], &writeset)) { flags |= (FD_WRITE | FD_CONNECT); } if (FD_ISSET(selectHandles[i], &writeset)) { flags |= (FD_WRITE | FD_CONNECT); }
if (FD_ISSET(selectHandles[i], &errorset)) { flags |= FD_CLOSE; } if (FD_ISSET(selectHandles[i], &errorset)) { flags |= FD_CLOSE; }
WSAEventSelect((SOCKET)selectHandles[i], selectEvents[i], flags); WSAEventSelect((SOCKET)selectHandles[i], chain->WaitHandles[i], flags);
} }
ILibGetTimeOfDay(&currentTime); ILibGetTimeOfDay(&currentTime);
memcpy_s(&expirationTime, sizeof(struct timeval), &currentTime, sizeof(struct timeval)); memcpy_s(&expirationTime, sizeof(struct timeval), &currentTime, sizeof(struct timeval));
@@ -3029,12 +3026,12 @@ ILibExportMethod void ILibStartChain(void *Chain)
while (node != NULL) while (node != NULL)
{ {
i = x++; i = x++;
if (selectEvents[i] != NULL && selectEvents[ILibChain_HandleInfoIndex(i)] == NULL) if (chain->WaitHandles[i] != NULL && chain->WaitHandles[ILibChain_HandleInfoIndex(i)] == NULL)
{ {
WSACloseEvent(selectEvents[i]); WSACloseEvent(chain->WaitHandles[i]);
} }
selectEvents[i] = (HANDLE)ILibLinkedList_GetDataFromNode(node); chain->WaitHandles[i] = (HANDLE)ILibLinkedList_GetDataFromNode(node);
selectEvents[ILibChain_HandleInfoIndex(i)] = (HANDLE)ILibMemory_Extra(node); chain->WaitHandles[ILibChain_HandleInfoIndex(i)] = (HANDLE)ILibMemory_Extra(node);
if (((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_sec != 0 || ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_usec != 0) if (((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_sec != 0 || ((ILibChain_WaitHandleInfo*)ILibMemory_Extra(node))->expiration.tv_usec != 0)
{ {
// Timeout was specified // Timeout was specified
@@ -3049,20 +3046,20 @@ ILibExportMethod void ILibStartChain(void *Chain)
} }
node = ILibLinkedList_GetNextNode(node); node = ILibLinkedList_GetNextNode(node);
} }
expirationTime.tv_sec -= currentTime.tv_sec; expirationTime.tv_sec -= currentTime.tv_sec; if (expirationTime.tv_sec < 0) { expirationTime.tv_sec = 0; }
expirationTime.tv_usec -= currentTime.tv_usec; expirationTime.tv_usec -= currentTime.tv_usec; if (expirationTime.tv_usec < 0) { expirationTime.tv_usec = 0; }
waitTimeout = (DWORD)((expirationTime.tv_sec * 1000) + (expirationTime.tv_usec / 0.001)); waitTimeout = (DWORD)((expirationTime.tv_sec * 1000) + (expirationTime.tv_usec / 0.001));
while ((slct = WaitForMultipleObjectsEx(x, selectEvents, FALSE, (DWORD)((tv.tv_sec * 1000) + (tv.tv_usec / 0.001)), TRUE)) == WAIT_IO_COMPLETION && chain->UnblockFlag == 0) {} while ((slct = WaitForMultipleObjectsEx(x, chain->WaitHandles, FALSE, waitTimeout, TRUE)) == WAIT_IO_COMPLETION && chain->UnblockFlag == 0) {}
ILibGetTimeOfDay(&currentTime); ILibGetTimeOfDay(&currentTime);
if (slct != WAIT_IO_COMPLETION && (slct - WAIT_OBJECT_0 >= 0) && (slct - WAIT_OBJECT_0 < x)) if (slct != WAIT_IO_COMPLETION && (slct - (int)WAIT_OBJECT_0 >= 0) && (slct - (int)WAIT_OBJECT_0 < x))
{ {
if (selectEvents[ILibChain_HandleInfoIndex(slct)] != NULL) if (chain->WaitHandles[ILibChain_HandleInfoIndex(slct)] != NULL)
{ {
ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(slct)]; ILibChain_WaitHandleInfo *info = (ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(slct)];
HANDLE h = selectEvents[slct]; HANDLE h = chain->WaitHandles[slct];
selectEvents[ILibChain_HandleInfoIndex(slct)] = NULL; chain->WaitHandles[ILibChain_HandleInfoIndex(slct)] = NULL;
selectEvents[slct] = NULL; chain->WaitHandles[slct] = NULL;
if (info->handler != NULL) if (info->handler != NULL)
{ {
if (info->handler(chain, h, ILibWaitHandle_ErrorStatus_NONE, info->user) == FALSE) if (info->handler(chain, h, ILibWaitHandle_ErrorStatus_NONE, info->user) == FALSE)
@@ -3077,16 +3074,18 @@ ILibExportMethod void ILibStartChain(void *Chain)
{ {
for (i = 0; i < x; ++i) for (i = 0; i < x; ++i)
{ {
if (selectEvents[ILibChain_HandleInfoIndex(i)] != NULL && tvnonzero(&(((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->expiration))) if (chain->WaitHandles[ILibChain_HandleInfoIndex(i)] != NULL && tvnonzero(&(((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->expiration)))
{ {
if (tv2LTEtv1(&currentTime, &(((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->expiration))) if (tv2LTEtv1(&currentTime, &(((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->expiration)))
{ {
// TIMEOUT occured // TIMEOUT occured
if (((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->handler != NULL) if (((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->handler != NULL)
{ {
((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->handler(chain, selectEvents[i], ILibWaitHandle_ErrorStatus_TIMEOUT, ((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->user); ((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->handler(chain, chain->WaitHandles[i], ILibWaitHandle_ErrorStatus_TIMEOUT, ((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->user);
} }
ILibLinkedList_Remove(((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->node); ILibLinkedList_Remove(((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->node);
chain->WaitHandles[i] = NULL;
chain->WaitHandles[ILibChain_HandleInfoIndex(i)] = NULL;
} }
} }
} }
@@ -3096,15 +3095,17 @@ ILibExportMethod void ILibStartChain(void *Chain)
// One of the handles is invalid... Kick it out // One of the handles is invalid... Kick it out
for (i = 0; i < x; ++i) for (i = 0; i < x; ++i)
{ {
if (selectEvents[ILibChain_HandleInfoIndex(i)] != NULL) if (chain->WaitHandles[ILibChain_HandleInfoIndex(i)] != NULL)
{ {
if (WaitForSingleObject(selectEvents[i], 0) == WAIT_FAILED) if (WaitForSingleObject(chain->WaitHandles[i], 0) == WAIT_FAILED)
{ {
if (((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->handler != NULL) if (((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->handler != NULL)
{ {
((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->handler(chain, selectEvents[i], ILibWaitHandle_ErrorStatus_INVALID_HANDLE, ((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->user); ((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->handler(chain, chain->WaitHandles[i], ILibWaitHandle_ErrorStatus_INVALID_HANDLE, ((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->user);
} }
ILibLinkedList_Remove(((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->node); ILibLinkedList_Remove(((ILibChain_WaitHandleInfo*)chain->WaitHandles[ILibChain_HandleInfoIndex(i)])->node);
chain->WaitHandles[i] = NULL;
chain->WaitHandles[ILibChain_HandleInfoIndex(i)] = NULL;
} }
} }
} }
@@ -3238,9 +3239,9 @@ ILibExportMethod void ILibStartChain(void *Chain)
for (vX = 0; vX < FD_SETSIZE; ++vX) for (vX = 0; vX < FD_SETSIZE; ++vX)
{ {
if (selectHandles[vX] != NULL && selectHandles[ILibChain_HandleInfoIndex(vX)] == NULL) if (chain->WaitHandles[vX] != NULL && chain->WaitHandles[ILibChain_HandleInfoIndex(vX)] == NULL)
{ {
WSACloseEvent(selectHandles[vX]); WSACloseEvent(chain->WaitHandles[vX]);
} }
} }
ILibLinkedList_Destroy(chain->auxSelectHandles); ILibLinkedList_Destroy(chain->auxSelectHandles);