From 9fc7702c4fbdfc2f29df49a78bd98da7a9e499dc Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 1 Sep 2010 16:19:57 +0000 Subject: [PATCH] Call quota callback destructors from within sqlite3_quota_shutdown(). FossilOrigin-Name: fb80c6f3de73ed832faaeb8c4d83e1354f132b39 --- manifest | 26 +++++--------- manifest.uuid | 2 +- src/test_quota.c | 20 +++++++---- test/quota.test | 88 +++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 96 insertions(+), 40 deletions(-) diff --git a/manifest b/manifest index 59b3554eaf..52c90fb969 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,5 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -C Boundary\svalue\sfix\sto\sthe\sdescriptive\scomment\sat\sthe\stop\sof\stest_quota.c. -D 2010-09-01T15:26:18 +C Call\squota\scallback\sdestructors\sfrom\swithin\ssqlite3_quota_shutdown(). +D 2010-09-01T16:19:57 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in c599a15d268b1db2aeadea19df2adc3bf2eb6bee F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -211,7 +208,7 @@ F src/test_mutex.c ce06b59aca168cd8c520b77159a24352a7469bd3 F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec F src/test_osinst.c f408c6a181f2fb04c56273afd5c3e1e82f60392c F src/test_pcache.c 7bf828972ac0d2403f5cfa4cd14da41f8ebe73d8 -F src/test_quota.c 4b0c51fc8492e3879103cbed781e5c7822fa33f1 +F src/test_quota.c 6afa78d864509f490ffffd997761ebb2890478d0 F src/test_rtree.c e957a603a98871dcf005c1e96ae791cfe74eb7f6 F src/test_schema.c 8c06ef9ddb240c7a0fcd31bc221a6a2aade58bf0 F src/test_server.c bbba05c144b5fc4b52ff650a4328027b3fa5fcc6 @@ -565,7 +562,7 @@ F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301 F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 -F test/quota.test d406716c5e91df17ef7821facae6a9aefaa4dd91 +F test/quota.test f4028117363a4a42d5b45fc8f6f5ba34556062d4 F test/quote.test 215897dbe8de1a6f701265836d6601cc6ed103e6 F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 F test/randexpr1.test 1084050991e9ba22c1c10edd8d84673b501cc25a @@ -856,14 +853,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 2e1a02026a0635fe05ba55a6d4d36dd7fd0ae8e9 -R 9727013208f74b5846192ddd802d89a5 -U drh -Z ca12cd7daf2cb402fea27724b9ab87c5 ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) - -iD8DBQFMfnCdoxKgR168RlERAp/3AJ9sMV19uGCPmQnx/xpMir6Lynzx9wCdGQfk -0rZF++wLzBd8e8l03xX/LSg= -=CiYA ------END PGP SIGNATURE----- +P 7f6072f0827e3aafd17f5f2bac9e3a3f8482e5f6 +R 683c19de50a702003d36bb4bcbf13d6b +U dan +Z a5272a839c843ec4c6d420e66112a9e4 diff --git a/manifest.uuid b/manifest.uuid index 84636e20cb..59d5e2a670 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f6072f0827e3aafd17f5f2bac9e3a3f8482e5f6 \ No newline at end of file +fb80c6f3de73ed832faaeb8c4d83e1354f132b39 \ No newline at end of file diff --git a/src/test_quota.c b/src/test_quota.c index b8b8ff6b02..4d576f160e 100644 --- a/src/test_quota.c +++ b/src/test_quota.c @@ -156,8 +156,8 @@ static void quotaLeave(void){ sqlite3_mutex_leave(gQuota.pMutex); } */ static void quotaGroupDeref(quotaGroup *pGroup){ if( pGroup->pFiles==0 && pGroup->iLimit==0 ){ + *pGroup->ppPrev = pGroup->pNext; if( pGroup->pNext ) pGroup->pNext->ppPrev = pGroup->ppPrev; - if( pGroup->ppPrev ) *pGroup->ppPrev = pGroup->pNext; if( pGroup->xDestroy ) pGroup->xDestroy(pGroup->pArg); sqlite3_free(pGroup); } @@ -615,7 +615,8 @@ int sqlite3_quota_shutdown(void){ while( gQuota.pGroup ){ pGroup = gQuota.pGroup; gQuota.pGroup = pGroup->pNext; - sqlite3_free(pGroup); + pGroup->iLimit = 0; + quotaGroupDeref(pGroup); } gQuota.isInitialized = 0; sqlite3_mutex_free(gQuota.pMutex); @@ -759,7 +760,7 @@ static void tclCallbackDestructor(void *pObj){ TclQuotaCallback *p = (TclQuotaCallback*)pObj; if( p ){ Tcl_DecrRefCount(p->pScript); - ckfree((char *)p); + sqlite3_free((char *)p); } } @@ -830,6 +831,7 @@ static int test_quota_set( int rc; /* Value returned by quota_set() */ TclQuotaCallback *p; /* Callback object */ int nScript; /* Length of callback script */ + void (*xDestroy)(void*); /* Optional destructor for pArg */ /* Process arguments */ if( objc!=4 ){ @@ -843,17 +845,23 @@ static int test_quota_set( if( nScript>0 ){ /* Allocate a TclQuotaCallback object */ - p = (TclQuotaCallback *)ckalloc(sizeof(TclQuotaCallback)); + p = (TclQuotaCallback *)sqlite3_malloc(sizeof(TclQuotaCallback)); + if( !p ){ + Tcl_SetResult(interp, (char *)"SQLITE_NOMEM", TCL_STATIC); + return TCL_OK; + } memset(p, 0, sizeof(TclQuotaCallback)); p->interp = interp; Tcl_IncrRefCount(pScript); p->pScript = pScript; + xDestroy = tclCallbackDestructor; }else{ p = 0; + xDestroy = 0; } + /* Invoke sqlite3_quota_set() */ - rc = sqlite3_quota_set(zPattern, iLimit, tclQuotaCallback, - (void*)p, tclCallbackDestructor); + rc = sqlite3_quota_set(zPattern, iLimit, tclQuotaCallback, (void*)p,xDestroy); Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_STATIC); return TCL_OK; diff --git a/test/quota.test b/test/quota.test index 9dca2d7204..9c138e6c86 100644 --- a/test/quota.test +++ b/test/quota.test @@ -121,7 +121,6 @@ do_test quota-3.1.1 { sqlite3_quota_initialize "" 1 sqlite3_quota_set *test.db 4096 quota_check } {SQLITE_OK} - do_test quota-3.1.2 { sqlite3 db test.db execsql { @@ -139,7 +138,13 @@ do_test quota-3.1.3 { execsql { CREATE TABLE t2(a, b) } db2 set ::quota } {} -puts "quotas: [sqlite3_quota_dump]" +do_test quota-3.1.4 { + catchsql { CREATE TABLE t3(a, b) } +} {1 {database or disk is full}} +do_test quota-3.1.5 { + set ::quota_request_ok 1 + execsql { CREATE TABLE t3(a, b) } +} {} do_test quota-3.X { catch { db close } @@ -160,55 +165,108 @@ proc quota_list {} { return [lsort $allq] } -do_test quota-4.1 { +do_test quota-4.1.1 { sqlite3_quota_set *test.db 0 {} quota_list } {} -do_test quota-4.2 { +do_test quota-4.1.2 { sqlite3_quota_set *test.db 4096 {} quota_list } {*test.db} -do_test quota-4.3 { +do_test quota-4.1.3 { sqlite3_quota_set *test2.db 0 {} quota_list } {*test.db} -do_test quota-4.4 { +do_test quota-4.1.4 { sqlite3_quota_set *test2.db 100000 {} quota_list } {*test.db *test2.db} -do_test quota-4.5 { +do_test quota-4.1.5 { sqlite3_quota_set *test.db 0 {} quota_list } {*test2.db} -do_test quota-4.6 { +do_test quota-4.1.6 { file delete -force test2.db test2.db-journal test2.db-wal sqlite3 db test2.db db eval {CREATE TABLE t2(x); INSERT INTO t2 VALUES('tab-t2');} quota_list } {*test2.db} -do_test quota-4.7 { +do_test quota-4.1.7 { catchsql {INSERT INTO t2 VALUES(zeroblob(200000))} } {1 {database or disk is full}} -do_test quota-4.8 { +do_test quota-4.1.8 { sqlite3 db2 test2.db db2 eval {SELECT * FROM t2} } {tab-t2} -do_test quota-4.9 { +do_test quota-4.1.9 { sqlite3_quota_set *test2.db 0 {} catchsql {INSERT INTO t2 VALUES(zeroblob(200000))} } {0 {}} -do_test quota-4.10 { +do_test quota-4.1.10 { quota_list } {*test2.db} -do_test quota-4.11 { +do_test quota-4.1.11 { db2 close quota_list } {*test2.db} -do_test quota-4.12 { +do_test quota-4.1.12 { + db close + quota_list +} {} + +do_test quota-4.2.1 { + sqlite3_quota_set A 1000 {} + sqlite3_quota_set B 1000 {} + sqlite3_quota_set C 1000 {} + sqlite3_quota_set D 1000 {} + quota_list +} {A B C D} +do_test quota-4.2.2 { + sqlite3_quota_set C 0 {} + sqlite3_quota_set B 0 {} + quota_list +} {A D} +do_test quota-4.2.3 { + sqlite3_quota_set A 0 {} + sqlite3_quota_set D 0 {} + quota_list +} {} +do_test quota-4.2.4 { + sqlite3_quota_set A 1000 {} + sqlite3_quota_set B 1000 {} + sqlite3_quota_set C 1000 {} + sqlite3_quota_set A 0 {} + sqlite3_quota_set B 0 {} + sqlite3_quota_set C 0 {} + quota_list +} {} +do_test quota-4.2.5 { + sqlite3_quota_set A 1000 {} + sqlite3_quota_set B 1000 {} + sqlite3_quota_set C 1000 {} + sqlite3_quota_set C 0 {} + sqlite3_quota_set B 0 {} + sqlite3_quota_set A 0 {} + quota_list +} {} + +do_test quota-4.3.1 { + sqlite3_quota_set A 1000 quota_callback + sqlite3 db A + sqlite3_quota_set A 0 quota_callback db close quota_list } {} +do_test quota-4.4.1 { + sqlite3_quota_set A 1000 quota_callback + sqlite3_quota_shutdown +} {SQLITE_OK} +do_test quota-4.4.2 { + quota_list +} {} + + -sqlite3_quota_shutdown +catch { sqlite3_quota_shutdown } finish_test -- 2.47.2