On 22 May 2014 07:29, Otto Moerbeek <[email protected]> wrote:
> Hi,
>
> some stats are always computed. Move them under #ifdef MALLOC_STATS
> And a small thing for error reporting.
>
> ok?

Makes sense to me, looks good. ok krw@

.... Ken

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