📄 test_malloc.c
字号:
Tcl_SetObjResult(interp, pResult); return TCL_OK;}/*** Usage: sqlite3_config_pagecache SIZE N**** Set the page-cache memory buffer using SQLITE_CONFIG_PAGECACHE.** The buffer is static and is of limited size. N might be** adjusted downward as needed to accomodate the requested size.** The revised value of N is returned.**** A negative SIZE causes the buffer pointer to be NULL.*/static int test_config_pagecache( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int sz, N, rc; Tcl_Obj *pResult; static char *buf = 0; if( objc!=3 ){ Tcl_WrongNumArgs(interp, 1, objv, "SIZE N"); return TCL_ERROR; } if( Tcl_GetIntFromObj(interp, objv[1], &sz) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[2], &N) ) return TCL_ERROR; free(buf); if( sz<0 ){ buf = 0; rc = sqlite3_config(SQLITE_CONFIG_PAGECACHE, 0, 0, 0); }else{ buf = malloc( sz*N ); rc = sqlite3_config(SQLITE_CONFIG_PAGECACHE, buf, sz, N); } pResult = Tcl_NewObj(); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(rc)); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(N)); Tcl_SetObjResult(interp, pResult); return TCL_OK;}/*** Usage: sqlite3_config_memstatus BOOLEAN**** Enable or disable memory status reporting using SQLITE_CONFIG_MEMSTATUS.*/static int test_config_memstatus( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int enable, rc; if( objc!=2 ){ Tcl_WrongNumArgs(interp, 1, objv, "BOOLEAN"); return TCL_ERROR; } if( Tcl_GetBooleanFromObj(interp, objv[1], &enable) ) return TCL_ERROR; rc = sqlite3_config(SQLITE_CONFIG_MEMSTATUS, enable); Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); return TCL_OK;}/*** Usage: sqlite3_config_chunkalloc ***/static int test_config_chunkalloc( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int rc; int nThreshold; if( objc!=2 ){ Tcl_WrongNumArgs(interp, 1, objv, "THRESHOLD"); return TCL_ERROR; } if( Tcl_GetIntFromObj(interp, objv[1], &nThreshold) ) return TCL_ERROR; rc = sqlite3_config(SQLITE_CONFIG_CHUNKALLOC, nThreshold); Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); return TCL_OK;}/*** Usage: sqlite3_config_lookaside SIZE COUNT***/static int test_config_lookaside( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int rc; int sz, cnt; if( objc!=3 ){ Tcl_WrongNumArgs(interp, 1, objv, "SIZE COUNT"); return TCL_ERROR; } if( Tcl_GetIntFromObj(interp, objv[1], &sz) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[2], &cnt) ) return TCL_ERROR; rc = sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, cnt); Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); return TCL_OK;}/*** Usage: sqlite3_db_config_lookaside CONNECTION BUFID SIZE COUNT**** There are two static buffers with BUFID 1 and 2. Each static buffer** is 10KB in size. A BUFID of 0 indicates that the buffer should be NULL** which will cause sqlite3_db_config() to allocate space on its own.*/static int test_db_config_lookaside( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int rc; int sz, cnt; sqlite3 *db; int bufid; static char azBuf[2][10000]; int getDbPointer(Tcl_Interp*, const char*, sqlite3**); if( objc!=5 ){ Tcl_WrongNumArgs(interp, 1, objv, "BUFID SIZE COUNT"); return TCL_ERROR; } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[2], &bufid) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[3], &sz) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[4], &cnt) ) return TCL_ERROR; if( bufid==0 ){ rc = sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, 0, sz, cnt); }else if( bufid>=1 && bufid<=2 && sz*cnt<=sizeof(azBuf[0]) ){ rc = sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, azBuf[bufid], sz,cnt); }else{ Tcl_AppendResult(interp, "illegal arguments - see documentation", (char*)0); return TCL_ERROR; } Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); return TCL_OK;}/*** Usage:**** sqlite3_config_heap NBYTE NMINALLOC*/static int test_config_heap( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ static char *zBuf; /* Use this memory */ static int szBuf; /* Bytes allocated for zBuf */ int nByte; /* Size of buffer to pass to sqlite3_config() */ int nMinAlloc; /* Size of minimum allocation */ int rc; /* Return code of sqlite3_config() */ Tcl_Obj * CONST *aArg = &objv[1]; int nArg = objc-1; if( nArg!=2 ){ Tcl_WrongNumArgs(interp, 1, objv, "NBYTE NMINALLOC"); return TCL_ERROR; } if( Tcl_GetIntFromObj(interp, aArg[0], &nByte) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, aArg[1], &nMinAlloc) ) return TCL_ERROR; if( nByte==0 ){ free( zBuf ); zBuf = 0; szBuf = 0; rc = sqlite3_config(SQLITE_CONFIG_HEAP, (void*)0, 0, 0); }else{ zBuf = realloc(zBuf, nByte); szBuf = nByte; rc = sqlite3_config(SQLITE_CONFIG_HEAP, zBuf, nByte, nMinAlloc); } Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); return TCL_OK;}/*** tclcmd: sqlite3_config_error [DB]**** Invoke sqlite3_config() or sqlite3_db_config() with invalid** opcodes and verify that they return errors.*/static int test_config_error( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ sqlite3 *db; int getDbPointer(Tcl_Interp*, const char*, sqlite3**); if( objc!=2 && objc!=1 ){ Tcl_WrongNumArgs(interp, 1, objv, "[DB]"); return TCL_ERROR; } if( objc==2 ){ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; if( sqlite3_db_config(db, 99999)!=SQLITE_ERROR ){ Tcl_AppendResult(interp, "sqlite3_db_config(db, 99999) does not return SQLITE_ERROR", (char*)0); return TCL_ERROR; } }else{ if( sqlite3_config(99999)!=SQLITE_ERROR ){ Tcl_AppendResult(interp, "sqlite3_config(99999) does not return SQLITE_ERROR", (char*)0); return TCL_ERROR; } } return TCL_OK;}/*** Usage: **** sqlite3_dump_memsys3 FILENAME** sqlite3_dump_memsys5 FILENAME**** Write a summary of unfreed memsys3 allocations to FILENAME.*/static int test_dump_memsys3( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ if( objc!=2 ){ Tcl_WrongNumArgs(interp, 1, objv, "FILENAME"); return TCL_ERROR; } switch( (int)clientData ){ case 3: {#ifdef SQLITE_ENABLE_MEMSYS3 extern void sqlite3Memsys3Dump(const char*); sqlite3Memsys3Dump(Tcl_GetString(objv[1])); break;#endif } case 5: {#ifdef SQLITE_ENABLE_MEMSYS5 extern void sqlite3Memsys5Dump(const char*); sqlite3Memsys5Dump(Tcl_GetString(objv[1])); break;#endif } } return TCL_OK;}/*** Usage: sqlite3_status OPCODE RESETFLAG**** Return a list of three elements which are the sqlite3_status() return** code, the current value, and the high-water mark value.*/static int test_status( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int rc, iValue, mxValue; int i, op, resetFlag; const char *zOpName; static const struct { const char *zName; int op; } aOp[] = { { "SQLITE_STATUS_MEMORY_USED", SQLITE_STATUS_MEMORY_USED }, { "SQLITE_STATUS_MALLOC_SIZE", SQLITE_STATUS_MALLOC_SIZE }, { "SQLITE_STATUS_PAGECACHE_USED", SQLITE_STATUS_PAGECACHE_USED }, { "SQLITE_STATUS_PAGECACHE_OVERFLOW", SQLITE_STATUS_PAGECACHE_OVERFLOW }, { "SQLITE_STATUS_PAGECACHE_SIZE", SQLITE_STATUS_PAGECACHE_SIZE }, { "SQLITE_STATUS_SCRATCH_USED", SQLITE_STATUS_SCRATCH_USED }, { "SQLITE_STATUS_SCRATCH_OVERFLOW", SQLITE_STATUS_SCRATCH_OVERFLOW }, { "SQLITE_STATUS_SCRATCH_SIZE", SQLITE_STATUS_SCRATCH_SIZE }, { "SQLITE_STATUS_PARSER_STACK", SQLITE_STATUS_PARSER_STACK }, }; Tcl_Obj *pResult; if( objc!=3 ){ Tcl_WrongNumArgs(interp, 1, objv, "PARAMETER RESETFLAG"); return TCL_ERROR; } zOpName = Tcl_GetString(objv[1]); for(i=0; i<ArraySize(aOp); i++){ if( strcmp(aOp[i].zName, zOpName)==0 ){ op = aOp[i].op; break; } } if( i>=ArraySize(aOp) ){ if( Tcl_GetIntFromObj(interp, objv[1], &op) ) return TCL_ERROR; } if( Tcl_GetBooleanFromObj(interp, objv[2], &resetFlag) ) return TCL_ERROR; iValue = 0; mxValue = 0; rc = sqlite3_status(op, &iValue, &mxValue, resetFlag); pResult = Tcl_NewObj(); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(rc)); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(iValue)); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(mxValue)); Tcl_SetObjResult(interp, pResult); return TCL_OK;}/*** Usage: sqlite3_db_status DATABASE OPCODE RESETFLAG**** Return a list of three elements which are the sqlite3_db_status() return** code, the current value, and the high-water mark value.*/static int test_db_status( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int rc, iValue, mxValue; int i, op, resetFlag; const char *zOpName; sqlite3 *db; int getDbPointer(Tcl_Interp*, const char*, sqlite3**); static const struct { const char *zName; int op; } aOp[] = { { "SQLITE_DBSTATUS_LOOKASIDE_USED", SQLITE_DBSTATUS_LOOKASIDE_USED }, }; Tcl_Obj *pResult; if( objc!=4 ){ Tcl_WrongNumArgs(interp, 1, objv, "PARAMETER RESETFLAG"); return TCL_ERROR; } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; zOpName = Tcl_GetString(objv[2]); for(i=0; i<ArraySize(aOp); i++){ if( strcmp(aOp[i].zName, zOpName)==0 ){ op = aOp[i].op; break; } } if( i>=ArraySize(aOp) ){ if( Tcl_GetIntFromObj(interp, objv[2], &op) ) return TCL_ERROR; } if( Tcl_GetBooleanFromObj(interp, objv[3], &resetFlag) ) return TCL_ERROR; iValue = 0; mxValue = 0; rc = sqlite3_db_status(db, op, &iValue, &mxValue, resetFlag); pResult = Tcl_NewObj(); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(rc)); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(iValue)); Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(mxValue)); Tcl_SetObjResult(interp, pResult); return TCL_OK;}/*** install_malloc_faultsim BOOLEAN*/static int test_install_malloc_faultsim( void * clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ int rc; int isInstall; if( objc!=2 ){ Tcl_WrongNumArgs(interp, 1, objv, "BOOLEAN"); return TCL_ERROR; } if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[1], &isInstall) ){ return TCL_ERROR; } rc = faultsimInstall(isInstall); Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); return TCL_OK;}/*** Register commands with the TCL interpreter.*/int Sqlitetest_malloc_Init(Tcl_Interp *interp){ static struct { char *zName; Tcl_ObjCmdProc *xProc; int clientData; } aObjCmd[] = { { "sqlite3_malloc", test_malloc ,0 }, { "sqlite3_realloc", test_realloc ,0 }, { "sqlite3_free", test_free ,0 }, { "memset", test_memset ,0 }, { "memget", test_memget ,0 }, { "sqlite3_memory_used", test_memory_used ,0 }, { "sqlite3_memory_highwater", test_memory_highwater ,0 }, { "sqlite3_memdebug_backtrace", test_memdebug_backtrace ,0 }, { "sqlite3_memdebug_dump", test_memdebug_dump ,0 }, { "sqlite3_memdebug_fail", test_memdebug_fail ,0 }, { "sqlite3_memdebug_pending", test_memdebug_pending ,0 }, { "sqlite3_memdebug_settitle", test_memdebug_settitle ,0 }, { "sqlite3_memdebug_malloc_count", test_memdebug_malloc_count ,0 }, { "sqlite3_memdebug_log", test_memdebug_log ,0 }, { "sqlite3_config_scratch", test_config_scratch ,0 }, { "sqlite3_config_pagecache", test_config_pagecache ,0 }, { "sqlite3_status", test_status ,0 }, { "sqlite3_db_status", test_db_status ,0 }, { "install_malloc_faultsim", test_install_malloc_faultsim ,0 }, { "sqlite3_config_heap", test_config_heap ,0 }, { "sqlite3_config_memstatus", test_config_memstatus ,0 }, { "sqlite3_config_chunkalloc", test_config_chunkalloc ,0 }, { "sqlite3_config_lookaside", test_config_lookaside ,0 }, { "sqlite3_config_error", test_config_error ,0 }, { "sqlite3_db_config_lookaside",test_db_config_lookaside ,0 }, { "sqlite3_dump_memsys3", test_dump_memsys3 ,3 }, { "sqlite3_dump_memsys5", test_dump_memsys3 ,5 } }; int i; for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ ClientData c = (ClientData)aObjCmd[i].clientData; Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, c, 0); } return TCL_OK;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -