1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-16 08:13:30 +00:00

Added ability to track timers

This commit is contained in:
Bryan Roe
2020-12-09 23:17:15 -08:00
parent 64022f804c
commit ddc766be08
3 changed files with 127 additions and 9 deletions

View File

@@ -1010,8 +1010,21 @@ void ILibDuktape_Polyfills_timer_elapsed(void *obj)
if (duk_pcall_method(ctx, argCount) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "timers.onElapsed() callback handler on '%s()' ", funcName); }
duk_pop(ctx); // ...
}
duk_ret_t ILibDuktape_Polyfills_Timer_Metadata(duk_context *ctx)
{
duk_push_this(ctx);
ILibLifeTime_Token token = (ILibLifeTime_Token)Duktape_GetPointerProperty(ctx, -1, "\xFF_token");
if (token != NULL)
{
duk_size_t metadataLen;
char *metadata = (char*)duk_require_lstring(ctx, 0, &metadataLen);
ILibLifeTime_SetMetadata(token, metadata, metadataLen);
}
return(0);
}
duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx)
{
char *metadata = NULL;
int nargs = duk_get_top(ctx);
ILibDuktape_Timer *ptrs;
ILibDuktape_Timer_Type timerType;
@@ -1027,6 +1040,7 @@ duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx)
{
case ILibDuktape_Timer_Type_IMMEDIATE:
ILibDuktape_WriteID(ctx, "Timers.immediate");
metadata = "setImmediate()";
// We're only saving a reference for immediates
duk_push_heap_stash(ctx); //[retVal][stash]
duk_dup(ctx, -2); //[retVal][stash][immediate]
@@ -1035,9 +1049,11 @@ duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx)
break;
case ILibDuktape_Timer_Type_INTERVAL:
ILibDuktape_WriteID(ctx, "Timers.interval");
metadata = "setInterval()";
break;
case ILibDuktape_Timer_Type_TIMEOUT:
ILibDuktape_WriteID(ctx, "Timers.timeout");
metadata = "setTimeout()";
break;
}
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_Polyfills_timer_finalizer);
@@ -1063,7 +1079,11 @@ duk_ret_t ILibDuktape_Polyfills_timer_set(duk_context *ctx)
duk_dup(ctx, 0); //[retVal][callback]
duk_put_prop_string(ctx, -2, "\xFF_callback"); //[retVal]
ILibLifeTime_AddEx(ILibGetBaseTimer(chain), ptrs, ptrs->timeout, ILibDuktape_Polyfills_timer_elapsed, NULL);
duk_push_pointer(
ctx,
ILibLifeTime_AddEx3(ILibGetBaseTimer(chain), ptrs, ptrs->timeout, ILibDuktape_Polyfills_timer_elapsed, NULL, metadata));
duk_put_prop_string(ctx, -2, "\xFF_token");
ILibDuktape_CreateEventWithSetterEx(ctx, "metadata", ILibDuktape_Polyfills_Timer_Metadata);
return 1;
}
duk_ret_t ILibDuktape_Polyfills_timer_clear(duk_context *ctx)
@@ -2414,6 +2434,13 @@ duk_ret_t ILibDutkape_ChainViewer_cleanup(duk_context *ctx)
ILibChain_SafeRemove(duk_ctx_chain(ctx), link);
return(0);
}
duk_ret_t ILibDuktape_ChainViewer_getTimerInfo(duk_context *ctx)
{
char *v = ILibChain_GetMetadataForTimers(duk_ctx_chain(ctx));
duk_push_string(ctx, v);
ILibMemory_Free(v);
return(1);
}
void ILibDuktape_ChainViewer_Push(duk_context *ctx, void *chain)
{
duk_push_object(ctx); // [viewer]
@@ -2426,6 +2453,7 @@ void ILibDuktape_ChainViewer_Push(duk_context *ctx, void *chain)
ILibDuktape_EventEmitter *emitter = ILibDuktape_EventEmitter_Create(ctx);
ILibDuktape_EventEmitter_CreateEventEx(emitter, "PostSelect");
ILibDuktape_CreateInstanceMethod(ctx, "getSnapshot", ILibDuktape_ChainViewer_getSnapshot, 0);
ILibDuktape_CreateInstanceMethod(ctx, "getTimerInfo", ILibDuktape_ChainViewer_getTimerInfo, 0);
duk_push_array(ctx); duk_put_prop_string(ctx, -2, ILibDuktape_ChainViewer_PromiseList);
ILibPrependToChain(chain, (void*)t);

View File

@@ -906,6 +906,9 @@ typedef struct LifeTimeMonitorData
void *data;
ILibLifeTime_OnCallback CallbackPtr;
ILibLifeTime_OnCallback DestroyPtr;
char *file;
uint32_t line;
char *metadata;
}LifeTimeMonitorData;
struct ILibLifeTime
{
@@ -3243,6 +3246,64 @@ char *ILibChain_GetMetaDataFromDescriptorSetEx(void *chain, fd_set *inr, fd_set
return(retStr);
}
char *ILibChain_GetMetadataForTimers(void *chain)
{
void *node;
struct LifeTimeMonitorData *Temp = NULL;
struct ILibLifeTime *LifeTimeMonitor = (struct ILibLifeTime*)ILibGetBaseTimer(chain);
size_t retlen = 0;
char *ret = NULL;
int i;
int64_t current = ILibGetUptime();
ILibLinkedList_Lock(LifeTimeMonitor->ObjectList);
while (1)
{
node = ILibLinkedList_GetNode_Head(LifeTimeMonitor->ObjectList);
while (node != NULL)
{
Temp = (struct LifeTimeMonitorData*)ILibLinkedList_GetDataFromNode(node);
if (ret == NULL)
{
if (Temp->metadata == NULL)
{
retlen += snprintf(NULL, 0, " Expiration: %llu ms (%p) [%s:%u]\n", Temp->ExpirationTick - current, Temp->data, Temp->file, Temp->line);
}
else
{
retlen += snprintf(NULL, 0, " Expiration: %llu ms (%p) [%s]\n", Temp->ExpirationTick - current, Temp->data, Temp->metadata);
}
}
else
{
if (Temp->metadata == NULL)
{
i = sprintf_s(ret + retlen, ILibMemory_Size(ret) - retlen, " Expiration: %llu ms (%p) [%s:%u]\n", Temp->ExpirationTick - current, Temp->data, Temp->file, Temp->line);
}
else
{
i = sprintf_s(ret + retlen, ILibMemory_Size(ret) - retlen, " Expiration: %llu ms (%p) [%s]\n", Temp->ExpirationTick - current, Temp->data, Temp->metadata != NULL ? Temp->metadata : "?");
}
if (i > 0) { retlen += i; }
}
node = ILibLinkedList_GetNextNode(node);
}
if (ret == NULL)
{
ret = ILibMemory_SmartAllocate(retlen + 1);
retlen = 0;
}
else
{
break;
}
}
ILibLinkedList_UnLock(LifeTimeMonitor->ObjectList);
return(ret);
}
void *ILibChain_GetObjectForDescriptor(void *chain, int fd)
{
void *ret = NULL;
@@ -7302,15 +7363,18 @@ long long ILibLifeTime_GetExpiration(void *LifetimeMonitorObject, void *data)
return -1;
}
/*! \fn ILibLifeTime_AddEx(void *LifetimeMonitorObject,void *data, int ms, void* Callback, void* Destroy)
/*! \fn ILibLifeTime_AddEx4(void *LifetimeMonitorObject,void *data, int ms, void* Callback, void* Destroy)
\brief Registers a timed callback with millisecond granularity
\param LifetimeMonitorObject The \a ILibLifeTime object to add the timed callback to
\param data The data object to associate with the timed callback
\param ms The number of milliseconds for the timed callback
\param Callback The callback function pointer to trigger when the specified time elapses
\param Destroy The abort function pointer, which triggers all non-triggered timed callbacks, upon shutdown
\param file (Autofilled)
\param line (Autofilled)
\param metadata Metadata to be associated with this timer
*/
void ILibLifeTime_AddEx(void *LifetimeMonitorObject,void *data, int ms, ILibLifeTime_OnCallback Callback, ILibLifeTime_OnCallback Destroy)
ILibLifeTime_Token ILibLifeTime_AddEx4(void *LifetimeMonitorObject, void *data, int ms, ILibLifeTime_OnCallback Callback, ILibLifeTime_OnCallback Destroy, char *file, uint32_t line, char *metadata)
{
struct LifeTimeMonitorData *temp;
struct LifeTimeMonitorData *ltms;
@@ -7320,7 +7384,7 @@ void ILibLifeTime_AddEx(void *LifetimeMonitorObject,void *data, int ms, ILibLife
if (LifetimeMonitorObject == NULL)
{
if (Destroy != NULL) { Destroy(data); }
return;
return(NULL);
}
if ((ltms = (struct LifeTimeMonitorData*)malloc(sizeof(struct LifeTimeMonitorData))) == NULL) ILIBCRITICALEXIT(254);
memset(ltms,0,sizeof(struct LifeTimeMonitorData));
@@ -7337,6 +7401,14 @@ void ILibLifeTime_AddEx(void *LifetimeMonitorObject,void *data, int ms, ILibLife
ltms->CallbackPtr = Callback;
ltms->DestroyPtr = Destroy;
ltms->file = file;
ltms->line = line;
if (metadata != NULL)
{
ltms->metadata = ILibMemory_SmartAllocate(1+ strnlen_s(metadata, 512));
strcpy_s(ltms->metadata, ILibMemory_Size(ltms->metadata), metadata);
}
ILibLinkedList_Lock(LifeTimeMonitor->ObjectList);
// Add the node to the list
@@ -7372,8 +7444,20 @@ void ILibLifeTime_AddEx(void *LifetimeMonitorObject,void *data, int ms, ILibLife
if (LifeTimeMonitor->NextTriggerTick > ltms->ExpirationTick || LifeTimeMonitor->NextTriggerTick == -1) LifeTimeMonitor->NextTriggerTick = ltms->ExpirationTick;
ILibLinkedList_UnLock(LifeTimeMonitor->ObjectList);
return((void*)ltms);
}
void ILibLifeTime_SetMetadata(ILibLifeTime_Token obj, char *metadata, size_t metadataLen)
{
LifeTimeMonitorData *data = (LifeTimeMonitorData*)obj;
if (metadataLen == 0) { metadataLen = strnlen_s(metadata, 512); }
size_t oldLen = data->metadata != NULL ? (ILibMemory_Size(data->metadata)-1) : 0;
char *val = (char*)ILibMemory_SmartReAllocate(data->metadata, oldLen + metadataLen + 3);
sprintf_s(val + oldLen, ILibMemory_Size(val) - oldLen, "%s%s", oldLen>0?", ":"", metadata);
data->metadata = val;
}
//
// An internal method used by the ILibLifeTime methods
//
@@ -7464,7 +7548,7 @@ void ILibLifeTime_Check(void *LifeTimeMonitorObject, fd_set *readset, fd_set *wr
//
if (EVT->DestroyPtr != NULL) { EVT->DestroyPtr(EVT->data); }
}
ILibMemory_Free(EVT->metadata);
free(EVT);
node = ILibQueue_DeQueue(EventQueue);
}
@@ -7530,6 +7614,7 @@ void ILibLifeTime_Remove(void *LifeTimeToken, void *data)
while (evt != NULL)
{
if (evt->DestroyPtr != NULL) {evt->DestroyPtr(evt->data);}
ILibMemory_Free(evt->metadata);
free(evt);
evt = (struct LifeTimeMonitorData*)ILibQueue_DeQueue(EventQueue);
}

View File

@@ -1050,6 +1050,7 @@ int ILibIsRunningOnChainThread(void* chain);
void *ILibChain_GetObjectForDescriptor(void *chain, int fd);
char *ILibChain_GetMetaDataFromDescriptorSet(void *chain, fd_set *inr, fd_set *inw, fd_set *ine);
char *ILibChain_GetMetaDataFromDescriptorSetEx(void *chain, fd_set *inr, fd_set *inw, fd_set *ine);
char *ILibChain_GetMetadataForTimers(void *chain);
#ifdef WIN32
typedef void(*ILib_GenericReadHandler)(char *buffer, int bufferLen, DWORD* bytesConsumed, void* user1, void *user2);
typedef BOOL(*ILibChain_ReadEx_Handler)(void *chain, HANDLE h, ILibWaitHandle_ErrorStatus status, char *buffer, DWORD bytesRead, void* user);
@@ -1361,13 +1362,17 @@ int ILibIsRunningOnChainThread(void* chain);
*/
typedef void(*ILibLifeTime_OnCallback)(void *obj);
typedef void* ILibLifeTime_Token;
//
// Adds an event trigger to be called after the specified time elapses, with the
// specified data object
//
#define ILibLifeTime_Add(LifetimeMonitorObject, data, seconds, Callback, Destroy) ILibLifeTime_AddEx(LifetimeMonitorObject, data, seconds * 1000, Callback, Destroy)
void ILibLifeTime_AddEx(void *LifetimeMonitorObject,void *data, int milliseconds, ILibLifeTime_OnCallback Callback, ILibLifeTime_OnCallback Destroy);
ILibLifeTime_Token ILibLifeTime_AddEx4(void *LifetimeMonitorObject, void *data, int milliseconds, ILibLifeTime_OnCallback Callback, ILibLifeTime_OnCallback Destroy, char *file, uint32_t line, char *metadata);
#define ILibLifeTime_AddEx3(LifetimeMonitorObject, data, milliseconds, Callback, Destroy, metadata) ILibLifeTime_AddEx4(LifetimeMonitorObject, data, milliseconds, Callback, Destroy, __FILE__, __LINE__, metadata)
#define ILibLifeTime_AddEx2(LifetimeMonitorObject, data, milliseconds, Callback, Destroy, file, line) ILibLifeTime_AddEx4(LifetimeMonitorObject, data, milliseconds, Callback, Destroy, file, line, NULL)
#define ILibLifeTime_Add(LifetimeMonitorObject, data, seconds, Callback, Destroy) ILibLifeTime_AddEx(LifetimeMonitorObject, data, seconds * 1000, Callback, Destroy)
#define ILibLifeTime_AddEx(LifetimeMonitorObject, data, milliseconds, Callback, Destroy) ILibLifeTime_AddEx2(LifetimeMonitorObject, data, milliseconds, Callback, Destroy, __FILE__, __LINE__)
void ILibLifeTime_SetMetadata(ILibLifeTime_Token obj, char *metadata, size_t metadataLen);
//
// Removes all event triggers that contain the specified data object.