OLD | NEW |
1 /* | 1 /* |
2 ** 2007 August 15 | 2 ** 2007 August 15 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 if( install ){ | 204 if( install ){ |
205 rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memfault.m); | 205 rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memfault.m); |
206 assert(memfault.m.xMalloc); | 206 assert(memfault.m.xMalloc); |
207 if( rc==SQLITE_OK ){ | 207 if( rc==SQLITE_OK ){ |
208 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &m); | 208 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &m); |
209 } | 209 } |
210 sqlite3_test_control(SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, | 210 sqlite3_test_control(SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, |
211 faultsimBeginBenign, faultsimEndBenign | 211 faultsimBeginBenign, faultsimEndBenign |
212 ); | 212 ); |
213 }else{ | 213 }else{ |
214 sqlite3_mem_methods m; | 214 sqlite3_mem_methods m2; |
215 assert(memfault.m.xMalloc); | 215 assert(memfault.m.xMalloc); |
216 | 216 |
217 /* One should be able to reset the default memory allocator by storing | 217 /* One should be able to reset the default memory allocator by storing |
218 ** a zeroed allocator then calling GETMALLOC. */ | 218 ** a zeroed allocator then calling GETMALLOC. */ |
219 memset(&m, 0, sizeof(m)); | 219 memset(&m2, 0, sizeof(m2)); |
220 sqlite3_config(SQLITE_CONFIG_MALLOC, &m); | 220 sqlite3_config(SQLITE_CONFIG_MALLOC, &m2); |
221 sqlite3_config(SQLITE_CONFIG_GETMALLOC, &m); | 221 sqlite3_config(SQLITE_CONFIG_GETMALLOC, &m2); |
222 assert( memcmp(&m, &memfault.m, sizeof(m))==0 ); | 222 assert( memcmp(&m2, &memfault.m, sizeof(m2))==0 ); |
223 | 223 |
224 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memfault.m); | 224 rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memfault.m); |
225 sqlite3_test_control(SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, 0, 0); | 225 sqlite3_test_control(SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, |
| 226 (void*)0, (void*)0); |
226 } | 227 } |
227 | 228 |
228 if( rc==SQLITE_OK ){ | 229 if( rc==SQLITE_OK ){ |
229 memfault.isInstalled = 1; | 230 memfault.isInstalled = 1; |
230 } | 231 } |
231 return rc; | 232 return rc; |
232 } | 233 } |
233 | 234 |
234 #ifdef SQLITE_TEST | 235 #ifdef SQLITE_TEST |
235 | 236 |
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 static char *buf = 0; | 904 static char *buf = 0; |
904 if( objc!=3 ){ | 905 if( objc!=3 ){ |
905 Tcl_WrongNumArgs(interp, 1, objv, "SIZE N"); | 906 Tcl_WrongNumArgs(interp, 1, objv, "SIZE N"); |
906 return TCL_ERROR; | 907 return TCL_ERROR; |
907 } | 908 } |
908 if( Tcl_GetIntFromObj(interp, objv[1], &sz) ) return TCL_ERROR; | 909 if( Tcl_GetIntFromObj(interp, objv[1], &sz) ) return TCL_ERROR; |
909 if( Tcl_GetIntFromObj(interp, objv[2], &N) ) return TCL_ERROR; | 910 if( Tcl_GetIntFromObj(interp, objv[2], &N) ) return TCL_ERROR; |
910 free(buf); | 911 free(buf); |
911 if( sz<0 ){ | 912 if( sz<0 ){ |
912 buf = 0; | 913 buf = 0; |
913 rc = sqlite3_config(SQLITE_CONFIG_SCRATCH, 0, 0, 0); | 914 rc = sqlite3_config(SQLITE_CONFIG_SCRATCH, (void*)0, 0, 0); |
914 }else{ | 915 }else{ |
915 buf = malloc( sz*N + 1 ); | 916 buf = malloc( sz*N + 1 ); |
916 rc = sqlite3_config(SQLITE_CONFIG_SCRATCH, buf, sz, N); | 917 rc = sqlite3_config(SQLITE_CONFIG_SCRATCH, buf, sz, N); |
917 } | 918 } |
918 pResult = Tcl_NewObj(); | 919 pResult = Tcl_NewObj(); |
919 Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(rc)); | 920 Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(rc)); |
920 Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(N)); | 921 Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(N)); |
921 Tcl_SetObjResult(interp, pResult); | 922 Tcl_SetObjResult(interp, pResult); |
922 return TCL_OK; | 923 return TCL_OK; |
923 } | 924 } |
924 | 925 |
925 /* | 926 /* |
926 ** Usage: sqlite3_config_pagecache SIZE N | 927 ** Usage: sqlite3_config_pagecache SIZE N |
927 ** | 928 ** |
928 ** Set the page-cache memory buffer using SQLITE_CONFIG_PAGECACHE. | 929 ** Set the page-cache memory buffer using SQLITE_CONFIG_PAGECACHE. |
929 ** The buffer is static and is of limited size. N might be | 930 ** The buffer is static and is of limited size. N might be |
930 ** adjusted downward as needed to accommodate the requested size. | 931 ** adjusted downward as needed to accommodate the requested size. |
931 ** The revised value of N is returned. | 932 ** The revised value of N is returned. |
932 ** | 933 ** |
933 ** A negative SIZE causes the buffer pointer to be NULL. | 934 ** A negative SIZE causes the buffer pointer to be NULL. |
934 */ | 935 */ |
935 static int test_config_pagecache( | 936 static int test_config_pagecache( |
936 void * clientData, | 937 void * clientData, |
937 Tcl_Interp *interp, | 938 Tcl_Interp *interp, |
938 int objc, | 939 int objc, |
939 Tcl_Obj *CONST objv[] | 940 Tcl_Obj *CONST objv[] |
940 ){ | 941 ){ |
941 int sz, N, rc; | 942 int sz, N; |
942 Tcl_Obj *pResult; | 943 Tcl_Obj *pRes; |
943 static char *buf = 0; | 944 static char *buf = 0; |
944 if( objc!=3 ){ | 945 if( objc!=3 ){ |
945 Tcl_WrongNumArgs(interp, 1, objv, "SIZE N"); | 946 Tcl_WrongNumArgs(interp, 1, objv, "SIZE N"); |
946 return TCL_ERROR; | 947 return TCL_ERROR; |
947 } | 948 } |
948 if( Tcl_GetIntFromObj(interp, objv[1], &sz) ) return TCL_ERROR; | 949 if( Tcl_GetIntFromObj(interp, objv[1], &sz) ) return TCL_ERROR; |
949 if( Tcl_GetIntFromObj(interp, objv[2], &N) ) return TCL_ERROR; | 950 if( Tcl_GetIntFromObj(interp, objv[2], &N) ) return TCL_ERROR; |
950 free(buf); | 951 free(buf); |
| 952 buf = 0; |
| 953 |
| 954 /* Set the return value */ |
| 955 pRes = Tcl_NewObj(); |
| 956 Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(sqlite3GlobalConfig.szPage)); |
| 957 Tcl_ListObjAppendElement(0, pRes, Tcl_NewIntObj(sqlite3GlobalConfig.nPage)); |
| 958 Tcl_SetObjResult(interp, pRes); |
| 959 |
951 if( sz<0 ){ | 960 if( sz<0 ){ |
952 buf = 0; | 961 sqlite3_config(SQLITE_CONFIG_PAGECACHE, (void*)0, 0, 0); |
953 rc = sqlite3_config(SQLITE_CONFIG_PAGECACHE, 0, 0, 0); | |
954 }else{ | 962 }else{ |
955 buf = malloc( sz*N ); | 963 buf = malloc( sz*N ); |
956 rc = sqlite3_config(SQLITE_CONFIG_PAGECACHE, buf, sz, N); | 964 sqlite3_config(SQLITE_CONFIG_PAGECACHE, buf, sz, N); |
957 } | 965 } |
958 pResult = Tcl_NewObj(); | |
959 Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(rc)); | |
960 Tcl_ListObjAppendElement(0, pResult, Tcl_NewIntObj(N)); | |
961 Tcl_SetObjResult(interp, pResult); | |
962 return TCL_OK; | 966 return TCL_OK; |
963 } | 967 } |
964 | 968 |
965 /* | 969 /* |
966 ** Usage: sqlite3_config_alt_pcache INSTALL_FLAG DISCARD_CHANCE PRNG_SEED | 970 ** Usage: sqlite3_config_alt_pcache INSTALL_FLAG DISCARD_CHANCE PRNG_SEED |
967 ** | 971 ** |
968 ** Set up the alternative test page cache. Install if INSTALL_FLAG is | 972 ** Set up the alternative test page cache. Install if INSTALL_FLAG is |
969 ** true and uninstall (reverting to the default page cache) if INSTALL_FLAG | 973 ** true and uninstall (reverting to the default page cache) if INSTALL_FLAG |
970 ** is false. DISCARD_CHANGE is an integer between 0 and 100 inclusive | 974 ** is false. DISCARD_CHANGE is an integer between 0 and 100 inclusive |
971 ** which determines the chance of discarding a page when unpinned. 100 | 975 ** which determines the chance of discarding a page when unpinned. 100 |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 if( Tcl_GetBooleanFromObj(interp, objv[1], &bUseCis) ){ | 1257 if( Tcl_GetBooleanFromObj(interp, objv[1], &bUseCis) ){ |
1254 return TCL_ERROR; | 1258 return TCL_ERROR; |
1255 } | 1259 } |
1256 | 1260 |
1257 rc = sqlite3_config(SQLITE_CONFIG_COVERING_INDEX_SCAN, bUseCis); | 1261 rc = sqlite3_config(SQLITE_CONFIG_COVERING_INDEX_SCAN, bUseCis); |
1258 Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_VOLATILE); | 1262 Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_VOLATILE); |
1259 | 1263 |
1260 return TCL_OK; | 1264 return TCL_OK; |
1261 } | 1265 } |
1262 | 1266 |
| 1267 /* |
| 1268 ** Usage: sqlite3_config_pmasz INTEGER |
| 1269 ** |
| 1270 ** Set the minimum PMA size. |
| 1271 */ |
| 1272 static int test_config_pmasz( |
| 1273 void * clientData, |
| 1274 Tcl_Interp *interp, |
| 1275 int objc, |
| 1276 Tcl_Obj *CONST objv[] |
| 1277 ){ |
| 1278 int rc; |
| 1279 int iPmaSz; |
| 1280 |
| 1281 if( objc!=2 ){ |
| 1282 Tcl_WrongNumArgs(interp, 1, objv, "BOOL"); |
| 1283 return TCL_ERROR; |
| 1284 } |
| 1285 if( Tcl_GetIntFromObj(interp, objv[1], &iPmaSz) ){ |
| 1286 return TCL_ERROR; |
| 1287 } |
| 1288 |
| 1289 rc = sqlite3_config(SQLITE_CONFIG_PMASZ, iPmaSz); |
| 1290 Tcl_SetResult(interp, (char *)sqlite3ErrName(rc), TCL_VOLATILE); |
| 1291 |
| 1292 return TCL_OK; |
| 1293 } |
| 1294 |
1263 | 1295 |
1264 /* | 1296 /* |
1265 ** Usage: sqlite3_dump_memsys3 FILENAME | 1297 ** Usage: sqlite3_dump_memsys3 FILENAME |
1266 ** sqlite3_dump_memsys5 FILENAME | 1298 ** sqlite3_dump_memsys5 FILENAME |
1267 ** | 1299 ** |
1268 ** Write a summary of unfreed memsys3 allocations to FILENAME. | 1300 ** Write a summary of unfreed memsys3 allocations to FILENAME. |
1269 */ | 1301 */ |
1270 static int test_dump_memsys3( | 1302 static int test_dump_memsys3( |
1271 void * clientData, | 1303 void * clientData, |
1272 Tcl_Interp *interp, | 1304 Tcl_Interp *interp, |
(...skipping 30 matching lines...) Expand all Loading... |
1303 ** Return a list of three elements which are the sqlite3_status() return | 1335 ** Return a list of three elements which are the sqlite3_status() return |
1304 ** code, the current value, and the high-water mark value. | 1336 ** code, the current value, and the high-water mark value. |
1305 */ | 1337 */ |
1306 static int test_status( | 1338 static int test_status( |
1307 void * clientData, | 1339 void * clientData, |
1308 Tcl_Interp *interp, | 1340 Tcl_Interp *interp, |
1309 int objc, | 1341 int objc, |
1310 Tcl_Obj *CONST objv[] | 1342 Tcl_Obj *CONST objv[] |
1311 ){ | 1343 ){ |
1312 int rc, iValue, mxValue; | 1344 int rc, iValue, mxValue; |
1313 int i, op, resetFlag; | 1345 int i, op = 0, resetFlag; |
1314 const char *zOpName; | 1346 const char *zOpName; |
1315 static const struct { | 1347 static const struct { |
1316 const char *zName; | 1348 const char *zName; |
1317 int op; | 1349 int op; |
1318 } aOp[] = { | 1350 } aOp[] = { |
1319 { "SQLITE_STATUS_MEMORY_USED", SQLITE_STATUS_MEMORY_USED }, | 1351 { "SQLITE_STATUS_MEMORY_USED", SQLITE_STATUS_MEMORY_USED }, |
1320 { "SQLITE_STATUS_MALLOC_SIZE", SQLITE_STATUS_MALLOC_SIZE }, | 1352 { "SQLITE_STATUS_MALLOC_SIZE", SQLITE_STATUS_MALLOC_SIZE }, |
1321 { "SQLITE_STATUS_PAGECACHE_USED", SQLITE_STATUS_PAGECACHE_USED }, | 1353 { "SQLITE_STATUS_PAGECACHE_USED", SQLITE_STATUS_PAGECACHE_USED }, |
1322 { "SQLITE_STATUS_PAGECACHE_OVERFLOW", SQLITE_STATUS_PAGECACHE_OVERFLOW }, | 1354 { "SQLITE_STATUS_PAGECACHE_OVERFLOW", SQLITE_STATUS_PAGECACHE_OVERFLOW }, |
1323 { "SQLITE_STATUS_PAGECACHE_SIZE", SQLITE_STATUS_PAGECACHE_SIZE }, | 1355 { "SQLITE_STATUS_PAGECACHE_SIZE", SQLITE_STATUS_PAGECACHE_SIZE }, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 ** Return a list of three elements which are the sqlite3_db_status() return | 1392 ** Return a list of three elements which are the sqlite3_db_status() return |
1361 ** code, the current value, and the high-water mark value. | 1393 ** code, the current value, and the high-water mark value. |
1362 */ | 1394 */ |
1363 static int test_db_status( | 1395 static int test_db_status( |
1364 void * clientData, | 1396 void * clientData, |
1365 Tcl_Interp *interp, | 1397 Tcl_Interp *interp, |
1366 int objc, | 1398 int objc, |
1367 Tcl_Obj *CONST objv[] | 1399 Tcl_Obj *CONST objv[] |
1368 ){ | 1400 ){ |
1369 int rc, iValue, mxValue; | 1401 int rc, iValue, mxValue; |
1370 int i, op, resetFlag; | 1402 int i, op = 0, resetFlag; |
1371 const char *zOpName; | 1403 const char *zOpName; |
1372 sqlite3 *db; | 1404 sqlite3 *db; |
1373 extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); | 1405 extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); |
1374 static const struct { | 1406 static const struct { |
1375 const char *zName; | 1407 const char *zName; |
1376 int op; | 1408 int op; |
1377 } aOp[] = { | 1409 } aOp[] = { |
1378 { "LOOKASIDE_USED", SQLITE_DBSTATUS_LOOKASIDE_USED }, | 1410 { "LOOKASIDE_USED", SQLITE_DBSTATUS_LOOKASIDE_USED }, |
1379 { "CACHE_USED", SQLITE_DBSTATUS_CACHE_USED }, | 1411 { "CACHE_USED", SQLITE_DBSTATUS_CACHE_USED }, |
1380 { "SCHEMA_USED", SQLITE_DBSTATUS_SCHEMA_USED }, | 1412 { "SCHEMA_USED", SQLITE_DBSTATUS_SCHEMA_USED }, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1507 { "sqlite3_status", test_status ,0 }, | 1539 { "sqlite3_status", test_status ,0 }, |
1508 { "sqlite3_db_status", test_db_status ,0 }, | 1540 { "sqlite3_db_status", test_db_status ,0 }, |
1509 { "install_malloc_faultsim", test_install_malloc_faultsim ,0 }, | 1541 { "install_malloc_faultsim", test_install_malloc_faultsim ,0 }, |
1510 { "sqlite3_config_heap", test_config_heap ,0 }, | 1542 { "sqlite3_config_heap", test_config_heap ,0 }, |
1511 { "sqlite3_config_heap_size", test_config_heap_size ,0 }, | 1543 { "sqlite3_config_heap_size", test_config_heap_size ,0 }, |
1512 { "sqlite3_config_memstatus", test_config_memstatus ,0 }, | 1544 { "sqlite3_config_memstatus", test_config_memstatus ,0 }, |
1513 { "sqlite3_config_lookaside", test_config_lookaside ,0 }, | 1545 { "sqlite3_config_lookaside", test_config_lookaside ,0 }, |
1514 { "sqlite3_config_error", test_config_error ,0 }, | 1546 { "sqlite3_config_error", test_config_error ,0 }, |
1515 { "sqlite3_config_uri", test_config_uri ,0 }, | 1547 { "sqlite3_config_uri", test_config_uri ,0 }, |
1516 { "sqlite3_config_cis", test_config_cis ,0 }, | 1548 { "sqlite3_config_cis", test_config_cis ,0 }, |
| 1549 { "sqlite3_config_pmasz", test_config_pmasz ,0 }, |
1517 { "sqlite3_db_config_lookaside",test_db_config_lookaside ,0 }, | 1550 { "sqlite3_db_config_lookaside",test_db_config_lookaside ,0 }, |
1518 { "sqlite3_dump_memsys3", test_dump_memsys3 ,3 }, | 1551 { "sqlite3_dump_memsys3", test_dump_memsys3 ,3 }, |
1519 { "sqlite3_dump_memsys5", test_dump_memsys3 ,5 }, | 1552 { "sqlite3_dump_memsys5", test_dump_memsys3 ,5 }, |
1520 { "sqlite3_install_memsys3", test_install_memsys3 ,0 }, | 1553 { "sqlite3_install_memsys3", test_install_memsys3 ,0 }, |
1521 { "sqlite3_memdebug_vfs_oom_test", test_vfs_oom_test ,0 }, | 1554 { "sqlite3_memdebug_vfs_oom_test", test_vfs_oom_test ,0 }, |
1522 }; | 1555 }; |
1523 int i; | 1556 int i; |
1524 for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ | 1557 for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ |
1525 ClientData c = (ClientData)SQLITE_INT_TO_PTR(aObjCmd[i].clientData); | 1558 ClientData c = (ClientData)SQLITE_INT_TO_PTR(aObjCmd[i].clientData); |
1526 Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, c, 0); | 1559 Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, c, 0); |
1527 } | 1560 } |
1528 return TCL_OK; | 1561 return TCL_OK; |
1529 } | 1562 } |
1530 #endif | 1563 #endif |
OLD | NEW |