]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhancements to the testing logic for malloc and mutex. Only permit one
authordrh <drh@noemail.net>
Thu, 10 Jul 2008 18:13:42 +0000 (18:13 +0000)
committerdrh <drh@noemail.net>
Thu, 10 Jul 2008 18:13:42 +0000 (18:13 +0000)
of MEMSYS3/5 to be compiled-in at a time.  Omit the SQLITE_CONFIG_MEMSYS3/5
configuration options. (CVS 5389)

FossilOrigin-Name: ed8b2525006ae7f8cacd01b291760513fdbdff57

manifest
manifest.uuid
src/main.c
src/mem2.c
src/sqlite.h.in
src/test_malloc.c
src/test_mutex.c
test/memsubsys2.test [new file with mode: 0644]
test/mutex2.test
test/permutations.test

index e9f99ee1f5d500be44d413e0a94568daec000566..34b816b3b7f42a53d09e508aadabdb1c6dcde58a 100644 (file)
--- 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
index 4293c1cce5a6518e8b7596f7376b129b75510be5..d6c4c3a9234d84cb59bfe443b7ae6dece5cde84e 100644 (file)
@@ -1 +1 @@
-9c8b97ef593c17740640a01a7338164d7fbe070e
\ No newline at end of file
+ed8b2525006ae7f8cacd01b291760513fdbdff57
\ No newline at end of file
index e8c47ac56ad8d0524c45f79f99f3d5cc21074f18..479ed610497a7fe5330de99ad3ad70e16d54f5f3 100644 (file)
@@ -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 <ctype.h>
@@ -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.
-      */
-    }
-
+      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
+        sqlite3Config.m = sqlite3MemGetMemsys3();
+#endif
 #ifdef SQLITE_ENABLE_MEMSYS5
-    case SQLITE_CONFIG_MEMSYS5: {
-      sqlite3_mem_methods *p = sqlite3MemGetMemsys5();
-      sqlite3Config.m = *p;
-      break;
-    }
+        sqlite3Config.m = sqlite3MemGetMemsys5();
 #endif
-#ifdef SQLITE_ENABLE_MEMSYS3
-    case SQLITE_CONFIG_MEMSYS3: {
-      sqlite3_mem_methods *p = sqlite3MemGetMemsys3();
-      sqlite3Config.m = *p;
+#if !defined(SQLITE_ENABLE_MEMSYS3) && !defined(SQLITE_ENABLE_MEMSYS5)
+        rc = SQLITE_ERROR;
+#endif
+      }
       break;
     }
-#endif
 
     default: {
       rc = SQLITE_ERROR;
index 304c9fbb0f9e8757227b9616ff4f701a4a4ba843..5e9a999b7e158975d1d07c7dd48c0e3a927504cb 100644 (file)
@@ -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;
 }
 
index ab433fdf05c64b6baaabcf9486d99d9b90e66316..7bfcd7d503d8633bc84d393cde946237770020e6 100644 (file)
@@ -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.</dd>
+** 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.</dd>
 **
 ** <dt>SQLITE_CONFIG_MUTEX</dt>
 ** <dd>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.</dd>
-**
-** <dt>SQLITE_CONFIG_MEMSYS3</dt>
-** <dd>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.
-** </dd>
-**
-** <dt>SQLITE_CONFIG_MEMSYS5</dt>
-** <dd>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.
-** </dd>
 */
 #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}
index d5eeef7e360ff63c1c833fa31ca5cfb0a1c65ae2..ee233e844fdbc94dcd558825a64a016b294bc9eb 100644 (file)
@@ -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 }
   };
index 2de4a1b9c2518360104d55f93d240c4eeec6dedb..aa7b8a0c9a4e071d8e4eed5b634c1ac6774fde17 100644 (file)
@@ -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 (file)
index 0000000..3bae5da
--- /dev/null
@@ -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
index 6a0dbd002d93526ae8aad9781ef603e5afa20902..9fdde2d97d922440b94b0a298037c890616c8e05 100644 (file)
@@ -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
index 80c78ad2470933983325181fa2cfe57315dc76e4..b03c1e0ff0ab76d379a157997b11903ec6d05d8e 100644 (file)
@@ -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
-