1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-06 00:13:33 +00:00

1. Fixed compiler warnings

2. Updated thread cleanup/finalizer logic to rely on ctxd if necessary
This commit is contained in:
Bryan Roe
2020-04-20 17:01:53 -07:00
parent 0c6db0b2a6
commit 71d4b1edca
5 changed files with 48 additions and 8 deletions

View File

@@ -969,9 +969,7 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync_abort(duk_context *ctx)
// We can gracefully exit this thread
data->abort = 1;
sem_post(workAvailable);
#ifdef WIN32
ILibThread_Join(workerThread);
#endif
}
else
{
@@ -1018,13 +1016,15 @@ duk_ret_t ILibDuktape_GenericMarshal_MethodInvokeAsync_dataFinalizer(duk_context
void *workerThread = data->workerThread;
data->abort = 1;
sem_post(&(data->workAvailable));
#ifdef WIN32
sem_post(workAvailable);
ILibThread_Join(workerThread);
#endif
}
else
{
if (duk_ctx_shutting_down(ctx))
{
ILibLinkedList_AddTail(duk_ctx_context_data(ctx)->threads, data->workerThread);
}
data->abort = 1;
}
}

View File

@@ -653,6 +653,45 @@ void Duktape_SafeDestroyHeap(duk_context *ctx)
ctxd->flags |= duk_destroy_heap_in_progress;
duk_destroy_heap(ctx);
if (ILibLinkedList_GetCount(ctxd->threads) > 0)
{
#ifdef WIN32
HANDLE* threadList = (HANDLE*)ILibMemory_SmartAllocate(sizeof(HANDLE) * ILibLinkedList_GetCount(ctxd->threads));
int i = 0;
void *node;
while ((node = ILibLinkedList_GetNode_Head(ctxd->threads)) != NULL)
{
threadList[i++] = ILibLinkedList_GetDataFromNode(node);
ILibLinkedList_Remove(node);
}
WaitForMultipleObjects(i, threadList, TRUE, 5000);
ILibMemory_Free(threadList);
#else
int rv;
void *status;
long ts = ILibGetTimeStamp(), ts2;
struct timespec t;
t.tv_sec = 5;
t.tv_nsec = 0;
void *node;
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)
{
break;
}
ILibLinkedList_Remove(node);
}
#endif
}
ILibLinkedList_Destroy(ctxd->threads);
ILibMemory_Free(ctxd);
}
void *Duktape_GetChain(duk_context *ctx)

View File

@@ -53,6 +53,7 @@ typedef struct ILibDuktape_ContextData
#ifdef WIN32
uint32_t apc_flags;
#endif
void *threads;
void *chain;
void *user;
}ILibDuktape_ContextData;

View File

@@ -865,7 +865,7 @@ duk_ret_t ILibDuktape_Process_cwd(duk_context *ctx)
duk_push_string(ctx, ILibScratchPad);
return(1);
#elif defined(_POSIX)
ignore_result((uint64_t)getcwd(ILibScratchPad, sizeof(ILibScratchPad)));
ignore_result((uintptr_t)getcwd(ILibScratchPad, sizeof(ILibScratchPad)));
duk_push_string(ctx, ILibScratchPad);
return(1);
#else
@@ -1447,7 +1447,6 @@ void *ILibDuktape_ScriptContainer_Engine_realloc(void *udata, void *ptr, duk_siz
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)
{
@@ -2275,6 +2274,7 @@ duk_context *ILibDuktape_ScriptContainer_InitializeJavaScriptEngine_minimal()
{
ILibDuktape_ContextData *ctxd = (ILibDuktape_ContextData*)ILibMemory_SmartAllocate(sizeof(ILibDuktape_ContextData));
do { util_random(sizeof(ctxd->nonce), (char*)&(ctxd->nonce)); } while (ctxd->nonce == 0);
ctxd->threads = ILibLinkedList_Create();
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); }

View File

@@ -160,7 +160,7 @@ void ILibDispatchSemaphore_post(sem_t* s);
#endif
#include<stdint.h>
static inline void ignore_result(uint64_t result) { (void)result; }
static inline void ignore_result(uintptr_t result) { (void)result; }
#if defined(_DEBUG)
#define PRINTERROR() printf("ERROR in %s, line %d\r\n", __FILE__, __LINE__);