Hi,

this refactors the code that find an existsing allocation into a
separate function. The code is currently repeated in three spots.

Prepatory work to get a somehwat more efficient version of the
"not-my-pool" case.

Please review and test,

        -Otto

Index: malloc.c
===================================================================
RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v
retrieving revision 1.254
diff -u -p -r1.254 malloc.c
--- malloc.c    21 Nov 2018 06:57:04 -0000      1.254
+++ malloc.c    25 Nov 2018 18:44:50 -0000
@@ -1273,19 +1273,18 @@ validate_junk(struct dir_info *pool, voi
        }
 }
 
-static void
-ofree(struct dir_info *argpool, void *p, int clear, int check, size_t argsz)
+
+static struct region_info *
+findpool(void *p, struct dir_info *argpool, struct dir_info **foundpool,
+    char **saved_function)
 {
-       struct dir_info *pool;
-       struct region_info *r;
-       char *saved_function;
-       size_t sz;
-       int i;
+       struct dir_info *pool = argpool;
+       struct region_info *r = find(pool, p);
 
-       pool = argpool;
-       r = find(pool, p);
        if (r == NULL) {
                if (mopts.malloc_mt)  {
+                       int i;
+
                        for (i = 0; i < _MALLOC_MUTEXES; i++) {
                                if (i == argpool->mutex)
                                        continue;
@@ -1296,7 +1295,7 @@ ofree(struct dir_info *argpool, void *p,
                                pool->active++;
                                r = find(pool, p);
                                if (r != NULL) {
-                                       saved_function = pool->func;
+                                       *saved_function = pool->func;
                                        pool->func = argpool->func;
                                        break;
                                }
@@ -1305,6 +1304,19 @@ ofree(struct dir_info *argpool, void *p,
                if (r == NULL)
                        wrterror(argpool, "bogus pointer (double free?) %p", p);
        }
+       *foundpool = pool;
+       return r;
+}
+
+static void
+ofree(struct dir_info *argpool, void *p, int clear, int check, size_t argsz)
+{
+       struct region_info *r;
+       struct dir_info *pool;
+       char *saved_function;
+       size_t sz;
+
+       r = findpool(p, argpool, &pool, &saved_function);
 
        REALSIZE(sz, r);
        if (check) {
@@ -1469,48 +1481,24 @@ DEF_WEAK(freezero);
 static void *
 orealloc(struct dir_info *argpool, void *p, size_t newsz, void *f)
 {
-       struct dir_info *pool;
        struct region_info *r;
+       struct dir_info *pool;
+       char *saved_function;
        struct chunk_info *info;
        size_t oldsz, goldsz, gnewsz;
        void *q, *ret;
-       char *saved_function;
-       int i;
        uint32_t chunknum;
 
-       pool = argpool;
-
        if (p == NULL)
-               return omalloc(pool, newsz, 0, f);
+               return omalloc(argpool, newsz, 0, f);
 
-       r = find(pool, p);
-       if (r == NULL) {
-               if (mopts.malloc_mt) {
-                       for (i = 0; i < _MALLOC_MUTEXES; i++) {
-                               if (i == argpool->mutex)
-                                       continue;
-                               pool->active--;
-                               _MALLOC_UNLOCK(pool->mutex);
-                               pool = mopts.malloc_pool[i];
-                               _MALLOC_LOCK(pool->mutex);
-                               pool->active++;
-                               r = find(pool, p);
-                               if (r != NULL) {
-                                       saved_function = pool->func;
-                                       pool->func = argpool->func;
-                                       break;
-                               }
-                       }
-               }
-               if (r == NULL)
-                       wrterror(argpool, "bogus pointer (double free?) %p", p);
-       }
        if (newsz >= SIZE_MAX - mopts.malloc_guard - MALLOC_PAGESIZE) {
                errno = ENOMEM;
-               ret = NULL;
-               goto done;
+               return  NULL;
        }
 
+       r = findpool(p, argpool, &pool, &saved_function);
+
        REALSIZE(oldsz, r);
        if (mopts.chunk_canaries && oldsz <= MALLOC_MAXCHUNK) {
                info = (struct chunk_info *)r->size;
@@ -1745,39 +1733,19 @@ static void *
 orecallocarray(struct dir_info *argpool, void *p, size_t oldsize,
     size_t newsize, void *f)
 {
-       struct dir_info *pool;
        struct region_info *r;
+       struct dir_info *pool;
+       char * saved_function;
        void *newptr;
        size_t sz;
-       int i;
-
-       pool = argpool;
 
        if (p == NULL)
-               return omalloc(pool, newsize, 1, f);
+               return omalloc(argpool, newsize, 1, f);
 
        if (oldsize == newsize)
                return p;
 
-       r = find(pool, p);
-       if (r == NULL) {
-               if (mopts.malloc_mt) {
-                       for (i = 0; i < _MALLOC_MUTEXES; i++) {
-                               if (i == argpool->mutex)
-                                       continue;
-                               pool->active--;
-                               _MALLOC_UNLOCK(pool->mutex);
-                               pool = mopts.malloc_pool[i];
-                               _MALLOC_LOCK(pool->mutex);
-                               pool->active++;
-                               r = find(pool, p);
-                               if (r != NULL)
-                                       break;
-                       }
-               }
-               if (r == NULL)
-                       wrterror(pool, "bogus pointer (double free?) %p", p);
-       }
+       r = findpool(p, argpool, &pool, &saved_function);
 
        REALSIZE(sz, r);
        if (sz <= MALLOC_MAXCHUNK) {
@@ -1809,6 +1777,7 @@ orecallocarray(struct dir_info *argpool,
 done:
        if (argpool != pool) {
                pool->active--;
+               pool->func = saved_function;
                _MALLOC_UNLOCK(pool->mutex);
                _MALLOC_LOCK(argpool->mutex);
                argpool->active++;

Reply via email to