| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | #include <assert.h> |
| | #include <string.h> |
| | #include <stdio.h> |
| |
|
| | |
| | static sqlite3_mem_methods memtraceBase; |
| | static FILE *memtraceOut; |
| |
|
| | |
| | static void *memtraceMalloc(int n){ |
| | if( memtraceOut ){ |
| | fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", |
| | memtraceBase.xRoundup(n)); |
| | } |
| | return memtraceBase.xMalloc(n); |
| | } |
| | static void memtraceFree(void *p){ |
| | if( p==0 ) return; |
| | if( memtraceOut ){ |
| | fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); |
| | } |
| | memtraceBase.xFree(p); |
| | } |
| | static void *memtraceRealloc(void *p, int n){ |
| | if( p==0 ) return memtraceMalloc(n); |
| | if( n==0 ){ |
| | memtraceFree(p); |
| | return 0; |
| | } |
| | if( memtraceOut ){ |
| | fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", |
| | memtraceBase.xSize(p), memtraceBase.xRoundup(n)); |
| | } |
| | return memtraceBase.xRealloc(p, n); |
| | } |
| | static int memtraceSize(void *p){ |
| | return memtraceBase.xSize(p); |
| | } |
| | static int memtraceRoundup(int n){ |
| | return memtraceBase.xRoundup(n); |
| | } |
| | static int memtraceInit(void *p){ |
| | return memtraceBase.xInit(p); |
| | } |
| | static void memtraceShutdown(void *p){ |
| | memtraceBase.xShutdown(p); |
| | } |
| |
|
| | |
| | static sqlite3_mem_methods ersaztMethods = { |
| | memtraceMalloc, |
| | memtraceFree, |
| | memtraceRealloc, |
| | memtraceSize, |
| | memtraceRoundup, |
| | memtraceInit, |
| | memtraceShutdown, |
| | 0 |
| | }; |
| |
|
| | |
| | int sqlite3MemTraceActivate(FILE *out){ |
| | int rc = SQLITE_OK; |
| | if( memtraceBase.xMalloc==0 ){ |
| | rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); |
| | if( rc==SQLITE_OK ){ |
| | rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); |
| | } |
| | } |
| | memtraceOut = out; |
| | return rc; |
| | } |
| |
|
| | |
| | int sqlite3MemTraceDeactivate(void){ |
| | int rc = SQLITE_OK; |
| | if( memtraceBase.xMalloc!=0 ){ |
| | rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); |
| | if( rc==SQLITE_OK ){ |
| | memset(&memtraceBase, 0, sizeof(memtraceBase)); |
| | } |
| | } |
| | memtraceOut = 0; |
| | return rc; |
| | } |
| |
|