diff options
author | Barry Spinney <spinney@mellanox.com> | 2016-06-03 18:49:01 -0400 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2016-06-06 09:32:39 +0300 |
commit | d9f145d4e66ce65872667b05691b29712276e241 (patch) | |
tree | e67f9584a0146ac71e773c2bfcee8153b5be7a4b | |
parent | 35ca8ab29981bbe44960d4c3fcf3cd43016b35b9 (diff) |
linux-generic: tm: completed implementing _odp_timer_wheel_destroy
Previously _odp_timer_wheel_destroy() had one remaining TODO, which was
to free the malloc'd "block_of_timer_blks". To do this required adding
a new data structure to record the original malloc result, since
previously this malloc'd result was then chopped up into many
individual timer_blk records, and the original malloc result was no
longer available.
Signed-off-by: Barry Spinney <spinney@mellanox.com>
Reviewed-and-tested-by: Bill Fischofer <bill.fischofer@linaro.org>
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
-rw-r--r-- | platform/linux-generic/odp_timer_wheel.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/platform/linux-generic/odp_timer_wheel.c b/platform/linux-generic/odp_timer_wheel.c index 66600b775..ca2a3e4e5 100644 --- a/platform/linux-generic/odp_timer_wheel.c +++ b/platform/linux-generic/odp_timer_wheel.c @@ -72,6 +72,13 @@ struct timer_blk_s { }; }; +/* The following record type is only needed/used to free the timer_blks. */ +typedef struct blk_of_timer_blks_desc_s blk_of_timer_blks_desc_t; +struct blk_of_timer_blks_desc_s { + blk_of_timer_blks_desc_t *next; + timer_blk_t *block_of_timer_blks; +}; + /* Each current_timer_slot is 8 bytes long. */ typedef union { /* The selection of which union element to use is based on the LSB @@ -159,6 +166,8 @@ typedef struct { general_wheel_t *general_wheels[3]; expired_ring_t *expired_timers_ring; tm_system_t *tm_system; + + blk_of_timer_blks_desc_t *timer_blks_list_head; } timer_wheels_t; static uint32_t _odp_internal_ilog2(uint64_t value) @@ -274,17 +283,28 @@ static int expired_ring_create(timer_wheels_t *timer_wheels, static int free_list_add(timer_wheels_t *timer_wheels, uint32_t num_timer_blks) { - timer_blk_t *block_of_timer_blks, *timer_blk, *next_timer_blk; - uint32_t malloc_len, idx; + blk_of_timer_blks_desc_t *blk_of_timer_blks_desc; + timer_blk_t *block_of_timer_blks, *timer_blk; + timer_blk_t *next_timer_blk; + uint32_t malloc_len, idx; - malloc_len = num_timer_blks * sizeof(timer_blk_t); /* Should be cacheline aligned! */ + malloc_len = num_timer_blks * sizeof(timer_blk_t); block_of_timer_blks = malloc(malloc_len); if (!block_of_timer_blks) return -1; memset(block_of_timer_blks, 0, malloc_len); + /* Now malloc, initialize and link a descriptor record describing this + * block_of_timer_blks allocation done above. This is only used to + * free this memory. */ + blk_of_timer_blks_desc = malloc(sizeof(blk_of_timer_blks_desc_t)); + memset(blk_of_timer_blks_desc, 0, sizeof(blk_of_timer_blks_desc_t)); + blk_of_timer_blks_desc->block_of_timer_blks = block_of_timer_blks; + blk_of_timer_blks_desc->next = timer_wheels->timer_blks_list_head; + timer_wheels->timer_blks_list_head = blk_of_timer_blks_desc; + /* Link these timer_blks together. */ timer_blk = block_of_timer_blks; next_timer_blk = timer_blk + 1; @@ -955,13 +975,22 @@ void _odp_timer_wheel_stats_print(_odp_timer_wheel_t timer_wheel) void _odp_timer_wheel_destroy(_odp_timer_wheel_t timer_wheel) { - timer_wheels_t *timer_wheels; - expired_ring_t *expired_ring; + blk_of_timer_blks_desc_t *blk_of_timer_blks_desc, *next_desc; + timer_wheels_t *timer_wheels; + expired_ring_t *expired_ring; timer_wheels = (timer_wheels_t *)(uintptr_t)timer_wheel; expired_ring = timer_wheels->expired_timers_ring; - /* First free all of the block_of_timer_blks @TODO */ + /* First free all of the block_of_timer_blks */ + blk_of_timer_blks_desc = timer_wheels->timer_blks_list_head; + while (blk_of_timer_blks_desc) { + next_desc = blk_of_timer_blks_desc->next; + free(blk_of_timer_blks_desc->block_of_timer_blks); + free(blk_of_timer_blks_desc); + blk_of_timer_blks_desc = next_desc; + } + free(timer_wheels->current_wheel); free(timer_wheels->general_wheels[0]); free(timer_wheels->general_wheels[1]); |