diff --git a/manifest b/manifest index e9f99ee1f5..34b816b3b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sin\sflattenSubquery().\s(CVS\s5388) -D 2008-07-10T17:59:12 +C Enhancements\sto\sthe\stesting\slogic\sfor\smalloc\sand\smutex.\s\sOnly\spermit\sone\nof\sMEMSYS3/5\sto\sbe\scompiled-in\sat\sa\stime.\s\sOmit\sthe\sSQLITE_CONFIG_MEMSYS3/5\nconfiguration\soptions.\s(CVS\s5389) +D 2008-07-10T18:13:42 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in a03f7cb4f7ad50bc53a788c6c544430e81f95de4 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -114,11 +114,11 @@ F src/insert.c e8efc17d037346e4a4a6949e72aab850befe3d5d F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e F src/legacy.c 3626c71fb70912abec9a4312beba753a9ce800df F src/loadext.c ae0eed9fa96d74172d2a90ee63b5bc36d284295c -F src/main.c 85517c4d61ed24f2d0230335aedd6270a69f59dd +F src/main.c ff7d9e39d014cc36246c334f6076e44e20db45ca F src/malloc.c 226a532e9e371d1bb3de2553bdd1f9b600ef099c F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a F src/mem1.c 8340fa5f969e9f9b9bdeb54106457a2003456d2b -F src/mem2.c 23f9538f35fbcd5665afe7056a56be0c7ed65aa7 +F src/mem2.c 0fc5bd6581c80f3ebd9d0cdf0f3f9c08826397ba F src/mem3.c abaf65e3fa911b8acdbb67a50a54ec149af55736 F src/mem4.c 6703adb1717b26d9d70a1c2586b4b7b7ffee7909 F src/mem5.c 6c711af220f2c1566724dc439a34a98f94ab01a0 @@ -142,7 +142,7 @@ F src/printf.c 8e5d410220cf8650f502caf71f0de979a3f9031e F src/random.c 5c754319d38abdd6acd74601ee0105504adc508a F src/select.c fcf51df1818a448edebf55b032d89771ba4536ef F src/shell.c 484e7297e066f22830f9c15d7abbcdd2acb097b0 -F src/sqlite.h.in 2fcdb1c1ee337d8371eb43a0c29294562b76ee23 +F src/sqlite.h.in 8d25645bc8aee60e3089d05f3dbb8f66d1af0cd5 F src/sqlite3ext.h 1e3887c9bd3ae66cb599e922824b04cd0d0f2c3e F src/sqliteInt.h ca0dc923bcc51bef0064f34628bd6daeb0d68d38 F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8 @@ -166,9 +166,9 @@ F src/test_devsym.c 6012cb8e3acf812513511025a4fa5d626e0ba19b F src/test_func.c ade4f0117cc96c5a05682e1ef38b84320a866ad9 F src/test_hexio.c 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f F src/test_loadext.c df8ab3a6481ddebbdf0d28ebac5d9e0790f7860f -F src/test_malloc.c e9e1500f85c50964adc34892045410c08aaf67ff +F src/test_malloc.c 4f07302a0077f2c1730baa7aeb359e4f51960aa7 F src/test_md5.c 28209a4e2068711b5443c33104fe41f21d160071 -F src/test_mutex.c 195d88dfc206d98ef6af3700c294c66a822e6378 +F src/test_mutex.c 893cdb8a1d8015e0103c0fa48e2aaca2d40d4dc7 F src/test_onefile.c 243157b10275251c5dc2d6619aee2ff9ae22379c F src/test_osinst.c 867f1317bd135f942a63eab5a78da40fc70d1493 F src/test_schema.c 4b4bf7bb329326458c491b0e6facd4c8c4c5b479 @@ -403,6 +403,7 @@ F test/manydb.test 8de36b8d33aab5ef295b11d9e95310aeded31af8 F test/memdb.test a67bda4ff90a38f2b19f6c7f95aa7289e051d893 F test/memleak.test d2d2a1ff7105d32dc3fdf691458cf6cba58c7217 F test/memsubsys1.test 209156a07aaf99d095ef2e3a3a0acd5d55c978f6 +F test/memsubsys2.test c05b541f9c2a1234a9dc2ff2233b3a9544fa5139 F test/minmax.test 722d80816f7e096bf2c04f4111f1a6c1ba65453d F test/minmax2.test 33504c01a03bd99226144e4b03f7631a274d66e0 F test/minmax3.test 05110398e065875b3d9315892889d3c87fccfe2b @@ -415,7 +416,7 @@ F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 F test/misc7.test 68198e6a699f0e8e8e7641d597a9e77c87c961d6 F test/misuse.test 30b3a458e5a70c31e74c291937b6c82204c59f33 F test/mutex1.test b0017a45203e92ddab9e27cc3d6bd5c8637925ac -F test/mutex2.test a006d753714ea7e00b90b6f9c061bdde5be16435 +F test/mutex2.test 64a627f58c95bce467f4bce41e788b64268e3309 F test/nan.test 14c41572ff52dbc740b1c3303dd313a90dc6084c F test/notnull.test 44d600f916b770def8b095a9962dbe3be5a70d82 F test/null.test a8b09b8ed87852742343b33441a9240022108993 @@ -425,7 +426,7 @@ F test/pager2.test c025f91b75fe65e85febda64d9416428b8a5cab5 F test/pager3.test 2323bf27fd5bd887b580247e5bce500ceee994b4 F test/pageropt.test 6df72c441db0a037b7ec6990d16311c24fbea77b F test/pagesize.test e0a8b3fe80f8b8e808d94a00734c7a18c76c407e -F test/permutations.test 1a2047d4cded4f9c0a81fd16aa5ee47f9c3928de +F test/permutations.test bf962d39b77fd87555455d16bb1208d32a732c6d F test/pragma.test e1984ed47f699a4a817008dab4111be31ee8b935 F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47 F test/printf.test 262a5acd3158f788e9bdf7f18d718f3af32ff6ef @@ -600,7 +601,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 7e58b78712420b3bd4320192a58d89eb71eecc9c -R 0939dee77d063e7cffac53f1e1ad55a1 -U danielk1977 -Z a0db231c1a42fdb08eeec046ea7b2e61 +P 9c8b97ef593c17740640a01a7338164d7fbe070e +R 2fd49240ed9bef71f7d65c695010f7c4 +U drh +Z ab81163c7db604825f9001df3cff3c52 diff --git a/manifest.uuid b/manifest.uuid index 4293c1cce5..d6c4c3a923 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9c8b97ef593c17740640a01a7338164d7fbe070e \ No newline at end of file +ed8b2525006ae7f8cacd01b291760513fdbdff57 \ No newline at end of file diff --git a/src/main.c b/src/main.c index e8c47ac56a..479ed61049 100644 --- a/src/main.c +++ b/src/main.c @@ -14,7 +14,7 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.474 2008/07/10 17:52:49 danielk1977 Exp $ +** $Id: main.c,v 1.475 2008/07/10 18:13:42 drh Exp $ */ #include "sqliteInt.h" #include @@ -228,26 +228,31 @@ int sqlite3_config(int op, ...){ sqlite3Config.nHeap = va_arg(ap, int); sqlite3Config.mnReq = va_arg(ap, int); - /* Fall through to install the mem5.c/mem3.c methods. If neither - ** ENABLE_MEMSYS3 nor ENABLE_MEMSYS5 is defined, fall through to - ** the default case and return an error. - */ - } - -#ifdef SQLITE_ENABLE_MEMSYS5 - case SQLITE_CONFIG_MEMSYS5: { - sqlite3_mem_methods *p = sqlite3MemGetMemsys5(); - sqlite3Config.m = *p; - break; - } -#endif + if( sqlite3Config.pHeap==0 ){ + /* If the heap pointer is NULL, then restore the malloc implementation + ** back to NULL pointers too. This will cause the malloc to go + ** back to its default implementation when sqlite3_initialize() is + ** run. + */ + memset(&sqlite3Config.m, 0, sizeof(sqlite3Config.m)); + }else{ + /* The heap pointer is not NULL, then install one of the + ** mem5.c/mem3.c methods. If neither ENABLE_MEMSYS3 nor + ** ENABLE_MEMSYS5 is defined, return an error. + ** the default case and return an error. + */ #ifdef SQLITE_ENABLE_MEMSYS3 - case SQLITE_CONFIG_MEMSYS3: { - sqlite3_mem_methods *p = sqlite3MemGetMemsys3(); - sqlite3Config.m = *p; + sqlite3Config.m = sqlite3MemGetMemsys3(); +#endif +#ifdef SQLITE_ENABLE_MEMSYS5 + sqlite3Config.m = sqlite3MemGetMemsys5(); +#endif +#if !defined(SQLITE_ENABLE_MEMSYS3) && !defined(SQLITE_ENABLE_MEMSYS5) + rc = SQLITE_ERROR; +#endif + } break; } -#endif default: { rc = SQLITE_ERROR; diff --git a/src/mem2.c b/src/mem2.c index 304c9fbb0f..5e9a999b7e 100644 --- a/src/mem2.c +++ b/src/mem2.c @@ -19,7 +19,7 @@ ** This file contains implementations of the low-level memory allocation ** routines specified in the sqlite3_mem_methods object. ** -** $Id: mem2.c,v 1.33 2008/06/19 01:03:18 drh Exp $ +** $Id: mem2.c,v 1.34 2008/07/10 18:13:42 drh Exp $ */ #include "sqliteInt.h" @@ -174,7 +174,6 @@ static int sqlite3MemInit(void *NotUsed){ ** Deinitialize the memory allocation subsystem. */ static void sqlite3MemShutdown(void *NotUsed){ - sqlite3_mutex_free(mem.mutex); mem.mutex = 0; } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index ab433fdf05..7bfcd7d503 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -30,7 +30,7 @@ ** the version number) and changes its name to "sqlite3.h" as ** part of the build process. ** -** @(#) $Id: sqlite.h.in,v 1.366 2008/07/10 17:52:49 danielk1977 Exp $ +** @(#) $Id: sqlite.h.in,v 1.367 2008/07/10 18:13:42 drh Exp $ */ #ifndef _SQLITE3_H_ #define _SQLITE3_H_ @@ -1107,12 +1107,13 @@ struct sqlite3_mem_methods { ** for all of its dynamic memory allocation needs beyond those provided ** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. ** There are three arguments: A pointer to the memory, the number of -** bytes in the memory buffer, and the minimum allocation size. When -** this configuration option is used, SQLite never calls the system -** malloc() implementation but instead uses the supplied memory buffer -** to satisfy all [sqlite3_malloc()] requests. This option is only -** available if either or both of SQLITE_ENABLE_MEMSYS3 and -** SQLITE_ENABLE_MEMSYS5 are defined during compilation. +** bytes in the memory buffer, and the minimum allocation size. If +** the first pointer (the memory pointer) is NULL, then SQLite reverts +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. If the +** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or +** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. ** **
SQLITE_CONFIG_MUTEX
**
This option takes a single argument which is a pointer to an @@ -1128,23 +1129,6 @@ struct sqlite3_mem_methods { ** This option can be used to overload the default mutex allocation ** routines with a wrapper used to track mutex usage for performance ** profiling or testing, for example.
-** -**
SQLITE_CONFIG_MEMSYS3
-**
This option is only available if SQLite is compiled with the -** SQLITE_ENABLE_MEMSYS3 symbol defined. It selects one of two memory -** allocation systems that use the block of memory supplied to sqlite -** using the SQLITE_CONFIG_HEAP option. -**
-** -**
SQLITE_CONFIG_MEMSYS5
-**
This option is only available if SQLite is compiled with the -** SQLITE_ENABLE_MEMSYS5 symbol defined. It selects one of two memory -** allocation systems that use the block of memory supplied to sqlite -** using the SQLITE_CONFIG_HEAP option. The memory allocation system -** selected by this option, "memsys5", is also installed by default -** when the SQLITE_CONFIG_HEAP option is set, so it is not usually -** necessary to use this option directly. -**
*/ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ #define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ @@ -1157,8 +1141,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ #define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ #define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -#define SQLITE_CONFIG_MEMSYS3 12 /* nil */ -#define SQLITE_CONFIG_MEMSYS5 13 /* nil */ + /* ** CAPI3REF: Enable Or Disable Extended Result Codes {F12200} diff --git a/src/test_malloc.c b/src/test_malloc.c index d5eeef7e36..ee233e844f 100644 --- a/src/test_malloc.c +++ b/src/test_malloc.c @@ -13,7 +13,7 @@ ** This file contains code used to implement test interfaces to the ** memory allocation subsystem. ** -** $Id: test_malloc.c,v 1.35 2008/07/09 16:51:51 drh Exp $ +** $Id: test_malloc.c,v 1.36 2008/07/10 18:13:42 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -235,6 +235,10 @@ static void pointerToText(void *p, char *z){ int i, k; unsigned int u; sqlite3_uint64 n; + if( p==0 ){ + strcpy(z, "0"); + return; + } if( sizeof(n)==sizeof(p) ){ memcpy(&n, &p, sizeof(p)); }else if( sizeof(u)==sizeof(p) ){ @@ -930,10 +934,32 @@ static int test_config_pagecache( 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_heap ?-memsys3? NBYTE NMINALLOC +** sqlite3_config_heap NBYTE NMINALLOC */ static int test_config_heap( void * clientData, @@ -945,35 +971,24 @@ static int test_config_heap( int nByte; /* Size of buffer to pass to sqlite3_config() */ int nMinAlloc; /* Size of minimum allocation */ int rc; /* Return code of sqlite3_config() */ - int isMemsys3 = 0; /* True if the -memsys3 switch is present */ Tcl_Obj * CONST *aArg = &objv[1]; int nArg = objc-1; - if( nArg>0 && 0==strcmp("-memsys3", Tcl_GetString(aArg[0])) ){ - nArg--; - aArg++; - isMemsys3 = 1; - } if( nArg!=2 ){ - Tcl_WrongNumArgs(interp, 1, objv, "?-memsys3? NBYTE NMINALLOC"); + 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 ){ - sqlite3_mem_methods m; - memset(&m, 0, sizeof(sqlite3_mem_methods)); - rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &m); + rc = sqlite3_config(SQLITE_CONFIG_HEAP, (void*)0, 0, 0); }else{ if( nByte>sizeof(zBuf) ){ nByte = sizeof(zBuf); } rc = sqlite3_config(SQLITE_CONFIG_HEAP, zBuf, nByte, nMinAlloc); - if( isMemsys3 && rc==SQLITE_OK ){ - rc = sqlite3_config(SQLITE_CONFIG_MEMSYS3); - } } Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); @@ -1105,25 +1120,26 @@ int Sqlitetest_malloc_Init(Tcl_Interp *interp){ 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. }, - { "install_malloc_faultsim", test_install_malloc_faultsim ,0. }, + { "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 }, + { "install_malloc_faultsim", test_install_malloc_faultsim ,0 }, { "sqlite3_config_heap", test_config_heap ,0 }, + { "sqlite3_config_memstatus", test_config_memstatus ,0 }, { "sqlite3_dump_memsys3", test_dump_memsys3 ,3 }, { "sqlite3_dump_memsys5", test_dump_memsys3 ,5 } }; diff --git a/src/test_mutex.c b/src/test_mutex.c index 2de4a1b9c2..aa7b8a0c9a 100644 --- a/src/test_mutex.c +++ b/src/test_mutex.c @@ -10,7 +10,7 @@ ** ************************************************************************* ** -** $Id: test_mutex.c,v 1.7 2008/07/10 17:52:49 danielk1977 Exp $ +** $Id: test_mutex.c,v 1.8 2008/07/10 18:13:42 drh Exp $ */ #include "tcl.h" @@ -33,6 +33,7 @@ struct sqlite3_mutex { static struct test_mutex_globals { int isInstalled; /* True if installed */ int disableInit; /* True to cause sqlite3_initalize() to fail */ + int disableTry; /* True to force sqlite3_mutex_try() to fail */ int isInit; /* True if initialized */ sqlite3_mutex_methods m; /* Interface to "real" mutex system */ int aCounter[8]; /* Number of grabs of each type of mutex */ @@ -120,6 +121,7 @@ static void counterMutexEnter(sqlite3_mutex *p){ static int counterMutexTry(sqlite3_mutex *p){ assert( g.isInit ); g.aCounter[p->eType]++; + if( g.disableTry ) return 0; return g.m.xMutexTry(p->pReal); } @@ -218,6 +220,7 @@ static int test_install_mutex_counters( if( rc==SQLITE_OK ){ sqlite3_config(SQLITE_CONFIG_MUTEX, &counter_methods); } + g.disableTry = 0; }else{ assert( g.m.xMutexAlloc ); rc = sqlite3_config(SQLITE_CONFIG_MUTEX, &g.m); @@ -308,6 +311,14 @@ static int test_alloc_mutex( /* ** sqlite3_config OPTION +** +** OPTION can be either one of the keywords: +** +** SQLITE_CONFIG_SINGLETHREAD +** SQLITE_CONFIG_MULTITHREAD +** SQLITE_CONFIG_SERIALIZED +** +** Or OPTION can be an raw integer. */ static int test_config( void * clientData, @@ -334,10 +345,14 @@ static int test_config( } if( Tcl_GetIndexFromObjStruct(interp, objv[1], aOpt, s, "flag", 0, &i) ){ - return TCL_ERROR; + if( Tcl_GetIntFromObj(interp, objv[1], &i) ){ + return TCL_ERROR; + } + }else{ + i = aOpt[i].iValue; } - rc = sqlite3_config(aOpt[i].iValue); + rc = sqlite3_config(i); Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE); return TCL_OK; } @@ -364,5 +379,7 @@ int Sqlitetest_mutex_Init(Tcl_Interp *interp){ Tcl_LinkVar(interp, "disable_mutex_init", (char*)&g.disableInit, TCL_LINK_INT); + Tcl_LinkVar(interp, "disable_mutex_try", + (char*)&g.disableTry, TCL_LINK_INT); return SQLITE_OK; } diff --git a/test/memsubsys2.test b/test/memsubsys2.test new file mode 100644 index 0000000000..3bae5da97c --- /dev/null +++ b/test/memsubsys2.test @@ -0,0 +1,157 @@ +# 2008 June 18 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file contains tests of the memory allocation subsystem. +# +# $Id: memsubsys2.test,v 1.1 2008/07/10 18:13:43 drh Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +sqlite3_reset_auto_extension + +# This procedure constructs a new database in test.db. It fills +# this database with many small records (enough to force multiple +# rebalance operations in the btree-layer and to require a large +# page cache), verifies correct results, then returns. +# +proc build_test_db {testname pragmas} { + catch {db close} + file delete -force test.db test.db-journal + sqlite3 db test.db + db eval $pragmas + db eval { + CREATE TABLE t1(x, y); + CREATE TABLE t2(a, b); + CREATE INDEX i1 ON t1(x,y); + INSERT INTO t1 VALUES(1, 100); + INSERT INTO t1 VALUES(2, 200); + } + for {set i 2} {$i<5000} {incr i $i} { + db eval {INSERT INTO t2 SELECT * FROM t1} + db eval {INSERT INTO t1 SELECT a+$i, a+b*100 FROM t2} + db eval {DELETE FROM t2} + } + do_test $testname.1 { + db eval {SELECT count(*) FROM t1} + } 8192 + integrity_check $testname.2 +} + +# Test 1: Verify that calling sqlite3_malloc(0) returns a NULL +# pointer. +# +set highwater [sqlite3_memory_highwater 0] +do_test memsubsys2-1.1 { + sqlite3_malloc 0 +} {0} +do_test memsubsys2-1.2 { + sqlite3_memory_highwater 0 +} $highwater + + +# Test 2: Verify that the highwater mark increases after a large +# allocation. +# +sqlite3_memory_highwater 1 +set highwater [sqlite3_memory_highwater 0] +do_test memsubsys2-2.1 { + sqlite3_free [set x [sqlite3_malloc 100000]] + expr {$x!="0"} +} {1} +do_test memsubsys2-2.2 { + expr {[sqlite3_memory_highwater 0]>=[sqlite3_memory_used]+$highwater} +} {1} + +# Test 3: Verify that turning of memstatus disables the statistics +# tracking. +# +db close +sqlite3_shutdown +sqlite3_config_memstatus 0 +sqlite3_initialize +set highwater [sqlite3_memory_highwater 0] +do_test memsubsys2-3.1 { + set highwater +} {0} +do_test memsubsys2-3.2 { + sqlite3_malloc 0 +} {0} +do_test memsubsys2-3.3 { + sqlite3_memory_highwater 0 +} {0} +do_test memsubsys2-3.4 { + sqlite3_memory_used +} {0} +do_test memsubsys2-3.5 { + set ::allocation [sqlite3_malloc 100000] + expr {$::allocation!="0"} +} {1} +do_test memsubsys2-3.6 { + sqlite3_memory_highwater 0 +} {0} +do_test memsubsys2-3.7 { + sqlite3_memory_used +} {0} +do_test memsubsys2-3.8 { + sqlite3_free $::allocation +} {} +do_test memsubsys2-3.9 { + sqlite3_free 0 +} {} + + +# Test 4: Verify that turning on memstatus reenables the statistics +# tracking. +# +sqlite3_shutdown +sqlite3_config_memstatus 1 +sqlite3_initialize +set highwater [sqlite3_memory_highwater 0] +do_test memsubsys2-4.1 { + set highwater +} {0} +do_test memsubsys2-4.2 { + sqlite3_malloc 0 +} {0} +do_test memsubsys2-4.3 { + sqlite3_memory_highwater 0 +} {0} +do_test memsubsys2-4.4 { + sqlite3_memory_used +} {0} +do_test memsubsys2-4.5 { + set ::allocation [sqlite3_malloc 100000] + expr {$::allocation!="0"} +} {1} +do_test memsubsys2-4.6 { + expr {[sqlite3_memory_highwater 0]>=100000} +} {1} +do_test memsubsys2-4.7 { + expr {[sqlite3_memory_used]>=100000} +} {1} +do_test memsubsys2-4.8 { + sqlite3_free $::allocation +} {} +do_test memsubsys2-4.9 { + sqlite3_free 0 +} {} +do_test memsubsys2-4.10 { + expr {[sqlite3_memory_highwater 0]>=100000} +} {1} +do_test memsubsys2-4.11 { + sqlite3_memory_used +} {0} + + + + +autoinstall_test_functions +finish_test diff --git a/test/mutex2.test b/test/mutex2.test index 6a0dbd002d..9fdde2d97d 100644 --- a/test/mutex2.test +++ b/test/mutex2.test @@ -11,7 +11,7 @@ # # Test scripts for deliberate failures of mutex routines. # -# $Id: mutex2.test,v 1.3 2008/07/08 02:12:37 drh Exp $ +# $Id: mutex2.test,v 1.4 2008/07/10 18:13:43 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -84,4 +84,14 @@ do_test mutex2-2.10 { install_mutex_counters 0 set disable_mutex_init 0 autoinstall_test_functions + +# Mutex allocation works now. +# + +do_test mutex2-3.1 { + set ptr [alloc_dealloc_mutex] + expr {$ptr!=0} +} {1} + + finish_test diff --git a/test/permutations.test b/test/permutations.test index 80c78ad247..b03c1e0ff0 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -9,7 +9,7 @@ # #*********************************************************************** # -# $Id: permutations.test,v 1.10 2008/07/10 17:52:49 danielk1977 Exp $ +# $Id: permutations.test,v 1.11 2008/07/10 18:13:43 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -35,7 +35,7 @@ if {$::testmode eq "all"} { set ::testmode { memsubsys1 memsubsys2 singlethread multithread onefile utf16 exclusive persistent_journal persistent_journal_error no_journal no_journal_error - autovacuum_ioerr + autovacuum_ioerr no_mutex_try } } if {$::testmode eq "targets"} { @@ -49,19 +49,23 @@ if {$::testmode eq "targets"} { } set EXCLUDE { - all.test async.test async2.test corrupt.test - crash.test crash2.test crash3.test crash4.test - crash6.test crash7.test exclusive3.test fts3.test - fuzz.test fuzz_malloc.test in2.test jrnlmode3.test - loadext.test mallocAll.test malloc.test malloc2.test - malloc3.test malloc4.test memleak.test misc7.test - misuse.test mutex2.test onefile.test quick.test - soak.test speed1.test speed1p.test speed2.test - speed3.test speed4.test speed4p.test sqllimits1.test - thread001.test thread002.test btree8.test utf16.test - shared_err.test vtab_err.test veryquick.test incrvacuum_ioerr.test - autovacuum_crash.test permutations.test - autovacuum_ioerr.test jrnlmode2.test jrnlmode4.test + all.test in2.test onefile.test + async2.test incrvacuum_ioerr.test permutations.test + async.test jrnlmode2.test quick.test + autovacuum_crash.test jrnlmode3.test shared_err.test + autovacuum_ioerr.test jrnlmode4.test soak.test + btree8.test loadext.test speed1p.test + corrupt.test malloc2.test speed1.test + crash2.test malloc3.test speed2.test + crash3.test malloc4.test speed3.test + crash4.test mallocAll.test speed4p.test + crash6.test malloc.test speed4.test + crash7.test memleak.test sqllimits1.test + crash.test memsubsys1.test thread001.test + exclusive3.test memsubsys2.test thread002.test + fts3.test misc7.test utf16.test + fuzz_malloc.test misuse.test veryquick.test + fuzz.test mutex2.test vtab_err.test } set ALLTESTS [list] foreach filename [glob $testdir/*.test] { @@ -142,8 +146,6 @@ run_tests "memsubsys1" -description { sqlite3_config_pagecache 4096 24 sqlite3_config_scratch 25000 1 sqlite3_initialize -} -exclude { - memsubsys1.test } -shutdown { catch {db close} sqlite3_shutdown @@ -162,8 +164,6 @@ run_tests "memsubsys2" -description { sqlite3_config_pagecache 512 5 sqlite3_config_scratch 1000 1 sqlite3_initialize -} -exclude { - memsubsys1.test } -shutdown { catch {db close} sqlite3_shutdown @@ -352,15 +352,17 @@ ifcapable mem3 { run_tests "memsys3" -description { Run tests using the allocator in mem3.c. } -exclude { - incrblob2.test manydb.test autovacuum.test bigrow.test - collate5.test delete3.test index2.test ioerr.test join3.test - pagesize.test bitvec.test capi3.test memsubsys1.test limit.test - memdb.test capi3c.test + autovacuum.test delete3.test manydb.test + bigrow.test incrblob2.test memdb.test + bitvec.test index2.test memsubsys1.test + capi3c.test ioerr.test memsubsys2.test + capi3.test join3.test pagesize.test + collate5.test limit.test } -initialize { catch {db close} sqlite3_reset_auto_extension sqlite3_shutdown - sqlite3_config_heap -memsys3 1000000 0 + sqlite3_config_heap 1000000 0 install_malloc_faultsim 1 sqlite3_initialize autoinstall_test_functions @@ -378,10 +380,12 @@ ifcapable mem5 { run_tests "memsys5" -description { Run tests using the allocator in mem5.c. } -exclude { - incrblob2.test manydb.test autovacuum.test bigrow.test - collate5.test delete3.test index2.test ioerr.test join3.test - pagesize.test bitvec.test capi3.test memsubsys1.test limit.test - memdb.test capi3c.test func.test + autovacuum.test delete3.test manydb.test + bigrow.test incrblob2.test memdb.test + bitvec.test index2.test memsubsys1.test + capi3c.test ioerr.test memsubsys2.test + capi3.test join3.test pagesize.test + collate5.test limit.test } -initialize { catch {db close} sqlite3_reset_auto_extension @@ -401,7 +405,8 @@ ifcapable mem5 { run_tests "memsys5-2" -description { Run tests using the allocator in mem5.c in a different configuration. - } -include { select1.test + } -include { + select1.test } -initialize { catch {db close} sqlite3_reset_auto_extension @@ -420,6 +425,21 @@ ifcapable mem5 { } } +ifcapable threadsafe { + run_tests "no_mutex_try" -description { + The sqlite3_mutex_try() interface always fails + } -initialize { + catch {db close} + sqlite3_shutdown + install_mutex_counters 1 + set ::disable_mutex_try 1 + } -shutdown { + catch {db close} + sqlite3_shutdown + install_mutex_counters 0 + } +} + # run_tests "crash_safe_append" -description { # Run crash.test with persistent journals on a SAFE_APPEND file-system. # } -initialize { @@ -464,4 +484,3 @@ rename do_test "" rename really_do_test do_test finish_test -