|
@@ -22,6 +22,8 @@
|
|
|
|
|
|
void split(allocator_t *allocator, heap_t *heap, void *ptr,
|
|
void split(allocator_t *allocator, heap_t *heap, void *ptr,
|
|
size_t req_size) {
|
|
size_t req_size) {
|
|
|
|
+ size_t new_size;
|
|
|
|
+ size_t min_split_size;
|
|
void *new_block;
|
|
void *new_block;
|
|
size_t new_block_size;
|
|
size_t new_block_size;
|
|
#ifdef COALESCE_AFTER_SPLIT
|
|
#ifdef COALESCE_AFTER_SPLIT
|
|
@@ -34,7 +36,29 @@ void split(allocator_t *allocator, heap_t *heap, void *ptr,
|
|
maptable_node_t *current_maptable_node;
|
|
maptable_node_t *current_maptable_node;
|
|
#endif /* WITH_FIXED_LISTS */
|
|
#endif /* WITH_FIXED_LISTS */
|
|
|
|
|
|
- new_block = (void *) ((char *) ptr + req_size + HEADER_SIZE);
|
|
|
|
|
|
+ /* Check what would be the size of the new block if we split the current
|
|
|
|
+ * one.
|
|
|
|
+ * Note: new_size is a size_t, so compare first in order to prevent an
|
|
|
|
+ * underflow.
|
|
|
|
+ */
|
|
|
|
+ if(get_size(ptr) > req_size + HEADER_SIZE) {
|
|
|
|
+ new_size = get_size(ptr) - req_size - HEADER_SIZE;
|
|
|
|
+ } else {
|
|
|
|
+ new_size = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+#ifdef SPLITTING_FIXED
|
|
|
|
+ min_split_size = MIN_SPLITTING_SIZE;
|
|
|
|
+#endif /* SPLITTING_FIXED */
|
|
|
|
+#ifdef SPLITTING_VARIABLE
|
|
|
|
+ min_split_size = heap->dmm_knobs.min_split_size;
|
|
|
|
+#endif /* SPLITTING_VARIABLE */
|
|
|
|
+
|
|
|
|
+ if(new_size < min_split_size) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ new_block = (void *)((char *)ptr + req_size + HEADER_SIZE);
|
|
new_block_size = get_size(ptr) - req_size - HEADER_SIZE;
|
|
new_block_size = get_size(ptr) - req_size - HEADER_SIZE;
|
|
|
|
|
|
/* Resize the previous, to be used block */
|
|
/* Resize the previous, to be used block */
|