]> granicus.if.org Git - graphviz/commitdiff
remove a level of indirection in vmalloc
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 11 Jul 2020 22:05:53 +0000 (15:05 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 25 Jul 2020 18:54:35 +0000 (11:54 -0700)
The metadata for the allocator is now allocated directly in Vmalloc_t instead of
within a Vmdata_t. This lets us allocate in a single block more efficiently.

lib/vmalloc/vmalloc.h
lib/vmalloc/vmbest.c
lib/vmalloc/vmclear.c
lib/vmalloc/vmclose.c
lib/vmalloc/vmhdr.h
lib/vmalloc/vmopen.c

index ce62e36cbf9c18fffa84e0b693fa6d38525fbc1e..d2e9a7f3a62d3cb6d3b7ed722479d2c78fdec751 100644 (file)
@@ -72,6 +72,10 @@ extern "C" {
 #ifdef _VM_PRIVATE_
         _VM_PRIVATE_
 #endif
+
+       void **allocated;       /* pointers we have given out           */
+       size_t size;    /* used entries in `allocated`          */
+       size_t capacity;        /* available entries in `allocated`     */
     };
 
 #define VM_TRUST       0000001 /* forgo some security checks   */
index 9ddb55567630324eb1f3853eb15941ef80ade116..0e192d095520db45d1fe130631153954c79758aa 100644 (file)
 
 /** make room to store a new pointer we are about to allocate
  *
- * @param vd Vmdata to operate on
+ * @param vm Vmalloc to operate on
  * @returns true on success
  */
-static bool make_space(Vmdata_t *vd) {
+static bool make_space(Vmalloc_t *vm) {
 
-  if (vd->size == vd->capacity) {
+  if (vm->size == vm->capacity) {
     void **p;
 
     /* expand our allocation storage */
-    size_t c = vd->capacity == 0 ? 1 : vd->capacity * 2;
-    p = realloc(vd->allocated, sizeof(vd->allocated[0]) * c);
+    size_t c = vm->capacity == 0 ? 1 : vm->capacity * 2;
+    p = realloc(vm->allocated, sizeof(vm->allocated[0]) * c);
     if (p == NULL) {
       return false;
     }
 
     /* save the new array */
-    vd->allocated = p;
-    vd->capacity = c;
+    vm->allocated = p;
+    vm->capacity = c;
   }
 
   return true;
@@ -44,10 +44,9 @@ static bool make_space(Vmdata_t *vd) {
  * @param size desired block size
  */
 void *bestalloc(Vmalloc_t *vm, size_t size) {
-  Vmdata_t *vd = vm->data;
   void *p;
 
-  if (!make_space(vd)) {
+  if (!make_space(vm)) {
     return NULL;
   }
 
@@ -56,14 +55,13 @@ void *bestalloc(Vmalloc_t *vm, size_t size) {
     return NULL;
   }
 
-  vd->allocated[vd->size] = p;
-  ++vd->size;
+  vm->allocated[vm->size] = p;
+  ++vm->size;
 
   return p;
 }
 
 int bestfree(Vmalloc_t *vm, void *data) {
-  Vmdata_t *vd = vm->data;
   size_t i;
 
   if (!data) { /* ANSI-ism */
@@ -71,13 +69,13 @@ int bestfree(Vmalloc_t *vm, void *data) {
   }
 
   /* find the pointer we previously allocated */
-  for (i = 0; i < vd->size; ++i) {
-    if (vd->allocated[i] == data) {
+  for (i = 0; i < vm->size; ++i) {
+    if (vm->allocated[i] == data) {
 
       /* clear this slot */
-      size_t extent = sizeof(vd->allocated[0]) * (vd->size - i - 1);
-      memmove(vd->allocated + i, vd->allocated + i + 1, extent);
-      --vd->size;
+      size_t extent = sizeof(vm->allocated[0]) * (vm->size - i - 1);
+      memmove(vm->allocated + i, vm->allocated + i + 1, extent);
+      --vm->size;
 
       /* give this back to the underlying allocator */
       free(data);
@@ -97,7 +95,6 @@ int bestfree(Vmalloc_t *vm, void *data) {
  * @param type ignored
  */
 void *bestresize(Vmalloc_t *vm, void *data, size_t size, int type) {
-  Vmdata_t *vd = vm->data;
   size_t i;
 
   /* ignore type */
@@ -108,8 +105,8 @@ void *bestresize(Vmalloc_t *vm, void *data, size_t size, int type) {
   }
 
   /* find the pointer we previously allocated */
-  for (i = 0; i < vd->size; ++i) {
-    if (vd->allocated[i] == data) {
+  for (i = 0; i < vm->size; ++i) {
+    if (vm->allocated[i] == data) {
 
       /* resize the allocation */
       void *p = realloc(data, size);
@@ -118,7 +115,7 @@ void *bestresize(Vmalloc_t *vm, void *data, size_t size, int type) {
       }
 
       /* save the updated pointer */
-      vd->allocated[i] = p;
+      vm->allocated[i] = p;
 
       return p;
     }
index fc980671126835a7ae221d4a18c7c7fe88c734f2..d512cebbd37cb51f2ad114ae83caa3560e37982e 100644 (file)
 */
 int vmclear(Vmalloc_t *vm) {
   size_t i;
-  Vmdata_t *vd = vm->data;
 
   /* free all allocated pointers */
-  for (i = 0; i < vd->size; ++i) {
-    free(vd->allocated[i]);
+  for (i = 0; i < vm->size; ++i) {
+    free(vm->allocated[i]);
   }
 
   /* reset our metadata */
-  free(vd->allocated);
-  vd->allocated = NULL;
-  vd->size = vd->capacity = 0;
+  free(vm->allocated);
+  vm->allocated = NULL;
+  vm->size = vm->capacity = 0;
 
   return 0;
 }
index fcc21bd2b2eae3db89d1c5d6bd538f27cddb19fe..d300370a15a6c9c8dd224447df412b192d6dfae4 100644 (file)
@@ -17,7 +17,6 @@
 **     Written by Kiem-Phong Vo, kpv@research.att.com, 01/16/94.
 */
 int vmclose(Vmalloc_t *vm) {
-  Vmdata_t *vd = vm->data;
   int r;
 
   /* clear the region */
@@ -27,7 +26,6 @@ int vmclose(Vmalloc_t *vm) {
   }
 
   /* free the allocator itself */
-  free(vd);
   free(vm);
 
   return 0;
index 94ab9f756c157c974d3bf65bfbe0303a730dfe14..d6d9a1524e271f086a1ea9f0bfeb0e637fef1064 100644 (file)
@@ -232,10 +232,6 @@ extern "C" {
        Block_t *root;          /* root of free tree                    */
        Block_t *tiny[S_TINY];  /* small blocks                         */
        Block_t *cache[S_CACHE + 1];    /* delayed free blocks                */
-
-       void **allocated;       /* pointers we have given out           */
-       size_t size;    /* used entries in `allocated`          */
-       size_t capacity;        /* available entries in `allocated`     */
     } Vmdata_t;
 
 /* private parts of Vmalloc_t */
index b0fca7646055fffdba2fd449b319def5c00d0946..bf959e07f73fe0ec0737cb142b88bf13479eb957 100644 (file)
@@ -20,7 +20,7 @@
 Vmalloc_t *vmopen(void) {
   Vmalloc_t *vm;
 
-  vm = malloc(sizeof(*vm));
+  vm = calloc(1, sizeof(*vm));
   if (vm == NULL) {
     return NULL;
   }
@@ -29,11 +29,5 @@ Vmalloc_t *vmopen(void) {
   vm->meth.resizef = bestresize;
   vm->meth.freef = bestfree;
 
-  vm->data = calloc(1, sizeof(*vm->data));
-  if (vm->data == NULL) {
-    free(vm);
-    return NULL;
-  }
-
   return vm;
 }