|
@@ -18,7 +18,7 @@
|
|
/**
|
|
/**
|
|
* @file bitmap_realloc.c
|
|
* @file bitmap_realloc.c
|
|
* @author Ilias Pliotas, Ioannis Koutras
|
|
* @author Ilias Pliotas, Ioannis Koutras
|
|
- * @date September, 2012
|
|
|
|
|
|
+ * @date September 2012
|
|
* @brief realloc() implementation for bitmap-organized raw blocks
|
|
* @brief realloc() implementation for bitmap-organized raw blocks
|
|
*/
|
|
*/
|
|
|
|
|
|
@@ -48,8 +48,15 @@ void * bitmap_realloc(bitmap_rb_t *raw_block, void * ptr,
|
|
chunk_header = (chunk_header_t *)((char *)ptr - CHUNK_HDR_SIZE);
|
|
chunk_header = (chunk_header_t *)((char *)ptr - CHUNK_HDR_SIZE);
|
|
|
|
|
|
ret = malloc(req_size);
|
|
ret = malloc(req_size);
|
|
- ret = memmove(ret, ptr,
|
|
|
|
- chunk_header->num_of_cells * raw_block->bytes_per_cell);
|
|
|
|
|
|
+
|
|
|
|
+ if(req_size > chunk_header->num_of_cells * raw_block->bytes_per_cell -
|
|
|
|
+ CHUNK_HDR_SIZE) {
|
|
|
|
+ ret = memmove(ret, ptr, chunk_header->num_of_cells *
|
|
|
|
+ raw_block->bytes_per_cell - CHUNK_HDR_SIZE);
|
|
|
|
+ } else {
|
|
|
|
+ ret = memmove(ret, ptr, req_size);
|
|
|
|
+ }
|
|
|
|
+
|
|
#ifdef HAVE_LOCKS
|
|
#ifdef HAVE_LOCKS
|
|
raw_block_header_t *rb;
|
|
raw_block_header_t *rb;
|
|
rb = (raw_block_header_t *)((char *)raw_block - sizeof(raw_block_header_t));
|
|
rb = (raw_block_header_t *)((char *)raw_block - sizeof(raw_block_header_t));
|
|
@@ -59,5 +66,6 @@ void * bitmap_realloc(bitmap_rb_t *raw_block, void * ptr,
|
|
#ifdef HAVE_LOCKS
|
|
#ifdef HAVE_LOCKS
|
|
pthread_mutex_unlock(&rb->mutex);
|
|
pthread_mutex_unlock(&rb->mutex);
|
|
#endif /* HAVE_LOCKS */
|
|
#endif /* HAVE_LOCKS */
|
|
|
|
+
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|