mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-15 15:53:55 +00:00
Added ability to track timers
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user