Hi,

some stats are always computed. Move them under #ifdef MALLOC_STATS
And a small thing for error reporting. 

ok?

        -Otto


Index: malloc.c
===================================================================
RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v
retrieving revision 1.165
diff -u -p -r1.165 malloc.c
--- malloc.c    21 May 2014 15:47:51 -0000      1.165
+++ malloc.c    22 May 2014 11:25:09 -0000
@@ -127,10 +127,16 @@ struct dir_info {
        size_t delete_moves;
        size_t cheap_realloc_tries;
        size_t cheap_reallocs;
-#define STATS_INC(x) ((x)++)
-#define STATS_ZERO(x) ((x) = 0)
-#define STATS_SETF(x,y) ((x)->f = (y))
+       size_t malloc_used;             /* bytes allocated */
+       size_t malloc_guarded;          /* bytes used for guards */
+#define STATS_ADD(x,y) ((x) += (y))
+#define STATS_SUB(x,y) ((x) -= (y))
+#define STATS_INC(x)   ((x)++)
+#define STATS_ZERO(x)  ((x) = 0)
+#define STATS_SETF(x,y)        ((x)->f = (y))
 #else
+#define STATS_ADD(x,y) /* nothing */
+#define STATS_SUB(x,y) /* nothing */
 #define STATS_INC(x)   /* nothing */
 #define STATS_ZERO(x)  /* nothing */
 #define STATS_SETF(x,y)        /* nothing */
@@ -189,8 +195,6 @@ char                *malloc_options;        /* compile-time 
o
 static char    *malloc_func;           /* current function */
 static int     malloc_active;          /* status of malloc */
 
-static size_t  malloc_guarded;         /* bytes used for guards */
-static size_t  malloc_used;            /* bytes allocated */
 
 static size_t rbytesused;              /* random bytes used */
 static u_char rbytes[512];             /* random bytes */
@@ -241,7 +245,7 @@ wrterror(char *msg, void *p)
        iov[0].iov_base = __progname;
        iov[0].iov_len = strlen(__progname);
        iov[1].iov_base = pidbuf;
-       snprintf(pidbuf, sizeof(pidbuf), "(%d)", getpid());
+       snprintf(pidbuf, sizeof(pidbuf), "(%d) in ", getpid());
        iov[1].iov_len = strlen(pidbuf);
        iov[2].iov_base = malloc_func;
        iov[2].iov_len = strlen(malloc_func);
@@ -311,7 +315,7 @@ unmap(struct dir_info *d, void *p, size_
        if (psz > mopts.malloc_cache) {
                if (munmap(p, sz))
                        wrterror("munmap", p);
-               malloc_used -= sz;
+               STATS_SUB(d->malloc_used, sz);
                return;
        }
        tounmap = 0;
@@ -332,7 +336,7 @@ unmap(struct dir_info *d, void *p, size_
                                tounmap = 0;
                        d->free_regions_size -= r->size;
                        r->size = 0;
-                       malloc_used -= rsz;
+                       STATS_SUB(d->malloc_used, rsz);
                }
        }
        if (tounmap > 0)
@@ -372,7 +376,7 @@ zapcacheregion(struct dir_info *d, void 
                        r->p = NULL;
                        d->free_regions_size -= r->size;
                        r->size = 0;
-                       malloc_used -= rsz;
+                       STATS_SUB(d->malloc_used, rsz);
                }
        }
 }
@@ -395,7 +399,7 @@ map(struct dir_info *d, size_t sz, int z
        if (psz > d->free_regions_size) {
                p = MMAP(sz);
                if (p != MAP_FAILED)
-                       malloc_used += sz;
+                       STATS_ADD(d->malloc_used, sz);
                /* zero fill not needed */
                return p;
        }
@@ -439,7 +443,7 @@ map(struct dir_info *d, size_t sz, int z
        }
        p = MMAP(sz);
        if (p != MAP_FAILED)
-               malloc_used += sz;
+               STATS_ADD(d->malloc_used, sz);
        if (d->free_regions_size > mopts.malloc_cache)
                wrterror("malloc cache", NULL);
        /* zero fill not needed */
@@ -625,7 +629,7 @@ omalloc_init(struct dir_info **dp)
                for (j = 0; j < MALLOC_CHUNK_LISTS; j++)
                        LIST_INIT(&d->chunk_dir[i][j]);
        }
-       malloc_used += regioninfo_size;
+       STATS_ADD(d->malloc_used, regioninfo_size);
        d->canary1 = mopts.malloc_canary ^ (u_int32_t)(uintptr_t)d;
        d->canary2 = ~d->canary1;
 
@@ -661,7 +665,7 @@ omalloc_grow(struct dir_info *d)
        if (p == MAP_FAILED)
                return 1;
        
-       malloc_used += newsize;
+       STATS_ADD(d->malloc_used, newsize);
        memset(p, 0, newsize);
        STATS_ZERO(d->inserts);
        STATS_ZERO(d->insert_collisions);
@@ -681,7 +685,8 @@ omalloc_grow(struct dir_info *d)
        if (munmap(d->r, d->regions_total * sizeof(struct region_info))) 
                wrterror("munmap", d->r);
        else
-               malloc_used -= d->regions_total * sizeof(struct region_info);
+               STATS_SUB(d->malloc_used,
+                   d->regions_total * sizeof(struct region_info));
        d->regions_free = d->regions_free + d->regions_total;
        d->regions_total = newtotal;
        d->r = p;
@@ -710,7 +715,7 @@ alloc_chunk_info(struct dir_info *d, int
                q = MMAP(MALLOC_PAGESIZE);
                if (q == MAP_FAILED)
                        return NULL;
-               malloc_used += MALLOC_PAGESIZE;
+               STATS_ADD(d->malloc_used, MALLOC_PAGESIZE);
                count = MALLOC_PAGESIZE / size;
                for (i = 0; i < count; i++, q += size)
                        LIST_INSERT_HEAD(&d->chunk_info_list[bits],
@@ -1067,7 +1072,7 @@ omalloc(size_t sz, int zero_fill, void *
                        if (mprotect((char *)p + psz - mopts.malloc_guard,
                            mopts.malloc_guard, PROT_NONE))
                                wrterror("mprotect", NULL);
-                       malloc_guarded += mopts.malloc_guard;
+                       STATS_ADD(g_pool->malloc_guarded, mopts.malloc_guard);
                }
 
                if (mopts.malloc_move &&
@@ -1142,7 +1147,7 @@ malloc(size_t size)
        int saved_errno = errno;
 
        _MALLOC_LOCK();
-       malloc_func = " in malloc():";
+       malloc_func = "malloc():";
        if (g_pool == NULL) {
                if (malloc_init() != 0)
                        return NULL;
@@ -1201,7 +1206,7 @@ ofree(void *p)
                                    PROT_READ | PROT_WRITE))
                                        wrterror("mprotect", NULL);
                        }
-                       malloc_guarded -= mopts.malloc_guard;
+                       STATS_SUB(g_pool->malloc_guarded, mopts.malloc_guard);
                }
                if (mopts.malloc_junk && !mopts.malloc_freeunmap) {
                        size_t amt = mopts.malloc_junk == 1 ? MALLOC_MAXCHUNK :
@@ -1249,7 +1254,7 @@ free(void *ptr)
                return;
 
        _MALLOC_LOCK();
-       malloc_func = " in free():";  
+       malloc_func = "free():";  
        if (g_pool == NULL) {
                _MALLOC_UNLOCK();
                wrterror("free() called before allocation", NULL);
@@ -1316,7 +1321,7 @@ orealloc(void *p, size_t newsz, void *f)
                                else
                                        q = MAP_FAILED;
                                if (q == hint) {
-                                       malloc_used += needed;
+                                       STATS_ADD(g_pool->malloc_used, needed);
                                        if (mopts.malloc_junk == 2)
                                                memset(q, SOME_JUNK, needed);
                                        r->size = newsz;
@@ -1378,7 +1383,7 @@ realloc(void *ptr, size_t size)
        int saved_errno = errno;
   
        _MALLOC_LOCK();
-       malloc_func = " in realloc():";  
+       malloc_func = "realloc():";  
        if (g_pool == NULL) {
                if (malloc_init() != 0)
                        return NULL;
@@ -1414,7 +1419,7 @@ calloc(size_t nmemb, size_t size)
        int saved_errno = errno;
 
        _MALLOC_LOCK();
-       malloc_func = " in calloc():";  
+       malloc_func = "calloc():";  
        if (g_pool == NULL) {
                if (malloc_init() != 0)
                        return NULL;
@@ -1480,7 +1485,7 @@ mapalign(struct dir_info *d, size_t alig
        }
        if (munmap(q + sz, alignment - (q - p)))
                wrterror("munmap", q + sz);
-       malloc_used -= alignment;
+       STATS_SUB(d->malloc_used, alignment);
 
        return q;
 }
@@ -1525,7 +1530,7 @@ omemalign(size_t alignment, size_t sz, i
                if (mprotect((char *)p + psz - mopts.malloc_guard,
                    mopts.malloc_guard, PROT_NONE))
                        wrterror("mprotect", NULL);
-               malloc_guarded += mopts.malloc_guard;
+               STATS_ADD(g_pool->malloc_guarded, mopts.malloc_guard);
        }
 
        if (mopts.malloc_junk == 2) {
@@ -1550,7 +1555,7 @@ posix_memalign(void **memptr, size_t ali
                return EINVAL;
 
        _MALLOC_LOCK();
-       malloc_func = " in posix_memalign():";
+       malloc_func = "posix_memalign():";
        if (g_pool == NULL) {
                if (malloc_init() != 0)
                        goto err;
@@ -1790,9 +1795,9 @@ malloc_dump1(int fd, struct dir_info *d)
                                    d->r[i].f, 0);
                }
        }
-       snprintf(buf, sizeof(buf), "In use %zu\n", malloc_used);
+       snprintf(buf, sizeof(buf), "In use %zu\n", d->malloc_used);
        write(fd, buf, strlen(buf));
-       snprintf(buf, sizeof(buf), "Guarded %zu\n", malloc_guarded);
+       snprintf(buf, sizeof(buf), "Guarded %zu\n", d->malloc_guarded);
        write(fd, buf, strlen(buf));
        dump_leaks(fd);
        write(fd, "\n", 1);
        

Reply via email to