|
@@ -39,64 +39,49 @@
|
|
/**
|
|
/**
|
|
* Returns a memory block from a bitmap-organized raw block
|
|
* Returns a memory block from a bitmap-organized raw block
|
|
*
|
|
*
|
|
- * @param raw_block The pointer of the raw block.
|
|
|
|
|
|
+ * @param raw_block The pointer of the bitmap raw block.
|
|
* @param req_size The requested memory size.
|
|
* @param req_size The requested memory size.
|
|
* @retval The address to serve the request.
|
|
* @retval The address to serve the request.
|
|
* @retval NULL No available memory space.
|
|
* @retval NULL No available memory space.
|
|
*/
|
|
*/
|
|
-void * bitmap_malloc(raw_block_header_t *raw_block, size_t req_size) {
|
|
|
|
- bitmap_rb_t *rb_header;
|
|
|
|
|
|
+void * bitmap_malloc(bitmap_rb_t *raw_block, size_t req_size) {
|
|
size_t cells, stop, i, start_pos;
|
|
size_t cells, stop, i, start_pos;
|
|
void *ret;
|
|
void *ret;
|
|
chunk_header_t *chunk_address;
|
|
chunk_header_t *chunk_address;
|
|
BMAP_EL_TYPE *bmap_p;
|
|
BMAP_EL_TYPE *bmap_p;
|
|
-
|
|
|
|
- rb_header = (bitmap_rb_t *)((char *)raw_block + sizeof(raw_block_header_t));
|
|
|
|
-
|
|
|
|
- BMAP_EL_TYPE temp1[rb_header->elements], temp2[rb_header->elements];
|
|
|
|
|
|
+ BMAP_EL_TYPE temp1[raw_block->elements], temp2[raw_block->elements];
|
|
|
|
|
|
ret = NULL;
|
|
ret = NULL;
|
|
|
|
|
|
req_size += CHUNK_HDR_SIZE;
|
|
req_size += CHUNK_HDR_SIZE;
|
|
|
|
|
|
- if(req_size >= rb_header->elements * BMAP_EL_SIZE_BITS *
|
|
|
|
- rb_header->bytes_per_cell / 2) {
|
|
|
|
- // Don't bother searching if you require more than half of this raw
|
|
|
|
- // block's cells
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(req_size % rb_header->bytes_per_cell > 0) {
|
|
|
|
- cells = req_size / rb_header->bytes_per_cell + 1;
|
|
|
|
|
|
+ if(req_size % raw_block->bytes_per_cell > 0) {
|
|
|
|
+ cells = req_size / raw_block->bytes_per_cell + 1;
|
|
} else {
|
|
} else {
|
|
- cells = req_size / rb_header->bytes_per_cell;
|
|
|
|
|
|
+ cells = req_size / raw_block->bytes_per_cell;
|
|
}
|
|
}
|
|
|
|
|
|
stop = prev_pow2(cells);
|
|
stop = prev_pow2(cells);
|
|
|
|
|
|
-#ifdef HAVE_LOCKS
|
|
|
|
- pthread_mutex_lock(&raw_block->mutex);
|
|
|
|
-#endif /* HAVE_LOCKS */
|
|
|
|
-
|
|
|
|
- bmap_p = (BMAP_EL_TYPE *)((char *)rb_header + sizeof(bitmap_rb_t));
|
|
|
|
|
|
+ bmap_p = (BMAP_EL_TYPE *)((char *)raw_block + sizeof(bitmap_rb_t));
|
|
|
|
|
|
- copy_array(temp1, bmap_p, rb_header->elements);
|
|
|
|
|
|
+ copy_array(temp1, bmap_p, raw_block->elements);
|
|
|
|
|
|
// perform bitwise shift & and operations in the BMAP_EL_TYPE arrays
|
|
// perform bitwise shift & and operations in the BMAP_EL_TYPE arrays
|
|
for(i = 1; i < stop; i <<= 1) {
|
|
for(i = 1; i < stop; i <<= 1) {
|
|
- copy_array(temp2, temp1, rb_header->elements);
|
|
|
|
- shift_array(temp2, i, rb_header->elements);
|
|
|
|
- add_arrays(temp1, temp2, rb_header->elements);
|
|
|
|
|
|
+ copy_array(temp2, temp1, raw_block->elements);
|
|
|
|
+ shift_array(temp2, i, raw_block->elements);
|
|
|
|
+ add_arrays(temp1, temp2, raw_block->elements);
|
|
}
|
|
}
|
|
if(stop < cells) {
|
|
if(stop < cells) {
|
|
- copy_array(temp2, temp1, rb_header->elements);
|
|
|
|
- shift_array(temp2, cells - stop, rb_header->elements);
|
|
|
|
- add_arrays(temp1, temp2, rb_header->elements);
|
|
|
|
|
|
+ copy_array(temp2, temp1, raw_block->elements);
|
|
|
|
+ shift_array(temp2, cells - stop, raw_block->elements);
|
|
|
|
+ add_arrays(temp1, temp2, raw_block->elements);
|
|
}
|
|
}
|
|
|
|
|
|
start_pos = 0;
|
|
start_pos = 0;
|
|
|
|
|
|
- for(i = 0; i < rb_header->elements; ++i) {
|
|
|
|
|
|
+ for(i = 0; i < raw_block->elements; ++i) {
|
|
|
|
|
|
// __builtin_ffsl() returns the position of the first 1 starting from 1
|
|
// __builtin_ffsl() returns the position of the first 1 starting from 1
|
|
start_pos = (size_t) __builtin_ffsl((long) temp1[i]);
|
|
start_pos = (size_t) __builtin_ffsl((long) temp1[i]);
|
|
@@ -124,10 +109,10 @@ void * bitmap_malloc(raw_block_header_t *raw_block, size_t req_size) {
|
|
|
|
|
|
// 2. Calculate the pointer to the chunk to be retrieved
|
|
// 2. Calculate the pointer to the chunk to be retrieved
|
|
|
|
|
|
- chunk_address = (chunk_header_t *)((char *)rb_header +
|
|
|
|
|
|
+ chunk_address = (chunk_header_t *)((char *)raw_block +
|
|
sizeof(bitmap_rb_t) +
|
|
sizeof(bitmap_rb_t) +
|
|
- rb_header->elements * BMAP_EL_SIZE +
|
|
|
|
- cell_no * rb_header->bytes_per_cell);
|
|
|
|
|
|
+ raw_block->elements * BMAP_EL_SIZE +
|
|
|
|
+ cell_no * raw_block->bytes_per_cell);
|
|
|
|
|
|
// 3. Update the chunk header
|
|
// 3. Update the chunk header
|
|
|
|
|
|
@@ -144,14 +129,14 @@ void * bitmap_malloc(raw_block_header_t *raw_block, size_t req_size) {
|
|
|
|
|
|
TRACE_1("dmmlib - malloc - allocated %zu bytes"
|
|
TRACE_1("dmmlib - malloc - allocated %zu bytes"
|
|
" at bitmap raw block %p\n",
|
|
" at bitmap raw block %p\n",
|
|
- cells * rb_header->bytes_per_cell,
|
|
|
|
|
|
+ cells * raw_block->bytes_per_cell,
|
|
(void *)raw_block);
|
|
(void *)raw_block);
|
|
|
|
|
|
// 6. Statistics support
|
|
// 6. Statistics support
|
|
|
|
|
|
#ifdef WITH_ALLOCATOR_STATS
|
|
#ifdef WITH_ALLOCATOR_STATS
|
|
systemallocator.dmm_stats.total_mem_allocated +=
|
|
systemallocator.dmm_stats.total_mem_allocated +=
|
|
- cells * rb_header->bytes_per_cell;
|
|
|
|
|
|
+ cells * raw_block->bytes_per_cell;
|
|
systemallocator.dmm_stats.live_objects++;
|
|
systemallocator.dmm_stats.live_objects++;
|
|
systemallocator.dmm_stats.num_malloc++;
|
|
systemallocator.dmm_stats.num_malloc++;
|
|
TRACE_1("dmmlib - global allocated memory: %zu bytes\n",
|
|
TRACE_1("dmmlib - global allocated memory: %zu bytes\n",
|
|
@@ -164,28 +149,9 @@ void * bitmap_malloc(raw_block_header_t *raw_block, size_t req_size) {
|
|
#endif /* REQUEST_SIZE_INFO */
|
|
#endif /* REQUEST_SIZE_INFO */
|
|
#endif /* WITH_ALLOCATOR_STATS */
|
|
#endif /* WITH_ALLOCATOR_STATS */
|
|
|
|
|
|
-#ifdef WITH_RAWBLOCK_STATS
|
|
|
|
- raw_block->dmm_stats.total_mem_allocated +=
|
|
|
|
- cells * rb_header->bytes_per_cell;
|
|
|
|
- raw_block->dmm_stats.live_objects++;
|
|
|
|
- raw_block->dmm_stats.num_malloc++;
|
|
|
|
- TRACE_1("dmmlib - total allocated memory: %zu bytes\n",
|
|
|
|
- raw_block->dmm_stats.total_mem_allocated);
|
|
|
|
-#ifdef REQUEST_SIZE_INFO
|
|
|
|
- raw_block->dmm_stats.total_mem_requested += req_size -
|
|
|
|
- CHUNK_HDR_SIZE;
|
|
|
|
- TRACE_1("dmmlib - total requested memory: %zu bytes\n",
|
|
|
|
- raw_block->dmm_stats.total_mem_requested);
|
|
|
|
-#endif /* REQUEST_SIZE_INFO */
|
|
|
|
-#endif /* WITH_RAWBLOCK_STATS */
|
|
|
|
-
|
|
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-#ifdef HAVE_LOCKS
|
|
|
|
- pthread_mutex_unlock(&raw_block->mutex);
|
|
|
|
-#endif /* HAVE_LOCKS */
|
|
|
|
-
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|