diff --git a/common/utils/itti/memory_pools.c b/common/utils/itti/memory_pools.c index 6004c70e66d733488b1b15c61e2ec688b92af78b..8bacb576e33d66f22ad20132c1fb7e18f6349991 100644 --- a/common/utils/itti/memory_pools.c +++ b/common/utils/itti/memory_pools.c @@ -37,9 +37,13 @@ const static int mp_debug = 0; #ifdef RTAI # define MP_DEBUG(x, args...) do { if (mp_debug) rt_printk("[MP][D]"x, ##args); } \ while(0) +# define MP_ERROR(x, args...) do { rt_printk("[MP][E]"x, ##args); } \ + while(0) #else # define MP_DEBUG(x, args...) do { if (mp_debug) fprintf(stdout, "[MP][D]"x, ##args); fflush (stdout); } \ while(0) +# define MP_ERROR(x, args...) do { fprintf(stdout, "[MP][E]"x, ##args); } \ + while(0) #endif /*------------------------------------------------------------------------------*/ @@ -71,12 +75,14 @@ typedef uint32_t pool_start_mark_t; typedef uint32_t pools_start_mark_t; typedef uint8_t pool_id_t; +typedef uint8_t item_status_t; typedef struct memory_pool_item_start_s { pool_item_start_mark_t start_mark; pool_id_t pool_id; - uint32_t info; + item_status_t item_status; + uint16_t info[2]; } memory_pool_item_start_t; typedef struct memory_pool_item_end_s { @@ -99,6 +105,7 @@ typedef struct memory_pool_s { memory_pool_item_t *items; } memory_pool_t; + typedef struct memory_pools_s { pools_start_mark_t start_mark; @@ -115,6 +122,9 @@ static const uint32_t MAX_POOL_ITEM_SIZE = 100 * 1000; static const pool_item_start_mark_t POOL_ITEM_START_MARK = CHARS_TO_UINT32 ('P', 'I', 's', 't'); static const pool_item_end_mark_t POOL_ITEM_END_MARK = CHARS_TO_UINT32 ('p', 'i', 'E', 'N'); +static const item_status_t ITEM_STATUS_FREE = 'F'; +static const item_status_t ITEM_STATUS_ALLOCATED = 'a'; + static const pool_start_mark_t POOL_START_MARK = CHARS_TO_UINT32 ('P', '_', 's', 't'); static const pools_start_mark_t POOLS_START_MARK = CHARS_TO_UINT32 ('P', 'S', 's', 't'); @@ -165,7 +175,11 @@ static inline void items_group_put_free_item (items_group_t *items_group, items_ /* Calculate next position */ next = items_group->current + 1; /* Checks if next position is free */ - if (items_group->indexes[next] == ITEMS_GROUP_INDEX_INVALID) + if (items_group->indexes[next] != ITEMS_GROUP_INDEX_INVALID) + { + MP_DEBUG(" items_group_put_free_item (items_group->indexes[next] != ITEMS_GROUP_INDEX_INVALID) %d, %d\n", next, index); + } + else { /* Try to write index in next position */ index_previous = __sync_fetch_and_add (&items_group->indexes[next], index_to_add); @@ -175,6 +189,8 @@ static inline void items_group_put_free_item (items_group_t *items_group, items_ /* Next position was not free anymore, restore its value */ __sync_fetch_and_add (&items_group->indexes[next], -index_to_add); current = ITEMS_GROUP_POSITION_INVALID; + + MP_DEBUG(" items_group_put_free_item (index_previous != ITEMS_GROUP_INDEX_INVALID) %d\n", index); } else { @@ -184,6 +200,8 @@ static inline void items_group_put_free_item (items_group_t *items_group, items_ /* Next position content has been changed, restore its value */ __sync_fetch_and_add (&items_group->indexes[next], -index_to_add); current = ITEMS_GROUP_POSITION_INVALID; + + MP_DEBUG(" items_group_put_free_item (items_group->indexes[next] != index) %d\n", index); } else { @@ -195,6 +213,8 @@ static inline void items_group_put_free_item (items_group_t *items_group, items_ /* Current position does not match calculated next position, restore previous values */ __sync_fetch_and_add (&items_group->current, -1); __sync_fetch_and_add (&items_group->indexes[next], -index_to_add); + + MP_DEBUG(" items_group_put_free_item (next != current) %d\n", index); } } } @@ -354,10 +374,11 @@ int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t p /* Initialize items */ for (item_index = 0; item_index < pool_items_number; item_index++) { - memory_pool_item = memory_pool_item_from_index (memory_pool, item_index); - memory_pool_item->start.start_mark = POOL_ITEM_START_MARK; - memory_pool_item->start.pool_id = pool; - memory_pool_item->data[memory_pool->item_data_number] = POOL_ITEM_END_MARK; + memory_pool_item = memory_pool_item_from_index (memory_pool, item_index); + memory_pool_item->start.start_mark = POOL_ITEM_START_MARK; + memory_pool_item->start.pool_id = pool; + memory_pool_item->start.item_status = ITEM_STATUS_FREE; + memory_pool_item->data[memory_pool->item_data_number] = POOL_ITEM_END_MARK; } } @@ -366,7 +387,7 @@ int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t p return (0); } -memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_pools_handle, uint32_t item_size, uint32_t info) +memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_pools_handle, uint32_t item_size, uint16_t info_0, uint16_t info_1) { memory_pools_t *memory_pools; memory_pool_item_t *memory_pool_item; @@ -402,23 +423,33 @@ memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_po if (item_index > ITEMS_GROUP_INDEX_INVALID) { /* Convert item index into memory_pool_item address */ - memory_pool_item = memory_pool_item_from_index (&memory_pools->pools[pool], item_index); - memory_pool_item->start.info = info; - memory_pool_item_handle = memory_pool_item->data; - - MP_DEBUG(" Alloc [%2u][%6d]{%6u}, %4u, %6u, %p, %p, %p\n", - pool, item_index, memory_pools->pools[pool].items_group_free.minimum, - info, item_size, memory_pools->pools[pool].items, memory_pool_item, memory_pool_item_handle); + memory_pool_item = memory_pool_item_from_index (&memory_pools->pools[pool], item_index); + /* Sanity check on item status, must be free */ + DevCheck (memory_pool_item->start.item_status == ITEM_STATUS_FREE, memory_pool_item->start.item_status, pool, item_index); + + memory_pool_item->start.item_status = ITEM_STATUS_ALLOCATED; + memory_pool_item->start.info[0] = info_0; + memory_pool_item->start.info[1] = info_1; + memory_pool_item_handle = memory_pool_item->data; + + MP_DEBUG(" Alloc [%2u][%6d]{%6u}, %3u %3u, %6u, %p, %p, %p\n", + pool, item_index, + memory_pools->pools[pool].items_group_free.minimum, + info_0, info_1, + item_size, + memory_pools->pools[pool].items, + memory_pool_item, + memory_pool_item_handle); } else { - MP_DEBUG(" Alloc [--][------]{------}, %4u, %6u, failed!\n", info, item_size); + MP_DEBUG(" Alloc [--][------]{------}, %3u %3u, %6u, failed!\n", info_0, info_1, item_size); } return memory_pool_item_handle; } -void memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, uint32_t info) +void memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, uint16_t info) { memory_pools_t *memory_pools; memory_pool_item_t *memory_pool_item; @@ -439,15 +470,21 @@ void memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_i pool_item_size = memory_pools->pools[pool].pool_item_size; item_index = (((void *) memory_pool_item) - ((void *) memory_pools->pools[pool].items)) / pool_item_size; - MP_DEBUG(" Free [%2u][%6d]{%6u}, %4u, %p, %p, %p, %u\n", + MP_DEBUG(" Free [%2u][%6d]{%6u}, %3u %3u, %p, %p, %p, %u\n", pool, item_index, memory_pools->pools[pool].items_group_free.current, - info, memory_pool_item_handle, memory_pool_item, memory_pools->pools[pool].items, item_size * sizeof(memory_pool_data_t)); + memory_pool_item->start.info[0], memory_pool_item->start.info[1], + memory_pool_item_handle, memory_pool_item, + memory_pools->pools[pool].items, item_size * sizeof(memory_pool_data_t)); /* Sanity check on calculated item index */ DevCheck (memory_pool_item == memory_pool_item_from_index(&memory_pools->pools[pool], item_index), memory_pool_item, memory_pool_item_from_index(&memory_pools->pools[pool], item_index), pool); - /* Check if end marker is still present (no write overflow) */ + /* Sanity check on end marker, must still be present (no write overflow) */ DevCheck (memory_pool_item->data[item_size] == POOL_ITEM_END_MARK, pool, 0, 0); + /* Sanity check on item status, must be allocated */ + DevCheck (memory_pool_item->start.item_status == ITEM_STATUS_ALLOCATED, memory_pool_item->start.item_status, pool, item_index); + + memory_pool_item->start.item_status = ITEM_STATUS_FREE; items_group_put_free_item(&memory_pools->pools[pool].items_group_free, item_index); } diff --git a/common/utils/itti/memory_pools.h b/common/utils/itti/memory_pools.h index 7ed44c661a2a1b727cb469a425a25f1cf6add6e0..c5fc8908fb62adbc76b7d09cc5190d86c3a5c4cb 100644 --- a/common/utils/itti/memory_pools.h +++ b/common/utils/itti/memory_pools.h @@ -42,8 +42,8 @@ char *memory_pools_statistics(memory_pools_handle_t memory_pools_handle); int memory_pools_add_pool (memory_pools_handle_t memory_pools_handle, uint32_t pool_items_number, uint32_t pool_item_size); -memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_pools_handle, uint32_t item_size, uint32_t info); +memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_pools_handle, uint32_t item_size, uint16_t info_0, uint16_t info_1); -void memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, uint32_t info); +void memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_item_handle_t memory_pool_item_handle, uint16_t info_0); #endif /* MEMORY_POOLS_H_ */