|
@@ -44,15 +44,16 @@ void * bitmap_malloc(raw_block_header_t *raw_block, size_t req_size) {
|
|
|
bitmap_rb_t *rb_header;
|
|
|
size_t cells, stop, i, found;
|
|
|
void *ret;
|
|
|
- BMAP_EL_TYPE temp1[BMAP_INDEX_NUM], temp2[BMAP_INDEX_NUM];
|
|
|
- BMAP_EL_TYPE mask1, mask2;
|
|
|
chunk_header_t *chunk_address;
|
|
|
+ BMAP_EL_TYPE mask1, mask2, *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];
|
|
|
+
|
|
|
ret = NULL;
|
|
|
|
|
|
- req_size += sizeof(chunk_header_t);
|
|
|
+ req_size += CHUNK_HDR_SIZE;
|
|
|
|
|
|
if(req_size % rb_header->bytes_per_cell > 0) {
|
|
|
cells = req_size / rb_header->bytes_per_cell + 1;
|
|
@@ -66,23 +67,24 @@ void * bitmap_malloc(raw_block_header_t *raw_block, size_t req_size) {
|
|
|
pthread_mutex_lock(&raw_block->mutex);
|
|
|
#endif /* HAVE_LOCKS */
|
|
|
|
|
|
- copy_array(temp1, rb_header->bmap_array);
|
|
|
+ copy_array(temp1, &rb_header->bmap, rb_header->elements);
|
|
|
|
|
|
// perform bitwise shift & and operations in the BMAP_EL_TYPE arrays
|
|
|
for(i = 1; i < stop; i <<= 1) {
|
|
|
- copy_array(temp2, temp1);
|
|
|
- shift_array(temp2, i);
|
|
|
- add_arrays(temp1, temp2);
|
|
|
+ copy_array(temp2, temp1, rb_header->elements);
|
|
|
+ shift_array(temp2, i, rb_header->elements);
|
|
|
+ add_arrays(temp1, temp2, rb_header->elements);
|
|
|
}
|
|
|
if(stop < cells) {
|
|
|
- copy_array(temp2, temp1);
|
|
|
- shift_array(temp2, cells - stop);
|
|
|
- add_arrays(temp1, temp2);
|
|
|
+ copy_array(temp2, temp1, rb_header->elements);
|
|
|
+ shift_array(temp2, cells - stop, rb_header->elements);
|
|
|
+ add_arrays(temp1, temp2, rb_header->elements);
|
|
|
}
|
|
|
|
|
|
found = 0;
|
|
|
|
|
|
- for(i = 0; i < BMAP_INDEX_NUM; ++i) {
|
|
|
+ bmap_p = &rb_header->bmap;
|
|
|
+ for(i = 0; i < rb_header->elements; ++i) {
|
|
|
found = __builtin_ffsl(temp1[i]);
|
|
|
if(found) {
|
|
|
// Check if one or two elements have to be modified
|
|
@@ -92,26 +94,27 @@ void * bitmap_malloc(raw_block_header_t *raw_block, size_t req_size) {
|
|
|
mask1 = ~make_bit_mask(found, BMAP_EL_SIZE_BITS - found + 1);
|
|
|
mask2 = ~make_bit_mask((size_t) 1,
|
|
|
cells - (BMAP_EL_SIZE_BITS - found) - 1);
|
|
|
- rb_header->bmap_array[i + 1] &= mask2;
|
|
|
+ bmap_p[i + 1] &= mask2;
|
|
|
}
|
|
|
- rb_header->bmap_array[i] &= mask1;
|
|
|
+ bmap_p[i] &= mask1;
|
|
|
|
|
|
// Calculate the pointer to the chunk to be retrieved
|
|
|
chunk_address = (chunk_header_t *)((char *)rb_header +
|
|
|
sizeof(bitmap_rb_t) +
|
|
|
+ rb_header->elements * BMAP_EL_SIZE +
|
|
|
(i * BMAP_EL_SIZE_BITS + found - 1) *
|
|
|
rb_header->bytes_per_cell);
|
|
|
chunk_address->num_of_cells = cells;
|
|
|
#ifdef REQUEST_SIZE_INFO
|
|
|
- chunk_address->requested_size = req_size - sizeof(chunk_header_t);
|
|
|
+ chunk_address->requested_size = req_size - CHUNK_HDR_SIZE;
|
|
|
#endif /* REQUEST_SIZE_INFO */
|
|
|
|
|
|
- ret = (void *)((char *)chunk_address + sizeof(chunk_header_t));
|
|
|
+ ret = (void *)((char *)chunk_address + CHUNK_HDR_SIZE);
|
|
|
|
|
|
TRACE_1("dmmlib - malloc - allocated %zu bytes for a memory request"
|
|
|
" of %zu bytes at bitmap raw block %p...\n",
|
|
|
cells * rb_header->bytes_per_cell,
|
|
|
- req_size - sizeof(chunk_header_t),
|
|
|
+ req_size - CHUNK_HDR_SIZE,
|
|
|
(void *)raw_block);
|
|
|
|
|
|
break;
|