X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftimer%2Ftimer.c;fp=ccan%2Ftimer%2Ftimer.c;h=607415620c6223d9620d70606d851c70da00af74;hb=23e72d4194172b52d26fed9f36c7af9b893f4649;hp=84d7aa1454a24383fd0aff6e635d3bfe1d073cbc;hpb=580457bd3e4af60d5367412589d2aa1bb0289eed;p=ccan diff --git a/ccan/timer/timer.c b/ccan/timer/timer.c index 84d7aa14..60741562 100644 --- a/ccan/timer/timer.c +++ b/ccan/timer/timer.c @@ -11,6 +11,33 @@ struct timer_level { struct list_head list[PER_LEVEL]; }; +static void *timer_default_alloc(size_t len, void *arg) +{ + return malloc(len); +} + +static void timer_default_free(const void *p, void *arg) +{ + free((void *)p); +} + +static void *(*timer_alloc)(size_t, void *) = timer_default_alloc; +static void (*timer_free)(const void *, void *) = timer_default_free; +static void *timer_arg; + +void timers_set_allocator(void *(*alloc)(size_t len, void *arg), + void (*free)(const void *p, void *arg), + void *arg) +{ + if (!alloc) + alloc = timer_default_alloc; + if (!free) + free = timer_default_free; + timer_alloc = alloc; + timer_free = free; + timer_arg = arg; +} + static uint64_t time_to_grains(struct timemono t) { return t.ts.tv_sec * ((uint64_t)1000000000 / TIMER_GRANULARITY) @@ -139,7 +166,7 @@ static void add_level(struct timers *timers, unsigned int level) unsigned int i; struct list_head from_far; - l = malloc(sizeof(*l)); + l = timer_alloc(sizeof(*l), timer_arg); if (!l) return; @@ -520,5 +547,5 @@ void timers_cleanup(struct timers *timers) unsigned int l; for (l = 0; l < ARRAY_SIZE(timers->level); l++) - free(timers->level[l]); + timer_free(timers->level[l], timer_arg); }