|
@@ -34,6 +34,8 @@ raw_block_header_t *create_raw_block(size_t raw_block_size, rb_type type) {
|
|
|
#ifdef BITMAP_RB_ONLY
|
|
|
bitmap_rb_t *bitmap_rb;
|
|
|
BMAP_EL_TYPE *bitmap_p;
|
|
|
+ size_t vector_elements;
|
|
|
+ size_t remaining_cells;
|
|
|
#endif
|
|
|
|
|
|
ptr = request_memory(raw_block_size);
|
|
@@ -60,11 +62,23 @@ raw_block_header_t *create_raw_block(size_t raw_block_size, rb_type type) {
|
|
|
sizeof(raw_block_header_t));
|
|
|
bitmap_rb->bytes_per_cell = BITMAP_RESOLUTION;
|
|
|
|
|
|
- bitmap_rb->elements =
|
|
|
- (raw_block_size + BMAP_EL_SIZE -
|
|
|
- sizeof(raw_block_header_t) - sizeof(bitmap_rb_t)) /
|
|
|
+ vector_elements =
|
|
|
+ (raw_block_size - sizeof(raw_block_header_t) -
|
|
|
+ sizeof(bitmap_rb_t)) /
|
|
|
(BMAP_EL_SIZE + BMAP_EL_SIZE_BITS * bitmap_rb->bytes_per_cell);
|
|
|
|
|
|
+ remaining_cells =
|
|
|
+ ((raw_block_size - sizeof(raw_block_header_t) -
|
|
|
+ sizeof(bitmap_rb_t)) %
|
|
|
+ (BMAP_EL_SIZE + BMAP_EL_SIZE_BITS * bitmap_rb->bytes_per_cell))
|
|
|
+ / bitmap_rb->bytes_per_cell;
|
|
|
+
|
|
|
+ if(remaining_cells == 0) {
|
|
|
+ bitmap_rb->elements = vector_elements;
|
|
|
+ } else {
|
|
|
+ bitmap_rb->elements = vector_elements + 1;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
* header */
|
|
|
bitmap_p = (BMAP_EL_TYPE *)((char *)bitmap_rb +
|
|
@@ -73,6 +87,24 @@ raw_block_header_t *create_raw_block(size_t raw_block_size, rb_type type) {
|
|
|
*bitmap_p = BMAP_EL_INIT_VAL;
|
|
|
bitmap_p++;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ * element is used, the cells that cannot be used by the
|
|
|
+ * application, have to be set as already used.
|
|
|
+ */
|
|
|
+
|
|
|
+ if(remaining_cells != 0) {
|
|
|
+
|
|
|
+ bitmap_p--;
|
|
|
+
|
|
|
+ for(size_t zeroes = BMAP_EL_SIZE_BITS - remaining_cells;
|
|
|
+ zeroes > 0; --zeroes) {
|
|
|
+ *bitmap_p <<= 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
break;
|
|
|
#endif
|
|
|
case BIGBLOCK:
|