aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Spinney <spinney@mellanox.com>2016-06-03 18:49:01 -0400
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-06-06 09:32:39 +0300
commitd9f145d4e66ce65872667b05691b29712276e241 (patch)
treee67f9584a0146ac71e773c2bfcee8153b5be7a4b
parent35ca8ab29981bbe44960d4c3fcf3cd43016b35b9 (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.c41
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]);