Add a malloc size histogram to the debugging malloc implementation

in mem2.c. (CVS 4490)

FossilOrigin-Name: 3e51696cb878063e4ebfdcc2a61ba94c9bebdfe3
This commit is contained in:
drh 2007-10-15 19:34:32 +00:00
parent db2d286b59
commit d2bb3278e0
4 changed files with 43 additions and 13 deletions

View File

@ -1,5 +1,5 @@
C Fix\sfor\sOMIT_AUTHORIZATION\sbuilds.\s(CVS\s4489)
D 2007-10-15T07:08:44
C Add\sa\smalloc\ssize\shistogram\sto\sthe\sdebugging\smalloc\simplementation\nin\smem2.c.\s(CVS\s4490)
D 2007-10-15T19:34:32
F Makefile.in 75b729d562e9525d57d9890ec598b38e1a8b02bc
F Makefile.linux-gcc 65241babba6faf1152bf86574477baab19190499
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@ -103,7 +103,7 @@ F src/main.c 994a6b6914d91dc6dea5012667ec0a52e74d3bca
F src/malloc.c de4e77fe70a9a0ac47a1c3a874422b107231bf31
F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217
F src/mem1.c 232075b7da8c9b7f23159bbda25c7407168ab9db
F src/mem2.c 9c59519e471f858961fbdccd9543317bba1c5e58
F src/mem2.c 8651e5306c1d5c0a7ab91c027a653ced1ca3e6d6
F src/mutex.c 3259f62c2429967aee6dc112117a6d2f499ef061
F src/mutex.h 079fa6fe9da18ceb89e79012c010594c6672addb
F src/mutex_os2.c 7fe4773e98ed74a63b2e54fc557929eb155f6269
@ -427,7 +427,7 @@ F test/table.test 13b1c2e2fb4727b35ee1fb7641fc469214fd2455
F test/tableapi.test 92651a95c23cf955e92407928e640536402fa3cc
F test/tclsqlite.test c7feea1985c3e8a1ed134ba342347d47fa762e43
F test/temptable.test 19b851b9e3e64d91e9867619b2a3f5fffee6e125
F test/tester.tcl 913a808f05b0aed2fbb16481a423b1a5a118bdf0
F test/tester.tcl 0fea2ceef69678ee8b15d3dd64d29f659449a081
F test/thread001.test 8fbd9559da0bbdc273e00318c7fd66c162020af7
F test/thread002.test 2c4ad2c386f60f6fe268cd91c769ee35b3c1fd0b
F test/thread1.test 776c9e459b75ba905193b351926ac4019b049f35
@ -581,7 +581,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
P e756bc9b74ef357c088b3044527c41e6834ba1a2
R 2a362f0638262e15107e468de4d77838
U danielk1977
Z 171613e0cdad61754450cbee9fe33dc0
P 260711a14d5ab2d7c9888c7c46c33a28a3da0415
R e7cd2dbd87cc55ed9709f416c29bb4b2
U drh
Z b3fd55271c42d6d384286f4a414e866e

View File

@ -1 +1 @@
260711a14d5ab2d7c9888c7c46c33a28a3da0415
3e51696cb878063e4ebfdcc2a61ba94c9bebdfe3

View File

@ -12,7 +12,7 @@
** This file contains the C functions that implement a memory
** allocation subsystem for use by SQLite.
**
** $Id: mem2.c,v 1.14 2007/10/03 08:46:45 danielk1977 Exp $
** $Id: mem2.c,v 1.15 2007/10/15 19:34:32 drh Exp $
*/
/*
@ -84,6 +84,11 @@ struct MemBlockHdr {
#define FOREGUARD 0x80F5E153
#define REARGUARD 0xE4676B53
/*
** Number of malloc size increments to track.
*/
#define NCSIZE 500
/*
** All of the static variables used by this module are collected
** into a single structure named "mem". This is to keep the
@ -148,8 +153,15 @@ static struct {
** sqlite3MallocAllow() decrements it.
*/
int disallow; /* Do not allow memory allocation */
/*
** Gather statistics on the sizes of memory allocations.
** sizeCnt[i] is the number of allocation attempts of i*4
** bytes. i==NCSIZE is the number of allocation attempts for
** sizes more than NCSIZE*4 bytes.
*/
int sizeCnt[NCSIZE];
} mem;
@ -272,6 +284,11 @@ void *sqlite3_malloc(int nByte){
sqlite3MemsysAlarm(nByte);
}
nByte = (nByte+3)&~3;
if( nByte/8>NCSIZE-1 ){
mem.sizeCnt[NCSIZE-1]++;
}else{
mem.sizeCnt[nByte/8]++;
}
totalSize = nByte + sizeof(*pHdr) + sizeof(int) +
mem.nBacktrace*sizeof(void*) + mem.nTitle;
if( mem.iFail>0 ){
@ -440,6 +457,7 @@ void sqlite3_memdebug_dump(const char *zFilename){
FILE *out;
struct MemBlockHdr *pHdr;
void **pBt;
int i;
out = fopen(zFilename, "w");
if( out==0 ){
fprintf(stderr, "** Unable to output memory debug output log: %s **\n",
@ -459,6 +477,15 @@ void sqlite3_memdebug_dump(const char *zFilename){
fprintf(out, "\n");
}
}
fprintf(out, "COUNTS:\n");
for(i=0; i<NCSIZE-1; i++){
if( mem.sizeCnt[i] ){
fprintf(out, " %3d: %d\n", i*8+8, mem.sizeCnt[i]);
}
}
if( mem.sizeCnt[NCSIZE-1] ){
fprintf(out, " >%3d: %d\n", NCSIZE*8, mem.sizeCnt[NCSIZE-1]);
}
fclose(out);
}

View File

@ -11,7 +11,7 @@
# This file implements some common TCL routines used for regression
# testing the SQLite library
#
# $Id: tester.tcl,v 1.91 2007/09/01 09:02:54 danielk1977 Exp $
# $Id: tester.tcl,v 1.92 2007/10/15 19:34:32 drh Exp $
set tcl_precision 15
@ -203,6 +203,9 @@ proc finalize_testing {} {
}
} else {
puts "All memory allocations freed - no leaks"
ifcapable memdebug {
sqlite3_memdebug_dump ./memusage.txt
}
}
puts "Maximum memory usage: [sqlite3_memory_highwater] bytes"
foreach f [glob -nocomplain test.db-*-journal] {