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++;