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:
@@ -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(¤tTime);
|
ILibGetTimeOfDay(¤tTime);
|
||||||
memcpy_s(&expirationTime, sizeof(struct timeval), ¤tTime, sizeof(struct timeval));
|
memcpy_s(&expirationTime, sizeof(struct timeval), ¤tTime, 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(¤tTime);
|
ILibGetTimeOfDay(¤tTime);
|
||||||
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(¤tTime, &(((ILibChain_WaitHandleInfo*)selectEvents[ILibChain_HandleInfoIndex(i)])->expiration)))
|
if (tv2LTEtv1(¤tTime, &(((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);
|
||||||
|
|||||||
Reference in New Issue
Block a user