1
0
mirror of https://github.com/adtools/clib2.git synced 2025-12-08 14:59:05 +00:00

Rewritten to use setjmp()/longjmp()

Also contains new code which prints the number of times a slab was reused.
This commit is contained in:
obarthel
2016-12-04 11:08:41 +01:00
parent 35434bdedc
commit bfba44bf83

View File

@@ -41,9 +41,13 @@
/****************************************************************************/ /****************************************************************************/
#include <setjmp.h>
/****************************************************************************/
struct context struct context
{ {
int status; jmp_buf abort_buf;
void * user_data; void * user_data;
__slab_status_callback callback; __slab_status_callback callback;
char * buffer; char * buffer;
@@ -53,8 +57,6 @@ struct context
/****************************************************************************/ /****************************************************************************/
static void print(struct context * ct, const char * format, ...) static void print(struct context * ct, const char * format, ...)
{
if(ct->status == 0)
{ {
va_list args; va_list args;
int len; int len;
@@ -69,8 +71,8 @@ static void print(struct context * ct, const char * format, ...)
if(len >= (int)ct->buffer_size) if(len >= (int)ct->buffer_size)
len = strlen(ct->buffer); len = strlen(ct->buffer);
ct->status = (*ct->callback)(ct->user_data, ct->buffer, len); if((*ct->callback)(ct->user_data, ct->buffer, len) != 0)
} longjmp(ct->abort_buf,-1);
} }
/****************************************************************************/ /****************************************************************************/
@@ -83,11 +85,11 @@ __get_slab_stats(void * user_data, __slab_status_callback callback)
static int times_checked = 1; static int times_checked = 1;
const struct SlabNode * sn; const struct SlabNode * sn;
size_t num_empty_slabs = 0; volatile size_t num_empty_slabs = 0;
size_t num_full_slabs = 0; volatile size_t num_full_slabs = 0;
size_t num_slabs = 0; volatile size_t num_slabs = 0;
size_t slab_allocation_size = 0; volatile size_t slab_allocation_size = 0;
size_t total_slab_allocation_size = 0; volatile size_t total_slab_allocation_size = 0;
struct context ct; struct context ct;
char line[1024]; char line[1024];
char time_buffer[40]; char time_buffer[40];
@@ -104,6 +106,8 @@ __get_slab_stats(void * user_data, __slab_status_callback callback)
__memory_lock(); __memory_lock();
if(setjmp(ct.abort_buf) == 0)
{
now = time(NULL); now = time(NULL);
localtime_r(&now, &when); localtime_r(&now, &when);
@@ -124,7 +128,7 @@ __get_slab_stats(void * user_data, __slab_status_callback callback)
print(&ct,"\t\"single_allocations\": [\n"); print(&ct,"\t\"single_allocations\": [\n");
for(ssa = (struct SlabSingleAllocation *)__slab_data.sd_SingleAllocations.mlh_Head ; for(ssa = (struct SlabSingleAllocation *)__slab_data.sd_SingleAllocations.mlh_Head ;
ssa->ssa_MinNode.mln_Succ != NULL && ct.status == 0 ; ssa->ssa_MinNode.mln_Succ != NULL ;
ssa = (struct SlabSingleAllocation *)ssa->ssa_MinNode.mln_Succ) ssa = (struct SlabSingleAllocation *)ssa->ssa_MinNode.mln_Succ)
{ {
print(&ct,"\t\t{ \"size\": %lu, \"total_size\": %lu }%s\n", print(&ct,"\t\t{ \"size\": %lu, \"total_size\": %lu }%s\n",
@@ -169,18 +173,19 @@ __get_slab_stats(void * user_data, __slab_status_callback callback)
print(&ct,"\t\"slabs\": [\n"); print(&ct,"\t\"slabs\": [\n");
for(i = 0 ; i < (int)NUM_ENTRIES(__slab_data.sd_Slabs) && ct.status == 0 ; i++) for(i = 0 ; i < (int)NUM_ENTRIES(__slab_data.sd_Slabs) ; i++)
{ {
for(sn = (struct SlabNode *)__slab_data.sd_Slabs[i].mlh_Head ; for(sn = (struct SlabNode *)__slab_data.sd_Slabs[i].mlh_Head ;
sn->sn_MinNode.mln_Succ != NULL && ct.status == 0 ; sn->sn_MinNode.mln_Succ != NULL ;
sn = (struct SlabNode *)sn->sn_MinNode.mln_Succ) sn = (struct SlabNode *)sn->sn_MinNode.mln_Succ)
{ {
print(&ct,"%s\t\t{ \"size\": %lu, \"chunks\": %lu, \"chunks_in_use\": %lu, \"times_reused\": %lu }", print(&ct,"%s\t\t{ \"size\": %lu, \"chunks\": %lu, \"chunks_in_use\": %lu, \"times_reused\": %lu, \"empty_decay\": %lu }",
eol, eol,
sn->sn_ChunkSize, sn->sn_ChunkSize,
sn->sn_Count, sn->sn_Count,
sn->sn_UseCount, sn->sn_UseCount,
sn->sn_NumReused); sn->sn_NumReused,
sn->sn_EmptyDecay);
eol = ",\n"; eol = ",\n";
} }
@@ -194,6 +199,7 @@ __get_slab_stats(void * user_data, __slab_status_callback callback)
} }
print(&ct,"}\n"); print(&ct,"}\n");
}
__memory_unlock(); __memory_unlock();
} }