mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-20 10:13:17 +00:00
1. Added ability to spawn joinable threads on linux
2. Added ILibThread_TimedJoin()
This commit is contained in:
@@ -1164,7 +1164,7 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync(duk_context *ctx)
|
||||
sem_init(&(data->workAvailable), 0, 0);
|
||||
sem_init(&(data->workStarted), 0, 0);
|
||||
sem_init(&(data->workFinished), 0, 0);
|
||||
data->workerThread = ILibSpawnNormalThread(ILibDuktape_GenericMarshal_MethodInvokeAsync_WorkerRunLoop, data);
|
||||
data->workerThread = ILibSpawnNormalThreadEx(ILibDuktape_GenericMarshal_MethodInvokeAsync_WorkerRunLoop, data, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1268,7 +1268,7 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync_wait(duk_context *ctx)
|
||||
sem_init(&(data->workAvailable), 0, 0);
|
||||
sem_init(&(data->workStarted), 0, 0);
|
||||
sem_init(&(data->workFinished), 0, 0);
|
||||
data->workerThread = ILibSpawnNormalThread(ILibDuktape_GenericMarshal_MethodInvokeAsync_WorkerRunLoop, data);
|
||||
data->workerThread = ILibSpawnNormalThreadEx(ILibDuktape_GenericMarshal_MethodInvokeAsync_WorkerRunLoop, data, 0);
|
||||
}
|
||||
|
||||
if (data->waitingForResult == WAITING_FOR_RESULT__DISPATCHER) { return(ILibDuktape_Error(ctx, "This method call is not waitable")); }
|
||||
|
||||
@@ -669,21 +669,15 @@ void Duktape_SafeDestroyHeap(duk_context *ctx)
|
||||
ILibMemory_Free(threadList);
|
||||
#else
|
||||
int rv;
|
||||
void *status;
|
||||
long ts = ILibGetTimeStamp(), ts2;
|
||||
struct timespec t;
|
||||
t.tv_sec = 5;
|
||||
t.tv_nsec = 0;
|
||||
|
||||
struct timespec ts;
|
||||
void *node;
|
||||
void *thr;
|
||||
|
||||
ILibThread_ms2ts(5000, &ts);
|
||||
while ((node = ILibLinkedList_GetNode_Head(ctxd->threads)) != NULL)
|
||||
{
|
||||
if ((rv = pthread_timedjoin_np((pthread_t)ILibLinkedList_GetDataFromNode(node), &status, &t)) == 0)
|
||||
{
|
||||
t.tv_sec -= (((ts2 = ILibGetTimeStamp()) - ts) / 1000); ts = ts2;
|
||||
if (t.tv_sec == 0) { break; }
|
||||
}
|
||||
else if (rv == ETIMEDOUT)
|
||||
thr = ILibLinkedList_GetDataFromNode(node);
|
||||
if ((rv = ILibThread_TimedJoinEx(thr, &ts)) != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user