Styles fixes in liballocator: indentation and braces rules.
This commit is contained in:
@@ -53,28 +53,28 @@ mem_finalize (bool is_show_mem_stats) /**< show heap memory stats
|
|||||||
mem_pools_finalize ();
|
mem_pools_finalize ();
|
||||||
|
|
||||||
if (is_show_mem_stats)
|
if (is_show_mem_stats)
|
||||||
{
|
{
|
||||||
mem_heap_print (false, false, true);
|
mem_heap_print (false, false, true);
|
||||||
|
|
||||||
#ifdef MEM_STATS
|
#ifdef MEM_STATS
|
||||||
mem_pools_stats_t stats;
|
mem_pools_stats_t stats;
|
||||||
mem_pools_get_stats (&stats);
|
mem_pools_get_stats (&stats);
|
||||||
|
|
||||||
__printf ("Pools stats:\n");
|
__printf ("Pools stats:\n");
|
||||||
__printf (" Chunk size: %u\n"
|
__printf (" Chunk size: %u\n"
|
||||||
" Pools: %lu\n"
|
" Pools: %lu\n"
|
||||||
" Allocated chunks: %lu\n"
|
" Allocated chunks: %lu\n"
|
||||||
" Free chunks: %lu\n"
|
" Free chunks: %lu\n"
|
||||||
" Peak pools: %lu\n"
|
" Peak pools: %lu\n"
|
||||||
" Peak allocated chunks: %lu\n\n",
|
" Peak allocated chunks: %lu\n\n",
|
||||||
MEM_POOL_CHUNK_SIZE,
|
MEM_POOL_CHUNK_SIZE,
|
||||||
stats.pools_count,
|
stats.pools_count,
|
||||||
stats.allocated_chunks,
|
stats.allocated_chunks,
|
||||||
stats.free_chunks,
|
stats.free_chunks,
|
||||||
stats.peak_pools_count,
|
stats.peak_pools_count,
|
||||||
stats.peak_allocated_chunks);
|
stats.peak_allocated_chunks);
|
||||||
#endif /* MEM_STATS */
|
#endif /* MEM_STATS */
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_heap_finalize ();
|
mem_heap_finalize ();
|
||||||
} /* mem_finalize */
|
} /* mem_finalize */
|
||||||
@@ -94,20 +94,20 @@ mem_get_base_pointer (void)
|
|||||||
uintptr_t
|
uintptr_t
|
||||||
mem_compress_pointer (void *pointer) /**< pointer to compress */
|
mem_compress_pointer (void *pointer) /**< pointer to compress */
|
||||||
{
|
{
|
||||||
JERRY_ASSERT(pointer != NULL);
|
JERRY_ASSERT(pointer != NULL);
|
||||||
|
|
||||||
uintptr_t int_ptr = (uintptr_t) pointer;
|
uintptr_t int_ptr = (uintptr_t) pointer;
|
||||||
|
|
||||||
JERRY_ASSERT(int_ptr % MEM_ALIGNMENT == 0);
|
JERRY_ASSERT(int_ptr % MEM_ALIGNMENT == 0);
|
||||||
|
|
||||||
int_ptr -= mem_get_base_pointer ();
|
int_ptr -= mem_get_base_pointer ();
|
||||||
int_ptr >>= MEM_ALIGNMENT_LOG;
|
int_ptr >>= MEM_ALIGNMENT_LOG;
|
||||||
|
|
||||||
JERRY_ASSERT((int_ptr & ~((1u << MEM_HEAP_OFFSET_LOG) - 1)) == 0);
|
JERRY_ASSERT((int_ptr & ~((1u << MEM_HEAP_OFFSET_LOG) - 1)) == 0);
|
||||||
|
|
||||||
JERRY_ASSERT(int_ptr != MEM_COMPRESSED_POINTER_NULL);
|
JERRY_ASSERT(int_ptr != MEM_COMPRESSED_POINTER_NULL);
|
||||||
|
|
||||||
return int_ptr;
|
return int_ptr;
|
||||||
} /* mem_compress_pointer */
|
} /* mem_compress_pointer */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -116,12 +116,12 @@ mem_compress_pointer (void *pointer) /**< pointer to compress */
|
|||||||
void*
|
void*
|
||||||
mem_decompress_pointer (uintptr_t compressed_pointer) /**< pointer to decompress */
|
mem_decompress_pointer (uintptr_t compressed_pointer) /**< pointer to decompress */
|
||||||
{
|
{
|
||||||
JERRY_ASSERT(compressed_pointer != MEM_COMPRESSED_POINTER_NULL);
|
JERRY_ASSERT(compressed_pointer != MEM_COMPRESSED_POINTER_NULL);
|
||||||
|
|
||||||
uintptr_t int_ptr = compressed_pointer;
|
uintptr_t int_ptr = compressed_pointer;
|
||||||
|
|
||||||
int_ptr <<= MEM_ALIGNMENT_LOG;
|
int_ptr <<= MEM_ALIGNMENT_LOG;
|
||||||
int_ptr += mem_get_base_pointer ();
|
int_ptr += mem_get_base_pointer ();
|
||||||
|
|
||||||
return (void*) int_ptr;
|
return (void*) int_ptr;
|
||||||
} /* mem_decompress_pointer */
|
} /* mem_decompress_pointer */
|
||||||
|
|||||||
+144
-144
@@ -87,10 +87,10 @@ typedef enum
|
|||||||
typedef struct mem_block_header_t
|
typedef struct mem_block_header_t
|
||||||
{
|
{
|
||||||
mem_magic_num_of_block_t magic_num; /**< magic number - MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK for allocated block
|
mem_magic_num_of_block_t magic_num; /**< magic number - MEM_MAGIC_NUM_OF_ALLOCATED_BLOCK for allocated block
|
||||||
and MEM_MAGIC_NUM_OF_FREE_BLOCK for free block */
|
and MEM_MAGIC_NUM_OF_FREE_BLOCK for free block */
|
||||||
struct mem_block_header_t *neighbours[ MEM_DIRECTION_COUNT ]; /**< neighbour blocks */
|
struct mem_block_header_t *neighbours[ MEM_DIRECTION_COUNT ]; /**< neighbour blocks */
|
||||||
size_t allocated_bytes; /**< allocated area size - for allocated blocks;
|
size_t allocated_bytes; /**< allocated area size - for allocated blocks;
|
||||||
0 - for free blocks */
|
0 - for free blocks */
|
||||||
} mem_block_header_t;
|
} mem_block_header_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -108,8 +108,8 @@ JERRY_STATIC_ASSERT(MEM_HEAP_CHUNK_SIZE % MEM_ALIGNMENT == 0);
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t* heap_start; /**< first address of heap space */
|
uint8_t* heap_start; /**< first address of heap space */
|
||||||
size_t heap_size; /**< heap space size */
|
size_t heap_size; /**< heap space size */
|
||||||
mem_block_header_t* first_block_p; /**< first block of the heap */
|
mem_block_header_t* first_block_p; /**< first block of the heap */
|
||||||
mem_block_header_t* last_block_p; /**< last block of the heap */
|
mem_block_header_t* last_block_p; /**< last block of the heap */
|
||||||
} mem_heap_state_t;
|
} mem_heap_state_t;
|
||||||
@@ -124,10 +124,10 @@ static size_t mem_get_block_data_space_size (const mem_block_header_t *block_hea
|
|||||||
static size_t mem_get_block_chunks_count_from_data_size (size_t block_allocated_size);
|
static size_t mem_get_block_chunks_count_from_data_size (size_t block_allocated_size);
|
||||||
|
|
||||||
static void mem_init_block_header (uint8_t *first_chunk_p,
|
static void mem_init_block_header (uint8_t *first_chunk_p,
|
||||||
size_t size_in_chunks,
|
size_t size_in_chunks,
|
||||||
mem_block_state_t block_state,
|
mem_block_state_t block_state,
|
||||||
mem_block_header_t *prev_block_p,
|
mem_block_header_t *prev_block_p,
|
||||||
mem_block_header_t *next_block_p);
|
mem_block_header_t *next_block_p);
|
||||||
static void mem_check_heap (void);
|
static void mem_check_heap (void);
|
||||||
|
|
||||||
#ifdef MEM_STATS
|
#ifdef MEM_STATS
|
||||||
@@ -203,7 +203,7 @@ mem_get_block_chunks_count_from_data_size (size_t block_allocated_size) /**< siz
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
mem_heap_init (uint8_t *heap_start, /**< first address of heap space */
|
mem_heap_init (uint8_t *heap_start, /**< first address of heap space */
|
||||||
size_t heap_size) /**< heap space size */
|
size_t heap_size) /**< heap space size */
|
||||||
{
|
{
|
||||||
JERRY_ASSERT(heap_start != NULL);
|
JERRY_ASSERT(heap_start != NULL);
|
||||||
JERRY_ASSERT(heap_size != 0);
|
JERRY_ASSERT(heap_size != 0);
|
||||||
@@ -217,10 +217,10 @@ mem_heap_init (uint8_t *heap_start, /**< first address of heap space */
|
|||||||
VALGRIND_NOACCESS_SPACE(heap_start, heap_size);
|
VALGRIND_NOACCESS_SPACE(heap_start, heap_size);
|
||||||
|
|
||||||
mem_init_block_header (mem_heap.heap_start,
|
mem_init_block_header (mem_heap.heap_start,
|
||||||
0,
|
0,
|
||||||
MEM_BLOCK_FREE,
|
MEM_BLOCK_FREE,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
mem_heap.first_block_p = (mem_block_header_t*) mem_heap.heap_start;
|
mem_heap.first_block_p = (mem_block_header_t*) mem_heap.heap_start;
|
||||||
mem_heap.last_block_p = mem_heap.first_block_p;
|
mem_heap.last_block_p = mem_heap.first_block_p;
|
||||||
@@ -249,10 +249,10 @@ mem_heap_finalize (void)
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
mem_init_block_header (uint8_t *first_chunk_p, /**< address of the first chunk to use for the block */
|
mem_init_block_header (uint8_t *first_chunk_p, /**< address of the first chunk to use for the block */
|
||||||
size_t allocated_bytes, /**< size of block's allocated area */
|
size_t allocated_bytes, /**< size of block's allocated area */
|
||||||
mem_block_state_t block_state, /**< state of the block (allocated or free) */
|
mem_block_state_t block_state, /**< state of the block (allocated or free) */
|
||||||
mem_block_header_t *prev_block_p, /**< previous block */
|
mem_block_header_t *prev_block_p, /**< previous block */
|
||||||
mem_block_header_t *next_block_p) /**< next block */
|
mem_block_header_t *next_block_p) /**< next block */
|
||||||
{
|
{
|
||||||
mem_block_header_t *block_header_p = (mem_block_header_t*) first_chunk_p;
|
mem_block_header_t *block_header_p = (mem_block_header_t*) first_chunk_p;
|
||||||
|
|
||||||
@@ -292,7 +292,7 @@ mem_init_block_header (uint8_t *first_chunk_p, /**< address of the first
|
|||||||
*/
|
*/
|
||||||
uint8_t*
|
uint8_t*
|
||||||
mem_heap_alloc_block (size_t size_in_bytes, /**< size of region to allocate in bytes */
|
mem_heap_alloc_block (size_t size_in_bytes, /**< size of region to allocate in bytes */
|
||||||
mem_heap_alloc_term_t alloc_term) /**< expected allocation term */
|
mem_heap_alloc_term_t alloc_term) /**< expected allocation term */
|
||||||
{
|
{
|
||||||
mem_block_header_t *block_p;
|
mem_block_header_t *block_p;
|
||||||
mem_direction_t direction;
|
mem_direction_t direction;
|
||||||
@@ -353,34 +353,34 @@ mem_heap_alloc_block (size_t size_in_bytes, /**< size of region to all
|
|||||||
|
|
||||||
uint8_t *new_free_block_first_chunk_p = (uint8_t*) block_p + new_block_size_in_chunks * MEM_HEAP_CHUNK_SIZE;
|
uint8_t *new_free_block_first_chunk_p = (uint8_t*) block_p + new_block_size_in_chunks * MEM_HEAP_CHUNK_SIZE;
|
||||||
mem_init_block_header (new_free_block_first_chunk_p,
|
mem_init_block_header (new_free_block_first_chunk_p,
|
||||||
0,
|
0,
|
||||||
MEM_BLOCK_FREE,
|
MEM_BLOCK_FREE,
|
||||||
block_p /* there we will place new allocated block */,
|
block_p /* there we will place new allocated block */,
|
||||||
next_block_p);
|
next_block_p);
|
||||||
|
|
||||||
mem_block_header_t *new_free_block_p = (mem_block_header_t*) new_free_block_first_chunk_p;
|
mem_block_header_t *new_free_block_p = (mem_block_header_t*) new_free_block_first_chunk_p;
|
||||||
|
|
||||||
if (next_block_p == NULL)
|
if (next_block_p == NULL)
|
||||||
{
|
{
|
||||||
mem_heap.last_block_p = new_free_block_p;
|
mem_heap.last_block_p = new_free_block_p;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VALGRIND_DEFINED_STRUCT(next_block_p);
|
VALGRIND_DEFINED_STRUCT(next_block_p);
|
||||||
|
|
||||||
next_block_p->neighbours[ MEM_DIRECTION_PREV ] = (mem_block_header_t*) new_free_block_first_chunk_p;
|
next_block_p->neighbours[ MEM_DIRECTION_PREV ] = (mem_block_header_t*) new_free_block_first_chunk_p;
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
next_block_p = new_free_block_p;
|
next_block_p = new_free_block_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_init_block_header ((uint8_t*) block_p,
|
mem_init_block_header ((uint8_t*) block_p,
|
||||||
size_in_bytes,
|
size_in_bytes,
|
||||||
MEM_BLOCK_ALLOCATED,
|
MEM_BLOCK_ALLOCATED,
|
||||||
prev_block_p,
|
prev_block_p,
|
||||||
next_block_p);
|
next_block_p);
|
||||||
|
|
||||||
VALGRIND_DEFINED_STRUCT(block_p);
|
VALGRIND_DEFINED_STRUCT(block_p);
|
||||||
|
|
||||||
@@ -409,7 +409,7 @@ mem_heap_free_block (uint8_t *ptr) /**< pointer to beginning of data space of th
|
|||||||
{
|
{
|
||||||
/* checking that ptr points to the heap */
|
/* checking that ptr points to the heap */
|
||||||
JERRY_ASSERT(ptr >= mem_heap.heap_start
|
JERRY_ASSERT(ptr >= mem_heap.heap_start
|
||||||
&& ptr <= mem_heap.heap_start + mem_heap.heap_size);
|
&& ptr <= mem_heap.heap_start + mem_heap.heap_size);
|
||||||
|
|
||||||
mem_check_heap ();
|
mem_check_heap ();
|
||||||
|
|
||||||
@@ -439,63 +439,63 @@ mem_heap_free_block (uint8_t *ptr) /**< pointer to beginning of data space of th
|
|||||||
block_p->magic_num = MEM_MAGIC_NUM_OF_FREE_BLOCK;
|
block_p->magic_num = MEM_MAGIC_NUM_OF_FREE_BLOCK;
|
||||||
|
|
||||||
if (next_block_p != NULL)
|
if (next_block_p != NULL)
|
||||||
|
{
|
||||||
|
VALGRIND_DEFINED_STRUCT(next_block_p);
|
||||||
|
|
||||||
|
if (next_block_p->magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK)
|
||||||
{
|
{
|
||||||
VALGRIND_DEFINED_STRUCT(next_block_p);
|
/* merge with the next block */
|
||||||
|
mem_heap_stat_free_block_merge ();
|
||||||
|
|
||||||
if (next_block_p->magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK)
|
mem_block_header_t *next_next_block_p = next_block_p->neighbours[ MEM_DIRECTION_NEXT ];
|
||||||
{
|
|
||||||
/* merge with the next block */
|
|
||||||
mem_heap_stat_free_block_merge ();
|
|
||||||
|
|
||||||
mem_block_header_t *next_next_block_p = next_block_p->neighbours[ MEM_DIRECTION_NEXT ];
|
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
|
||||||
|
|
||||||
next_block_p = next_next_block_p;
|
|
||||||
|
|
||||||
VALGRIND_DEFINED_STRUCT(next_block_p);
|
|
||||||
|
|
||||||
block_p->neighbours[ MEM_DIRECTION_NEXT ] = next_block_p;
|
|
||||||
if (next_block_p != NULL)
|
|
||||||
{
|
|
||||||
next_block_p->neighbours[ MEM_DIRECTION_PREV ] = block_p;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mem_heap.last_block_p = block_p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
||||||
|
|
||||||
|
next_block_p = next_next_block_p;
|
||||||
|
|
||||||
|
VALGRIND_DEFINED_STRUCT(next_block_p);
|
||||||
|
|
||||||
|
block_p->neighbours[ MEM_DIRECTION_NEXT ] = next_block_p;
|
||||||
|
if (next_block_p != NULL)
|
||||||
|
{
|
||||||
|
next_block_p->neighbours[ MEM_DIRECTION_PREV ] = block_p;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mem_heap.last_block_p = block_p;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
||||||
|
}
|
||||||
|
|
||||||
if (prev_block_p != NULL)
|
if (prev_block_p != NULL)
|
||||||
|
{
|
||||||
|
VALGRIND_DEFINED_STRUCT(prev_block_p);
|
||||||
|
|
||||||
|
if (prev_block_p->magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK)
|
||||||
{
|
{
|
||||||
VALGRIND_DEFINED_STRUCT(prev_block_p);
|
/* merge with the previous block */
|
||||||
|
mem_heap_stat_free_block_merge ();
|
||||||
|
|
||||||
if (prev_block_p->magic_num == MEM_MAGIC_NUM_OF_FREE_BLOCK)
|
prev_block_p->neighbours[ MEM_DIRECTION_NEXT ] = next_block_p;
|
||||||
{
|
if (next_block_p != NULL)
|
||||||
/* merge with the previous block */
|
{
|
||||||
mem_heap_stat_free_block_merge ();
|
VALGRIND_DEFINED_STRUCT(next_block_p);
|
||||||
|
|
||||||
prev_block_p->neighbours[ MEM_DIRECTION_NEXT ] = next_block_p;
|
next_block_p->neighbours[ MEM_DIRECTION_PREV ] = block_p->neighbours[ MEM_DIRECTION_PREV ];
|
||||||
if (next_block_p != NULL)
|
|
||||||
{
|
|
||||||
VALGRIND_DEFINED_STRUCT(next_block_p);
|
|
||||||
|
|
||||||
next_block_p->neighbours[ MEM_DIRECTION_PREV ] = block_p->neighbours[ MEM_DIRECTION_PREV ];
|
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
||||||
|
}
|
||||||
VALGRIND_NOACCESS_STRUCT(next_block_p);
|
else
|
||||||
}
|
{
|
||||||
else
|
mem_heap.last_block_p = prev_block_p;
|
||||||
{
|
}
|
||||||
mem_heap.last_block_p = prev_block_p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(prev_block_p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALGRIND_NOACCESS_STRUCT(prev_block_p);
|
||||||
|
}
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(block_p);
|
VALGRIND_NOACCESS_STRUCT(block_p);
|
||||||
|
|
||||||
mem_check_heap ();
|
mem_check_heap ();
|
||||||
@@ -522,7 +522,7 @@ mem_heap_recommend_allocation_size (size_t minimum_allocation_size) /**< minimum
|
|||||||
void
|
void
|
||||||
mem_heap_print (bool dump_block_headers, /**< print block headers */
|
mem_heap_print (bool dump_block_headers, /**< print block headers */
|
||||||
bool dump_block_data, /**< print block with data (true)
|
bool dump_block_data, /**< print block with data (true)
|
||||||
or print only block header (false) */
|
or print only block header (false) */
|
||||||
bool dump_stats) /**< print heap stats */
|
bool dump_stats) /**< print heap stats */
|
||||||
{
|
{
|
||||||
mem_check_heap ();
|
mem_check_heap ();
|
||||||
@@ -530,71 +530,71 @@ mem_heap_print (bool dump_block_headers, /**< print block headers */
|
|||||||
JERRY_ASSERT(!dump_block_data || dump_block_headers);
|
JERRY_ASSERT(!dump_block_data || dump_block_headers);
|
||||||
|
|
||||||
if (dump_block_headers)
|
if (dump_block_headers)
|
||||||
|
{
|
||||||
|
__printf ("Heap: start=%p size=%lu, first block->%p, last block->%p\n",
|
||||||
|
mem_heap.heap_start,
|
||||||
|
mem_heap.heap_size,
|
||||||
|
(void*) mem_heap.first_block_p,
|
||||||
|
(void*) mem_heap.last_block_p);
|
||||||
|
|
||||||
|
for (mem_block_header_t *block_p = mem_heap.first_block_p, *next_block_p;
|
||||||
|
block_p != NULL;
|
||||||
|
block_p = next_block_p)
|
||||||
{
|
{
|
||||||
__printf ("Heap: start=%p size=%lu, first block->%p, last block->%p\n",
|
VALGRIND_DEFINED_STRUCT(block_p);
|
||||||
mem_heap.heap_start,
|
|
||||||
mem_heap.heap_size,
|
|
||||||
(void*) mem_heap.first_block_p,
|
|
||||||
(void*) mem_heap.last_block_p);
|
|
||||||
|
|
||||||
for (mem_block_header_t *block_p = mem_heap.first_block_p, *next_block_p;
|
__printf ("Block (%p): magic num=0x%08x, size in chunks=%lu, previous block->%p next block->%p\n",
|
||||||
block_p != NULL;
|
(void*) block_p,
|
||||||
block_p = next_block_p)
|
block_p->magic_num,
|
||||||
|
mem_get_block_chunks_count (block_p),
|
||||||
|
(void*) block_p->neighbours[ MEM_DIRECTION_PREV ],
|
||||||
|
(void*) block_p->neighbours[ MEM_DIRECTION_NEXT ]);
|
||||||
|
|
||||||
|
if (dump_block_data)
|
||||||
|
{
|
||||||
|
uint8_t *block_data_p = (uint8_t*) (block_p + 1);
|
||||||
|
for (uint32_t offset = 0;
|
||||||
|
offset < mem_get_block_data_space_size (block_p);
|
||||||
|
offset++)
|
||||||
{
|
{
|
||||||
VALGRIND_DEFINED_STRUCT(block_p);
|
__printf ("%02x ", block_data_p[ offset ]);
|
||||||
|
|
||||||
__printf ("Block (%p): magic num=0x%08x, size in chunks=%lu, previous block->%p next block->%p\n",
|
|
||||||
(void*) block_p,
|
|
||||||
block_p->magic_num,
|
|
||||||
mem_get_block_chunks_count (block_p),
|
|
||||||
(void*) block_p->neighbours[ MEM_DIRECTION_PREV ],
|
|
||||||
(void*) block_p->neighbours[ MEM_DIRECTION_NEXT ]);
|
|
||||||
|
|
||||||
if (dump_block_data)
|
|
||||||
{
|
|
||||||
uint8_t *block_data_p = (uint8_t*) (block_p + 1);
|
|
||||||
for (uint32_t offset = 0;
|
|
||||||
offset < mem_get_block_data_space_size (block_p);
|
|
||||||
offset++)
|
|
||||||
{
|
|
||||||
__printf ("%02x ", block_data_p[ offset ]);
|
|
||||||
}
|
|
||||||
__printf ("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
next_block_p = block_p->neighbours[ MEM_DIRECTION_NEXT ];
|
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(block_p);
|
|
||||||
}
|
}
|
||||||
|
__printf ("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
next_block_p = block_p->neighbours[ MEM_DIRECTION_NEXT ];
|
||||||
|
|
||||||
|
VALGRIND_NOACCESS_STRUCT(block_p);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef MEM_STATS
|
#ifdef MEM_STATS
|
||||||
if (dump_stats)
|
if (dump_stats)
|
||||||
{
|
{
|
||||||
__printf ("Heap stats:\n");
|
__printf ("Heap stats:\n");
|
||||||
__printf (" Heap size = %lu bytes\n"
|
__printf (" Heap size = %lu bytes\n"
|
||||||
" Chunk size = %lu bytes\n"
|
" Chunk size = %lu bytes\n"
|
||||||
" Blocks count = %lu\n"
|
" Blocks count = %lu\n"
|
||||||
" Allocated blocks count = %lu\n"
|
" Allocated blocks count = %lu\n"
|
||||||
" Allocated chunks count = %lu\n"
|
" Allocated chunks count = %lu\n"
|
||||||
" Allocated = %lu bytes\n"
|
" Allocated = %lu bytes\n"
|
||||||
" Waste = %lu bytes\n"
|
" Waste = %lu bytes\n"
|
||||||
" Peak allocated blocks count = %lu\n"
|
" Peak allocated blocks count = %lu\n"
|
||||||
" Peak allocated chunks count = %lu\n"
|
" Peak allocated chunks count = %lu\n"
|
||||||
" Peak allocated= %lu bytes\n"
|
" Peak allocated= %lu bytes\n"
|
||||||
" Peak waste = %lu bytes\n",
|
" Peak waste = %lu bytes\n",
|
||||||
mem_heap_stats.size,
|
mem_heap_stats.size,
|
||||||
MEM_HEAP_CHUNK_SIZE,
|
MEM_HEAP_CHUNK_SIZE,
|
||||||
mem_heap_stats.blocks,
|
mem_heap_stats.blocks,
|
||||||
mem_heap_stats.allocated_blocks,
|
mem_heap_stats.allocated_blocks,
|
||||||
mem_heap_stats.allocated_chunks,
|
mem_heap_stats.allocated_chunks,
|
||||||
mem_heap_stats.allocated_bytes,
|
mem_heap_stats.allocated_bytes,
|
||||||
mem_heap_stats.waste_bytes,
|
mem_heap_stats.waste_bytes,
|
||||||
mem_heap_stats.peak_allocated_blocks,
|
mem_heap_stats.peak_allocated_blocks,
|
||||||
mem_heap_stats.peak_allocated_chunks,
|
mem_heap_stats.peak_allocated_chunks,
|
||||||
mem_heap_stats.peak_allocated_bytes,
|
mem_heap_stats.peak_allocated_bytes,
|
||||||
mem_heap_stats.peak_waste_bytes);
|
mem_heap_stats.peak_waste_bytes);
|
||||||
}
|
}
|
||||||
#endif /* MEM_STATS */
|
#endif /* MEM_STATS */
|
||||||
|
|
||||||
__printf ("\n");
|
__printf ("\n");
|
||||||
@@ -614,8 +614,8 @@ mem_check_heap (void)
|
|||||||
size_t chunk_sizes_sum = 0;
|
size_t chunk_sizes_sum = 0;
|
||||||
|
|
||||||
for (mem_block_header_t *block_p = mem_heap.first_block_p, *next_block_p;
|
for (mem_block_header_t *block_p = mem_heap.first_block_p, *next_block_p;
|
||||||
block_p != NULL;
|
block_p != NULL;
|
||||||
block_p = next_block_p)
|
block_p = next_block_p)
|
||||||
{
|
{
|
||||||
VALGRIND_DEFINED_STRUCT(block_p);
|
VALGRIND_DEFINED_STRUCT(block_p);
|
||||||
|
|
||||||
@@ -636,7 +636,7 @@ mem_check_heap (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(block_p);
|
VALGRIND_NOACCESS_STRUCT(block_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
JERRY_ASSERT(chunk_sizes_sum * MEM_HEAP_CHUNK_SIZE == mem_heap.heap_size);
|
JERRY_ASSERT(chunk_sizes_sum * MEM_HEAP_CHUNK_SIZE == mem_heap.heap_size);
|
||||||
JERRY_ASSERT(is_last_block_was_met);
|
JERRY_ASSERT(is_last_block_was_met);
|
||||||
@@ -645,8 +645,8 @@ mem_check_heap (void)
|
|||||||
chunk_sizes_sum = 0;
|
chunk_sizes_sum = 0;
|
||||||
|
|
||||||
for (mem_block_header_t *block_p = mem_heap.last_block_p, *prev_block_p;
|
for (mem_block_header_t *block_p = mem_heap.last_block_p, *prev_block_p;
|
||||||
block_p != NULL;
|
block_p != NULL;
|
||||||
block_p = prev_block_p)
|
block_p = prev_block_p)
|
||||||
{
|
{
|
||||||
VALGRIND_DEFINED_STRUCT(block_p);
|
VALGRIND_DEFINED_STRUCT(block_p);
|
||||||
|
|
||||||
@@ -667,7 +667,7 @@ mem_check_heap (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
VALGRIND_NOACCESS_STRUCT(block_p);
|
VALGRIND_NOACCESS_STRUCT(block_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
JERRY_ASSERT(chunk_sizes_sum * MEM_HEAP_CHUNK_SIZE == mem_heap.heap_size);
|
JERRY_ASSERT(chunk_sizes_sum * MEM_HEAP_CHUNK_SIZE == mem_heap.heap_size);
|
||||||
JERRY_ASSERT(is_first_block_was_met);
|
JERRY_ASSERT(is_first_block_was_met);
|
||||||
|
|||||||
+17
-15
@@ -33,9 +33,10 @@
|
|||||||
*
|
*
|
||||||
* @see mem_heap_alloc_block
|
* @see mem_heap_alloc_block
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum
|
||||||
MEM_HEAP_ALLOC_SHORT_TERM, /**< allocated region will be freed soon */
|
{
|
||||||
MEM_HEAP_ALLOC_LONG_TERM /**< allocated region most likely will not be freed soon */
|
MEM_HEAP_ALLOC_SHORT_TERM, /**< allocated region will be freed soon */
|
||||||
|
MEM_HEAP_ALLOC_LONG_TERM /**< allocated region most likely will not be freed soon */
|
||||||
} mem_heap_alloc_term_t;
|
} mem_heap_alloc_term_t;
|
||||||
|
|
||||||
extern void mem_heap_init (uint8_t *heap_start, size_t heap_size);
|
extern void mem_heap_init (uint8_t *heap_start, size_t heap_size);
|
||||||
@@ -49,22 +50,23 @@ extern void mem_heap_print (bool dump_block_headers, bool dump_block_data, bool
|
|||||||
/**
|
/**
|
||||||
* Heap memory usage statistics
|
* Heap memory usage statistics
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
size_t size; /**< size */
|
{
|
||||||
size_t blocks; /**< blocks count */
|
size_t size; /**< size */
|
||||||
|
size_t blocks; /**< blocks count */
|
||||||
|
|
||||||
size_t allocated_chunks; /**< currently allocated chunks */
|
size_t allocated_chunks; /**< currently allocated chunks */
|
||||||
size_t peak_allocated_chunks; /**< peak allocated chunks */
|
size_t peak_allocated_chunks; /**< peak allocated chunks */
|
||||||
|
|
||||||
size_t allocated_blocks; /**< currently allocated blocks */
|
size_t allocated_blocks; /**< currently allocated blocks */
|
||||||
size_t peak_allocated_blocks; /**< peak allocated blocks */
|
size_t peak_allocated_blocks; /**< peak allocated blocks */
|
||||||
|
|
||||||
size_t allocated_bytes; /**< currently allocated bytes */
|
size_t allocated_bytes; /**< currently allocated bytes */
|
||||||
size_t peak_allocated_bytes; /**< peak allocated bytes */
|
size_t peak_allocated_bytes; /**< peak allocated bytes */
|
||||||
|
|
||||||
size_t waste_bytes; /**< bytes waste due to blocks filled partially
|
size_t waste_bytes; /**< bytes waste due to blocks filled partially
|
||||||
and due to block headers */
|
and due to block headers */
|
||||||
size_t peak_waste_bytes; /**< peak bytes waste */
|
size_t peak_waste_bytes; /**< peak bytes waste */
|
||||||
} mem_heap_stats_t;
|
} mem_heap_stats_t;
|
||||||
|
|
||||||
extern void mem_heap_get_stats (mem_heap_stats_t *out_heap_stats_p);
|
extern void mem_heap_get_stats (mem_heap_stats_t *out_heap_stats_p);
|
||||||
|
|||||||
+57
-57
@@ -37,7 +37,7 @@ static void mem_check_pool (mem_pool_state_t *pool_p);
|
|||||||
* Get address of pool chunk with specified index
|
* Get address of pool chunk with specified index
|
||||||
*/
|
*/
|
||||||
#define MEM_POOL_CHUNK_ADDRESS(pool_header_p, chunk_index) ((uint8_t*) (MEM_POOL_SPACE_START(pool_p) + \
|
#define MEM_POOL_CHUNK_ADDRESS(pool_header_p, chunk_index) ((uint8_t*) (MEM_POOL_SPACE_START(pool_p) + \
|
||||||
MEM_POOL_CHUNK_SIZE * chunk_index))
|
MEM_POOL_CHUNK_SIZE * chunk_index))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization of memory pool.
|
* Initialization of memory pool.
|
||||||
@@ -47,43 +47,43 @@ static void mem_check_pool (mem_pool_state_t *pool_p);
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
mem_pool_init (mem_pool_state_t *pool_p, /**< pool */
|
mem_pool_init (mem_pool_state_t *pool_p, /**< pool */
|
||||||
size_t pool_size) /**< pool size */
|
size_t pool_size) /**< pool size */
|
||||||
{
|
{
|
||||||
JERRY_ASSERT(pool_p != NULL);
|
JERRY_ASSERT(pool_p != NULL);
|
||||||
JERRY_ASSERT((size_t)MEM_POOL_SPACE_START(pool_p) % MEM_ALIGNMENT == 0);
|
JERRY_ASSERT((size_t)MEM_POOL_SPACE_START(pool_p) % MEM_ALIGNMENT == 0);
|
||||||
|
|
||||||
JERRY_STATIC_ASSERT(MEM_POOL_CHUNK_SIZE % MEM_ALIGNMENT == 0);
|
JERRY_STATIC_ASSERT(MEM_POOL_CHUNK_SIZE % MEM_ALIGNMENT == 0);
|
||||||
JERRY_STATIC_ASSERT(MEM_POOL_MAX_CHUNKS_NUMBER_LOG <= sizeof (mem_pool_chunk_index_t) * JERRY_BITSINBYTE);
|
JERRY_STATIC_ASSERT(MEM_POOL_MAX_CHUNKS_NUMBER_LOG <= sizeof (mem_pool_chunk_index_t) * JERRY_BITSINBYTE);
|
||||||
JERRY_ASSERT(sizeof (mem_pool_chunk_index_t) <= MEM_POOL_CHUNK_SIZE);
|
JERRY_ASSERT(sizeof (mem_pool_chunk_index_t) <= MEM_POOL_CHUNK_SIZE);
|
||||||
|
|
||||||
const size_t pool_space_size = pool_size - sizeof (mem_pool_state_t);
|
const size_t pool_space_size = pool_size - sizeof (mem_pool_state_t);
|
||||||
const size_t chunks_number = pool_space_size / MEM_POOL_CHUNK_SIZE;
|
const size_t chunks_number = pool_space_size / MEM_POOL_CHUNK_SIZE;
|
||||||
|
|
||||||
JERRY_ASSERT(((mem_pool_chunk_index_t) chunks_number) == chunks_number);
|
JERRY_ASSERT(((mem_pool_chunk_index_t) chunks_number) == chunks_number);
|
||||||
|
|
||||||
pool_p->chunks_number = (mem_pool_chunk_index_t) chunks_number;
|
pool_p->chunks_number = (mem_pool_chunk_index_t) chunks_number;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All chunks are free right after initialization
|
* All chunks are free right after initialization
|
||||||
*/
|
*/
|
||||||
pool_p->free_chunks_number = pool_p->chunks_number;
|
pool_p->free_chunks_number = pool_p->chunks_number;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Chunk with zero index is first free chunk in the pool now
|
* Chunk with zero index is first free chunk in the pool now
|
||||||
*/
|
*/
|
||||||
pool_p->first_free_chunk = 0;
|
pool_p->first_free_chunk = 0;
|
||||||
|
|
||||||
for (mem_pool_chunk_index_t chunk_index = 0;
|
for (mem_pool_chunk_index_t chunk_index = 0;
|
||||||
chunk_index < chunks_number;
|
chunk_index < chunks_number;
|
||||||
chunk_index++)
|
chunk_index++)
|
||||||
{
|
{
|
||||||
mem_pool_chunk_index_t *next_free_chunk_index_p =
|
mem_pool_chunk_index_t *next_free_chunk_index_p = (mem_pool_chunk_index_t*) MEM_POOL_CHUNK_ADDRESS(pool_p,
|
||||||
(mem_pool_chunk_index_t*) MEM_POOL_CHUNK_ADDRESS(pool_p, chunk_index);
|
chunk_index);
|
||||||
|
|
||||||
*next_free_chunk_index_p = (mem_pool_chunk_index_t) (chunk_index + 1u);
|
*next_free_chunk_index_p = (mem_pool_chunk_index_t) (chunk_index + 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_check_pool (pool_p);
|
mem_check_pool (pool_p);
|
||||||
} /* mem_pool_init */
|
} /* mem_pool_init */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -95,11 +95,11 @@ mem_pool_alloc_chunk (mem_pool_state_t *pool_p) /**< pool */
|
|||||||
mem_check_pool (pool_p);
|
mem_check_pool (pool_p);
|
||||||
|
|
||||||
if (unlikely (pool_p->free_chunks_number == 0))
|
if (unlikely (pool_p->free_chunks_number == 0))
|
||||||
{
|
{
|
||||||
JERRY_ASSERT(pool_p->first_free_chunk == pool_p->chunks_number);
|
JERRY_ASSERT(pool_p->first_free_chunk == pool_p->chunks_number);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
JERRY_ASSERT(pool_p->first_free_chunk < pool_p->chunks_number);
|
JERRY_ASSERT(pool_p->first_free_chunk < pool_p->chunks_number);
|
||||||
|
|
||||||
@@ -120,26 +120,26 @@ mem_pool_alloc_chunk (mem_pool_state_t *pool_p) /**< pool */
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
mem_pool_free_chunk (mem_pool_state_t *pool_p, /**< pool */
|
mem_pool_free_chunk (mem_pool_state_t *pool_p, /**< pool */
|
||||||
uint8_t *chunk_p) /**< chunk pointer */
|
uint8_t *chunk_p) /**< chunk pointer */
|
||||||
{
|
{
|
||||||
JERRY_ASSERT(pool_p->free_chunks_number < pool_p->chunks_number);
|
JERRY_ASSERT(pool_p->free_chunks_number < pool_p->chunks_number);
|
||||||
JERRY_ASSERT(chunk_p >= MEM_POOL_SPACE_START(pool_p)
|
JERRY_ASSERT(chunk_p >= MEM_POOL_SPACE_START(pool_p)
|
||||||
&& chunk_p <= MEM_POOL_SPACE_START(pool_p) + pool_p->chunks_number * MEM_POOL_CHUNK_SIZE);
|
&& chunk_p <= MEM_POOL_SPACE_START(pool_p) + pool_p->chunks_number * MEM_POOL_CHUNK_SIZE);
|
||||||
JERRY_ASSERT(((uintptr_t) chunk_p - (uintptr_t) MEM_POOL_SPACE_START(pool_p)) % MEM_POOL_CHUNK_SIZE == 0);
|
JERRY_ASSERT(((uintptr_t) chunk_p - (uintptr_t) MEM_POOL_SPACE_START(pool_p)) % MEM_POOL_CHUNK_SIZE == 0);
|
||||||
|
|
||||||
mem_check_pool (pool_p);
|
mem_check_pool (pool_p);
|
||||||
|
|
||||||
const size_t chunk_byte_offset = (size_t) (chunk_p - MEM_POOL_SPACE_START(pool_p));
|
const size_t chunk_byte_offset = (size_t) (chunk_p - MEM_POOL_SPACE_START(pool_p));
|
||||||
const mem_pool_chunk_index_t chunk_index = (mem_pool_chunk_index_t) (chunk_byte_offset / MEM_POOL_CHUNK_SIZE);
|
const mem_pool_chunk_index_t chunk_index = (mem_pool_chunk_index_t) (chunk_byte_offset / MEM_POOL_CHUNK_SIZE);
|
||||||
|
|
||||||
mem_pool_chunk_index_t *next_free_chunk_index_p = (mem_pool_chunk_index_t*) chunk_p;
|
mem_pool_chunk_index_t *next_free_chunk_index_p = (mem_pool_chunk_index_t*) chunk_p;
|
||||||
|
|
||||||
*next_free_chunk_index_p = pool_p->first_free_chunk;
|
*next_free_chunk_index_p = pool_p->first_free_chunk;
|
||||||
|
|
||||||
pool_p->first_free_chunk = chunk_index;
|
pool_p->first_free_chunk = chunk_index;
|
||||||
pool_p->free_chunks_number++;
|
pool_p->free_chunks_number++;
|
||||||
|
|
||||||
mem_check_pool (pool_p);
|
mem_check_pool (pool_p);
|
||||||
} /* mem_pool_free_chunk */
|
} /* mem_pool_free_chunk */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -149,23 +149,23 @@ static void
|
|||||||
mem_check_pool (mem_pool_state_t __unused *pool_p) /**< pool (unused #ifdef JERRY_NDEBUG) */
|
mem_check_pool (mem_pool_state_t __unused *pool_p) /**< pool (unused #ifdef JERRY_NDEBUG) */
|
||||||
{
|
{
|
||||||
#ifndef JERRY_NDEBUG
|
#ifndef JERRY_NDEBUG
|
||||||
JERRY_ASSERT(pool_p->chunks_number != 0);
|
JERRY_ASSERT(pool_p->chunks_number != 0);
|
||||||
JERRY_ASSERT(pool_p->free_chunks_number <= pool_p->chunks_number);
|
JERRY_ASSERT(pool_p->free_chunks_number <= pool_p->chunks_number);
|
||||||
|
|
||||||
size_t met_free_chunks_number = 0;
|
size_t met_free_chunks_number = 0;
|
||||||
mem_pool_chunk_index_t chunk_index = pool_p->first_free_chunk;
|
mem_pool_chunk_index_t chunk_index = pool_p->first_free_chunk;
|
||||||
|
|
||||||
while (chunk_index != pool_p->chunks_number)
|
while (chunk_index != pool_p->chunks_number)
|
||||||
{
|
{
|
||||||
uint8_t *chunk_p = MEM_POOL_CHUNK_ADDRESS(pool_p, chunk_index);
|
uint8_t *chunk_p = MEM_POOL_CHUNK_ADDRESS(pool_p, chunk_index);
|
||||||
mem_pool_chunk_index_t *next_free_chunk_index_p = (mem_pool_chunk_index_t*) chunk_p;
|
mem_pool_chunk_index_t *next_free_chunk_index_p = (mem_pool_chunk_index_t*) chunk_p;
|
||||||
|
|
||||||
met_free_chunks_number++;
|
met_free_chunks_number++;
|
||||||
|
|
||||||
chunk_index = *next_free_chunk_index_p;
|
chunk_index = *next_free_chunk_index_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
JERRY_ASSERT(met_free_chunks_number == pool_p->free_chunks_number);
|
JERRY_ASSERT(met_free_chunks_number == pool_p->free_chunks_number);
|
||||||
#endif /* !JERRY_NDEBUG */
|
#endif /* !JERRY_NDEBUG */
|
||||||
} /* mem_check_pool */
|
} /* mem_check_pool */
|
||||||
|
|
||||||
|
|||||||
@@ -39,17 +39,18 @@ typedef uint16_t mem_pool_chunk_index_t;
|
|||||||
/**
|
/**
|
||||||
* State of a memory pool
|
* State of a memory pool
|
||||||
*/
|
*/
|
||||||
typedef struct mem_pool_state_t {
|
typedef struct mem_pool_state_t
|
||||||
/** Number of chunks (mem_pool_chunk_index_t) */
|
{
|
||||||
unsigned int chunks_number : MEM_POOL_MAX_CHUNKS_NUMBER_LOG;
|
/** Number of chunks (mem_pool_chunk_index_t) */
|
||||||
/** Number of free chunks (mem_pool_chunk_index_t) */
|
unsigned int chunks_number : MEM_POOL_MAX_CHUNKS_NUMBER_LOG;
|
||||||
unsigned int free_chunks_number : MEM_POOL_MAX_CHUNKS_NUMBER_LOG;
|
/** Number of free chunks (mem_pool_chunk_index_t) */
|
||||||
|
unsigned int free_chunks_number : MEM_POOL_MAX_CHUNKS_NUMBER_LOG;
|
||||||
|
|
||||||
/** Offset of first free chunk from the beginning of the pool (mem_pool_chunk_index_t) */
|
/** Offset of first free chunk from the beginning of the pool (mem_pool_chunk_index_t) */
|
||||||
unsigned int first_free_chunk : MEM_POOL_MAX_CHUNKS_NUMBER_LOG;
|
unsigned int first_free_chunk : MEM_POOL_MAX_CHUNKS_NUMBER_LOG;
|
||||||
|
|
||||||
/** Pointer to the next pool with same chunk size */
|
/** Pointer to the next pool with same chunk size */
|
||||||
unsigned int next_pool_cp : MEM_HEAP_OFFSET_LOG;
|
unsigned int next_pool_cp : MEM_HEAP_OFFSET_LOG;
|
||||||
} mem_pool_state_t;
|
} mem_pool_state_t;
|
||||||
|
|
||||||
extern void mem_pool_init (mem_pool_state_t *pool_p, size_t pool_size);
|
extern void mem_pool_init (mem_pool_state_t *pool_p, size_t pool_size);
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ size_t mem_free_chunks_number;
|
|||||||
|
|
||||||
#ifdef MEM_STATS
|
#ifdef MEM_STATS
|
||||||
/**
|
/**
|
||||||
* Pools' memory usage statistics
|
* Pools' memory usage statistics
|
||||||
*/
|
*/
|
||||||
mem_pools_stats_t mem_pools_stats;
|
mem_pools_stats_t mem_pools_stats;
|
||||||
|
|
||||||
@@ -93,61 +93,68 @@ mem_pools_finalize (void)
|
|||||||
uint8_t*
|
uint8_t*
|
||||||
mem_pools_alloc (void)
|
mem_pools_alloc (void)
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* If there are no free chunks, allocate new pool.
|
||||||
|
*/
|
||||||
|
if (mem_free_chunks_number == 0)
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* If there are no free chunks, allocate new pool.
|
* Space, at least for header and eight chunks.
|
||||||
*/
|
|
||||||
if (mem_free_chunks_number == 0)
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Space, at least for header and eight chunks.
|
|
||||||
*
|
|
||||||
* TODO: Config.
|
|
||||||
*/
|
|
||||||
size_t pool_size = mem_heap_recommend_allocation_size (sizeof (mem_pool_state_t) + 8 * MEM_POOL_CHUNK_SIZE);
|
|
||||||
|
|
||||||
mem_pool_state_t *pool_state = (mem_pool_state_t*) mem_heap_alloc_block (pool_size, MEM_HEAP_ALLOC_LONG_TERM);
|
|
||||||
|
|
||||||
if (pool_state == NULL)
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Not enough space for new pool.
|
|
||||||
*/
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mem_pool_init (pool_state, pool_size);
|
|
||||||
|
|
||||||
pool_state->next_pool_cp = (mem_pools == NULL) ? MEM_COMPRESSED_POINTER_NULL
|
|
||||||
: (uint16_t) mem_compress_pointer (mem_pools);
|
|
||||||
mem_pools = pool_state;
|
|
||||||
|
|
||||||
mem_free_chunks_number += pool_state->chunks_number;
|
|
||||||
|
|
||||||
mem_pools_stat_alloc_pool ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Now there is definitely at least one pool of specified type with at least one free chunk.
|
|
||||||
*
|
*
|
||||||
* Search for the pool.
|
* TODO: Config.
|
||||||
*/
|
*/
|
||||||
mem_pool_state_t *pool_state = mem_pools;
|
size_t pool_size = mem_heap_recommend_allocation_size (sizeof (mem_pool_state_t) + 8 * MEM_POOL_CHUNK_SIZE);
|
||||||
|
|
||||||
while (pool_state->first_free_chunk == pool_state->chunks_number)
|
mem_pool_state_t *pool_state = (mem_pool_state_t*) mem_heap_alloc_block (pool_size, MEM_HEAP_ALLOC_LONG_TERM);
|
||||||
|
|
||||||
|
if (pool_state == NULL)
|
||||||
{
|
{
|
||||||
pool_state = mem_decompress_pointer (pool_state->next_pool_cp);
|
/**
|
||||||
|
* Not enough space for new pool.
|
||||||
JERRY_ASSERT(pool_state != NULL);
|
*/
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
mem_pool_init (pool_state, pool_size);
|
||||||
* And allocate chunk within it.
|
|
||||||
*/
|
|
||||||
mem_free_chunks_number--;
|
|
||||||
|
|
||||||
mem_pools_stat_alloc_chunk ();
|
if (mem_pools == NULL)
|
||||||
|
{
|
||||||
|
pool_state->next_pool_cp = MEM_COMPRESSED_POINTER_NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pool_state->next_pool_cp = (uint16_t) mem_compress_pointer (mem_pools);
|
||||||
|
}
|
||||||
|
|
||||||
return mem_pool_alloc_chunk (pool_state);
|
mem_pools = pool_state;
|
||||||
|
|
||||||
|
mem_free_chunks_number += pool_state->chunks_number;
|
||||||
|
|
||||||
|
mem_pools_stat_alloc_pool ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Now there is definitely at least one pool of specified type with at least one free chunk.
|
||||||
|
*
|
||||||
|
* Search for the pool.
|
||||||
|
*/
|
||||||
|
mem_pool_state_t *pool_state = mem_pools;
|
||||||
|
|
||||||
|
while (pool_state->first_free_chunk == pool_state->chunks_number)
|
||||||
|
{
|
||||||
|
pool_state = mem_decompress_pointer (pool_state->next_pool_cp);
|
||||||
|
|
||||||
|
JERRY_ASSERT(pool_state != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* And allocate chunk within it.
|
||||||
|
*/
|
||||||
|
mem_free_chunks_number--;
|
||||||
|
|
||||||
|
mem_pools_stat_alloc_chunk ();
|
||||||
|
|
||||||
|
return mem_pool_alloc_chunk (pool_state);
|
||||||
} /* mem_pools_alloc */
|
} /* mem_pools_alloc */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -156,53 +163,53 @@ mem_pools_alloc (void)
|
|||||||
void
|
void
|
||||||
mem_pools_free (uint8_t *chunk_p) /**< pointer to the chunk */
|
mem_pools_free (uint8_t *chunk_p) /**< pointer to the chunk */
|
||||||
{
|
{
|
||||||
mem_pool_state_t *pool_state = mem_pools, *prev_pool_state = NULL;
|
mem_pool_state_t *pool_state = mem_pools, *prev_pool_state = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for the pool containing specified chunk.
|
* Search for the pool containing specified chunk.
|
||||||
*/
|
*/
|
||||||
while (!(chunk_p >= MEM_POOL_SPACE_START(pool_state)
|
while (!(chunk_p >= MEM_POOL_SPACE_START(pool_state)
|
||||||
&& chunk_p <= MEM_POOL_SPACE_START(pool_state) + pool_state->chunks_number * MEM_POOL_CHUNK_SIZE))
|
&& chunk_p <= MEM_POOL_SPACE_START(pool_state) + pool_state->chunks_number * MEM_POOL_CHUNK_SIZE))
|
||||||
|
{
|
||||||
|
prev_pool_state = pool_state;
|
||||||
|
pool_state = mem_decompress_pointer (pool_state->next_pool_cp);
|
||||||
|
|
||||||
|
JERRY_ASSERT(pool_state != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the chunk
|
||||||
|
*/
|
||||||
|
mem_pool_free_chunk (pool_state, chunk_p);
|
||||||
|
mem_free_chunks_number++;
|
||||||
|
|
||||||
|
mem_pools_stat_free_chunk ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If all chunks of the pool are free, free the pool itself.
|
||||||
|
*/
|
||||||
|
if (pool_state->free_chunks_number == pool_state->chunks_number)
|
||||||
|
{
|
||||||
|
if (prev_pool_state != NULL)
|
||||||
{
|
{
|
||||||
prev_pool_state = pool_state;
|
prev_pool_state->next_pool_cp = pool_state->next_pool_cp;
|
||||||
pool_state = mem_decompress_pointer (pool_state->next_pool_cp);
|
} else
|
||||||
|
{
|
||||||
JERRY_ASSERT(pool_state != NULL);
|
if (pool_state->next_pool_cp == MEM_COMPRESSED_POINTER_NULL)
|
||||||
|
{
|
||||||
|
mem_pools = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mem_pools = mem_decompress_pointer (pool_state->next_pool_cp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
mem_free_chunks_number -= pool_state->chunks_number;
|
||||||
* Free the chunk
|
|
||||||
*/
|
|
||||||
mem_pool_free_chunk (pool_state, chunk_p);
|
|
||||||
mem_free_chunks_number++;
|
|
||||||
|
|
||||||
mem_pools_stat_free_chunk ();
|
mem_heap_free_block ((uint8_t*)pool_state);
|
||||||
|
|
||||||
/**
|
mem_pools_stat_free_pool ();
|
||||||
* If all chunks of the pool are free, free the pool itself.
|
|
||||||
*/
|
|
||||||
if (pool_state->free_chunks_number == pool_state->chunks_number)
|
|
||||||
{
|
|
||||||
if (prev_pool_state != NULL)
|
|
||||||
{
|
|
||||||
prev_pool_state->next_pool_cp = pool_state->next_pool_cp;
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
if (pool_state->next_pool_cp == MEM_COMPRESSED_POINTER_NULL)
|
|
||||||
{
|
|
||||||
mem_pools = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mem_pools = mem_decompress_pointer (pool_state->next_pool_cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mem_free_chunks_number -= pool_state->chunks_number;
|
|
||||||
|
|
||||||
mem_heap_free_block ((uint8_t*)pool_state);
|
|
||||||
|
|
||||||
mem_pools_stat_free_pool ();
|
|
||||||
}
|
}
|
||||||
} /* mem_pools_free */
|
} /* mem_pools_free */
|
||||||
|
|
||||||
|
|||||||
@@ -40,20 +40,20 @@ extern void mem_pools_free (uint8_t *chunk_p);
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/** pools' count */
|
/** pools' count */
|
||||||
size_t pools_count;
|
size_t pools_count;
|
||||||
|
|
||||||
/** peak pools' count */
|
/** peak pools' count */
|
||||||
size_t peak_pools_count;
|
size_t peak_pools_count;
|
||||||
|
|
||||||
/** allocated chunks count */
|
/** allocated chunks count */
|
||||||
size_t allocated_chunks;
|
size_t allocated_chunks;
|
||||||
|
|
||||||
/** peak allocated chunks count */
|
/** peak allocated chunks count */
|
||||||
size_t peak_allocated_chunks;
|
size_t peak_allocated_chunks;
|
||||||
|
|
||||||
/** free chunks count */
|
/** free chunks count */
|
||||||
size_t free_chunks;
|
size_t free_chunks;
|
||||||
} mem_pools_stats_t;
|
} mem_pools_stats_t;
|
||||||
|
|
||||||
extern void mem_pools_get_stats (mem_pools_stats_t *out_pools_stats_p);
|
extern void mem_pools_get_stats (mem_pools_stats_t *out_pools_stats_p);
|
||||||
|
|||||||
Reference in New Issue
Block a user