]>
git.ipfire.org Git - thirdparty/bash.git/blob - lib/malloc/stats.c
1 /* stats.c - malloc statistics */
3 /* Copyright (C) 2001-2003 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
35 extern int malloc_free_blocks
__P((int));
37 extern struct _malstats _mstats
;
39 extern FILE *_imalloc_fopen
__P((char *, char *, char *, char *, size_t));
42 malloc_bucket_stats (size
)
45 struct bucket_stats v
;
49 if (size
< 0 || size
>= NBUCKETS
)
52 v
.nused
= v
.nmal
= v
.nmorecore
= v
.nlesscore
= v
.nsplit
= 0;
56 v
.blocksize
= 1 << (size
+ 3);
57 v
.nused
= _mstats
.nmalloc
[size
];
58 v
.nmal
= _mstats
.tmalloc
[size
];
59 v
.nmorecore
= _mstats
.nmorecore
[size
];
60 v
.nlesscore
= _mstats
.nlesscore
[size
];
61 v
.nsplit
= _mstats
.nsplit
[size
];
62 v
.ncoalesce
= _mstats
.ncoalesce
[size
];
64 v
.nfree
= malloc_free_blocks (size
); /* call back to malloc.c */
69 /* Return a copy of _MSTATS, with two additional fields filled in:
70 BYTESFREE is the total number of bytes on free lists. BYTESUSED
71 is the total number of bytes in use. These two fields are fairly
72 expensive to compute, so we do it only when asked to. */
76 struct _malstats result
;
77 struct bucket_stats v
;
81 result
.bytesused
= result
.bytesfree
= 0;
82 for (i
= 0; i
< NBUCKETS
; i
++)
84 v
= malloc_bucket_stats (i
);
85 result
.bytesfree
+= v
.nfree
* v
.blocksize
;
86 result
.bytesused
+= v
.nused
* v
.blocksize
;
92 _print_malloc_stats (s
, fp
)
97 unsigned long totused
, totfree
;
98 struct bucket_stats v
;
100 fprintf (fp
, "Memory allocation statistics: %s\n size\tfree\tin use\ttotal\tmorecore lesscore split\tcoalesce\n", s
? s
: "");
101 for (i
= totused
= totfree
= 0; i
< NBUCKETS
; i
++)
103 v
= malloc_bucket_stats (i
);
105 fprintf (fp
, "%8lu\t%4d\t%6d\t%5d\t%8d\t%d %5d %8d\n", (unsigned long)v
.blocksize
, v
.nfree
, v
.nused
, v
.nmal
, v
.nmorecore
, v
.nlesscore
, v
.nsplit
, v
.ncoalesce
);
106 totfree
+= v
.nfree
* v
.blocksize
;
107 totused
+= v
.nused
* v
.blocksize
;
109 fprintf (fp
, "\nTotal bytes in use: %lu, total bytes free: %lu\n",
111 fprintf (fp
, "\nTotal bytes requested by application: %lu\n", _mstats
.bytesreq
);
112 fprintf (fp
, "Total mallocs: %d, total frees: %d, total reallocs: %d (%d copies)\n",
113 _mstats
.nmal
, _mstats
.nfre
, _mstats
.nrealloc
, _mstats
.nrcopy
);
114 fprintf (fp
, "Total sbrks: %d, total bytes via sbrk: %d\n",
115 _mstats
.nsbrk
, _mstats
.tsbrk
);
116 fprintf (fp
, "Total blocks split: %d, total block coalesces: %d\n",
117 _mstats
.tbsplit
, _mstats
.tbcoalesce
);
121 print_malloc_stats (s
)
124 _print_malloc_stats (s
, stderr
);
128 fprint_malloc_stats (s
, fp
)
132 _print_malloc_stats (s
, fp
);
135 #define TRACEROOT "/var/tmp/maltrace/stats."
138 trace_malloc_stats (s
, fn
)
142 char defname
[sizeof (TRACEROOT
) + 64];
143 static char mallbuf
[1024];
145 fp
= _imalloc_fopen (s
, fn
, TRACEROOT
, defname
, sizeof (defname
));
148 setvbuf (fp
, mallbuf
, _IOFBF
, sizeof (mallbuf
));
149 _print_malloc_stats (s
, fp
);
155 #endif /* MALLOC_STATS */
157 #if defined (MALLOC_STATS) || defined (MALLOC_TRACE)
159 _imalloc_fopen (s
, fn
, def
, defbuf
, defsiz
)
173 sprintf (defbuf
, "%s%ld", def
, l
);
174 fp
= fopen(defbuf
, "w");
182 sprintf (pidbuf
, "%ld", l
);
183 if ((strlen (pidbuf
) + strlen (fn
) + 2) >= sizeof (fname
))
185 for (sp
= 0, p
= fname
, q
= fn
; *q
; )
187 if (sp
== 0 && *q
== '%' && q
[1] == 'p')
190 for (r
= pidbuf
; *r
; )
198 fp
= fopen (fname
, "w");
203 #endif /* MALLOC_STATS || MALLOC_TRACE */