revert to allowing NULL in alloc/realloc signature
authorChristian Thaeter <ct@pipapo.org>
Wed, 20 Dec 2006 17:55:32 +0000 (18:55 +0100)
committerChristian Thaeter <ct@pipapo.org>
Wed, 20 Dec 2006 17:55:32 +0000 (18:55 +0100)
lib/acogc.c

index 8e60ef5..0af035f 100644 (file)
@@ -570,7 +570,6 @@ acogc_alloc_ (void ** addr, size_t size, AcogcRoot root)
 {
   REQUIRE (addr);
   REQUIRE (size > 0);
-  REQUIRE (root);
 
   void * ret;
   acogc_freeing_policy pol = ACOGC_COLLECT_NORMAL;
@@ -581,9 +580,17 @@ acogc_alloc_ (void ** addr, size_t size, AcogcRoot root)
 
   if (!ret)
     {
-      acogc_root_collect (root, pol);
-      ++pol;
-      goto retry;
+      if (root)
+        {
+          acogc_root_collect (root, pol);
+          ++pol;
+          goto retry;
+        }
+      else
+        {
+          ERROR (NOBUG_ON, "out of memory");
+          abort();
+        }
     }
 
   *addr = ret;
@@ -596,7 +603,6 @@ acogc_reserve_ (void ** addr, size_t actual, size_t needed, AcogcRoot root)
   REQUIRE (addr);
   REQUIRE (actual > 0);
   REQUIRE (needed > 0);
-  REQUIRE (root);
 
   void * ret;
   acogc_freeing_policy pol = ACOGC_COLLECT_NORMAL;
@@ -605,13 +611,22 @@ acogc_reserve_ (void ** addr, size_t actual, size_t needed, AcogcRoot root)
   for (n = actual>16 ? actual : 16; n <= needed; n += (n>>1)); /*n = n * 1.5*/
 
  retry:
+  PLANNED("realloc only 'needed' when memory is low");
   ret = realloc (*addr, n);
   if (!ret)
     {
-      n = needed;
-      acogc_root_collect (root, pol);
-      ++pol;
-      goto retry;
+      if (root)
+        {
+          n = needed;
+          acogc_root_collect (root, pol);
+          ++pol;
+          goto retry;
+        }
+      else
+        {
+          ERROR (NOBUG_ON, "out of memory");
+          abort();
+        }
     }
 
   *addr = ret;