diff --git a/manifest b/manifest index 4cffcc0ed2..6d0174590d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\squick\stest\sruns\sagain\swith\sa\shandfull\sof\serrors\safter\sadding\sthe\nmutex\slocks\sto\sbtree,\sthe\sVFS\sregistration\sinterfaces,\sand\sFTS3.\s(CVS\s4254) -D 2007-08-20T23:50:25 +C Remove\sunnecessary\s#includes\sof\s"os.h".\s\sNew\smutex\simplementations.\s(CVS\s4255) +D 2007-08-21T10:44:16 F Makefile.in 0c0e53720f658c7a551046442dd7afba0b72bfbe F Makefile.linux-gcc 65241babba6faf1152bf86574477baab19190499 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -86,41 +86,41 @@ F src/btreeInt.h e93edf57832278138b98cf60cbc54241103c6988 F src/build.c add67be992307b4b11849a6611bfd3352aacde92 F src/callback.c 143436453bb93e831c9574fea0b9b9eb90e40ff3 F src/complete.c ea63834e798a0ab14159bdc6e6cabc3df21aa346 -F src/date.c 8c37dbbabc9fceec51e8adfcd771328345679b14 +F src/date.c 70a5af1944c0b76bed917cab3c1ca47e5f97d359 F src/delete.c 849846d06d29851dde0d9f424a5de5817eb140d1 F src/experimental.c 1b2d1a6cd62ecc39610e97670332ca073c50792b F src/expr.c 3ea108a9e409f58b8203e29c54442da5085be5bf -F src/func.c 472c0610164180624ff5aa51b0521a331bfef11b +F src/func.c 8516d5f97ddc1004537490fbaffa9a8b0da5c4bb F src/hash.c 2f322979071dd2bdba7503b5276d66f028744382 F src/hash.h 3ad3da76bfb954978d227bf495568b0e6da2c19e F src/insert.c 633322aef1799f6604fa805e12488bc628570b0c -F src/legacy.c 6013a7cb7da1b72550b3d35d4fc598b3c3e5b8c1 +F src/legacy.c a83519a8fbb488c3155fca577b010d590ec479e9 F src/limits.h 71ab25f17e35e0a9f3f6f234b8ed49cc56731d35 -F src/loadext.c c0ccda3dbda109da087a8fd762deebe5fdf24a1d -F src/main.c 7310dd532c1ff751772b196c98f7e0534afd7e58 -F src/malloc.c 613c65f12ff0ee4edd017aa458209ab7a23cd7b1 +F src/loadext.c 245ef19db91d86b394ad50366d69f160c46764d9 +F src/main.c 3f8917757c7f6a937e300b613b9cfd1bbe703c70 +F src/malloc.c c2f5da620d8e030c6974a0ddcaeb7b408c9bdb3d F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217 F src/mem1.c 30bf8be3846f92fdf88c490c5e5378512383bcbe F src/mem2.c 482f0aaf14e8ef1db64cb8c5b9a9bfe708297c92 -F src/mutex.c 60051a86c49cfe2ec15dd8b1d9d0d530b8893b07 -F src/os.c c9f91550afa071c5b98042ce14d38a2d87c3f4df -F src/os.h da098cad985b4849fefdd6a96d671b332008aa55 +F src/mutex.c 56bd91271f18300aa7da45608bd8956abe471d10 +F src/os.c dfe4718104a795c4a5e4cd927b6b00c24c004c58 +F src/os.h 399c89cafa93b9ef35c3dc70f77644d10936b535 F src/os_common.h a5c446d3b93f09f369d13bf217de4bed3437dd1c -F src/os_os2.c cba4e96fadb949076c717108fe0599d1a3c2e446 +F src/os_os2.c 8769301bff502de642ad2634cedcb77d967ce199 F src/os_os2.h c3f7d0af7e3453d1d7aa81b06c0a56f5a226530b F src/os_test.c 49833426101f99aee4bb5f6a44b7c4b2029fda1c F src/os_test.h 903c93554c23d88f34f667f1979e4a1cee792af3 -F src/os_unix.c 41a737d14d00b93fae8efd0d0555922f07a29ada +F src/os_unix.c 55e4d3c441e6b9e2dd36160e61df827bac1ea41d F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e -F src/os_win.c d868d5f9e95ec9c1b9e2a30c54c996053db6dddd +F src/os_win.c 29c0e19c1072679a4c7818c49fab2f35d2ad7747 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b -F src/pager.c 53af3942f97b077886e035ed15781d1f887713b6 +F src/pager.c bb25ee85c990241be0f321978e6c5f6b645692b2 F src/pager.h 53087c6fb9db01aed17c7fd044662a27507e89b8 -F src/parse.y c03529c3b82702ada98ce405b390e3a9409708cf -F src/pragma.c 8f5e37c3cf6dbdeb3645bb80cc58cfc3324c0178 -F src/prepare.c 03292beeffce2d65debab12508a8ec1f5aec7241 +F src/parse.y 2d2ce439dc6184621fb0b86f4fc5aca7f391a590 +F src/pragma.c 9b989506a1b7c8aecd6befb8235e2f57a4aba7e5 +F src/prepare.c 5bc8c7a943215302943fec831f8c646f6dfdf76a F src/printf.c a8f46e0ed360c18d40e89aa636533be300b406c2 -F src/random.c af7264b4ed93330b3bf40dd123e16e7f8f62e5bb +F src/random.c 89b2c5a97f5059c486c021ffc2d72c9d779ccae8 F src/select.c 98c367bce3f38c5adfcc97de9ab5c79b0e5dc2b2 F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96 F src/shell.c ac29402b538515fa4697282387be9c1205e6e9eb @@ -129,41 +129,41 @@ F src/sqlite3ext.h 647a6b8a8f76ff6c9611e4a071531d8e63ff2d6b F src/sqliteInt.h 6891d6864a6b9fc661eadaa0328e81dff7523584 F src/sqliteLimit.h f14609c27636ebc217c9603ade26dbdd7d0f6afa F src/table.c c725e47f6f3092b9a7b569fc58e408e2173ee008 -F src/tclsqlite.c 0606c4f31711492eb4d7480a981eebb80914f3d9 -F src/test1.c 6ae17d70dac0f14ab632f66c026a44fb0c71f22e -F src/test2.c 4506b6635e193a19a9bccdbe366ff4aed09cbe79 -F src/test3.c b6d6a452a394c690395b1d7155e7bf00fb99a12d -F src/test4.c 1f4d2ed89867bac187d49ed8004f121592987d3e -F src/test5.c 7bc8a87c2b6fd076ec2ca9972946e71a367883ad -F src/test6.c b0090b4826d5e06df2ff2d5acaddf3f8f708fcd2 -F src/test7.c 0f9d91ce8018740d5eb6e258f0fac2a2943c40f0 -F src/test8.c 719c284607c1e91a893f5425df1e92b74c859aef -F src/test9.c c0f38f7795cc51d37db6c63874d90f40f10d0f0e -F src/test_async.c ba48913e4bab43b149747d3bdd3b75b1f66658ec +F src/tclsqlite.c 299fb45c5cf983b49b2c984b87b936b8132fbfe2 +F src/test1.c 9e9651b0b9f85654b4bf28dfad787bc21a33aae5 +F src/test2.c 4f742e99ed1bea5c14692f627bdb59a146f30504 +F src/test3.c 2e4da0fe90a0aa8cf9276ea34cbe92e91dc1db07 +F src/test4.c d97b87919dc3db1cc5fccc04a33f030d5940e1a9 +F src/test5.c 81353afad5d795ae7155bffce1e4deef10ee8e22 +F src/test6.c 9a93a5538f4ec008e8471635889091b087328532 +F src/test7.c 50f5aa04fd751528ad5ee50e9be9ecee6f0b574a +F src/test8.c 4bf571b82e502094846ae06e30fe028f190aaaae +F src/test9.c b46c8fe02ac7cca1a7316436d8d38d50c66f4b2f +F src/test_async.c 9f3ab66e848930d1c3a7bc2dde77b9b643f6e4ba F src/test_autoext.c 855157d97aa28cf84233847548bfacda21807436 F src/test_btree.c c1308ba0b88ab577fa56c9e493a09829dfcded9c -F src/test_config.c 6e2cad5669f13b38b8e02850157448a757f21df7 +F src/test_config.c 6c74d82fd4a0a5a3bebd53a9cb2cb6c02af68e07 F src/test_hexio.c 82916f918687502658f02533b519c38cb180db6d F src/test_loadext.c 22065d601a18878e5542191001f0eaa5d77c0ed8 F src/test_malloc.c d9ba6be85f9c4a439b19f6e0a72d91c369d72c63 F src/test_md5.c d9f828765b242ff86f58cd879259c3da4eaede02 F src/test_schema.c 12c9de7661d6294eec2d57afbb52e2af1128084f F src/test_server.c 319f6b1a99bab5f7149387442243d6e65a8ab4eb -F src/test_tclvar.c 160290ba5c19964da7cb97defc6c104712074b69 -F src/tokenize.c 3a3fd71cfb2abb8e11ed6ab6b764b790c534defc +F src/test_tclvar.c b2d1115e4d489179d3f029e765211b2ad527ba59 +F src/tokenize.c e39527c9c867774a92716c669a48ad8fbc3cdc63 F src/trigger.c dccc6fbf37d12193c90ede5b026bbd195d505ff4 F src/update.c e89b980b443d44b68bfc0b1746cdb6308e049ac9 F src/utf.c 853f97ce0d3cff8dbaef517a6dc475f7001a67c5 -F src/util.c 0273ba16dbf9bab423b1b84c6d548d8f14c25f64 -F src/vacuum.c f45bd9d3aad8d68bb3b85cf89d7a797be5075fde -F src/vdbe.c b5cd895a0516466daacc564da332589a903e2eb0 +F src/util.c 23251cee7867dfdcc80b05d278dbca71586d95cf +F src/vacuum.c 318ccae7c4e3ddf241aeaee4d2611bfe1949a373 +F src/vdbe.c f1a9a29da48ccfa49042df478abb478520589f37 F src/vdbe.h 001c5b257567c1d3de7feb2203aac71d0d7b16a3 F src/vdbeInt.h 8e360d326328e7a66100f468697edf9cfb4567dc -F src/vdbeapi.c ddfe341249929b89c47a0ff77f8043ef0987612b -F src/vdbeaux.c d2e8a63e9aea8527c79ae523036cc8f762b267a2 +F src/vdbeapi.c ffd28fa0f731467a1e63155abc74cd149e57d671 +F src/vdbeaux.c 14b48bfc6334682e5e5858a0835f8b00d8751953 F src/vdbeblob.c cf9ee3c7d9977cbd896f8b118da4fb4268637f4f F src/vdbefifo.c 334c838c8f42d61a94813d136019ee566b5dc2f6 -F src/vdbemem.c 019952d44066a24aef70ca8c284cfd2d1073c398 +F src/vdbemem.c 2843e6f91e8f19cfd72cfc7b24a03f1647db3c28 F src/vtab.c ee29237ecc9b310dc43c0c2ac5caa6c6a20787be F src/where.c 2776a0caf8cbbfd6ec79cfb1cd9bc25074055e5e F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617 @@ -557,7 +557,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5 -P 1315bd8e125602275fb718780f9b2730bd37f6ab -R d4fae6ff2f91391abff6a85b93359df7 +P 6cf725d212d468cbd7c7cbc22ca5ab13f1d77939 +R bc41d2a41155d3978aad1298f4dc479f U drh -Z bdcd45a572300c8ecdfe8272f9cd3707 +Z 6fdad79122af6697e52d8395a5ab70ee diff --git a/manifest.uuid b/manifest.uuid index 22f6e24af5..33169c481e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6cf725d212d468cbd7c7cbc22ca5ab13f1d77939 \ No newline at end of file +fbbd5bda544ffec4e1b43407b12e546235dc7873 \ No newline at end of file diff --git a/src/date.c b/src/date.c index 4629ebac92..33fe92c873 100644 --- a/src/date.c +++ b/src/date.c @@ -16,7 +16,7 @@ ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. ** All other code has file scope. ** -** $Id: date.c,v 1.69 2007/08/18 10:59:20 danielk1977 Exp $ +** $Id: date.c,v 1.70 2007/08/21 10:44:16 drh Exp $ ** ** SQLite processes all times and dates as Julian Day numbers. The ** dates and times are stored as the number of days since noon @@ -46,7 +46,6 @@ ** Richmond, Virginia (USA) */ #include "sqliteInt.h" -#include "os.h" #include #include #include diff --git a/src/func.c b/src/func.c index b3aa5da803..699ef17242 100644 --- a/src/func.c +++ b/src/func.c @@ -16,15 +16,13 @@ ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** -** $Id: func.c,v 1.166 2007/08/16 10:36:34 danielk1977 Exp $ +** $Id: func.c,v 1.167 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include -/* #include */ #include #include #include "vdbeInt.h" -#include "os.h" /* diff --git a/src/legacy.c b/src/legacy.c index 5dff806d17..acb1694707 100644 --- a/src/legacy.c +++ b/src/legacy.c @@ -14,11 +14,10 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: legacy.c,v 1.19 2007/08/16 04:30:40 drh Exp $ +** $Id: legacy.c,v 1.20 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include /* diff --git a/src/loadext.c b/src/loadext.c index 4f6e3b3dbd..f2d93907f1 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -17,7 +17,6 @@ #define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ #include "sqlite3ext.h" #include "sqliteInt.h" -#include "os.h" #include #include diff --git a/src/main.c b/src/main.c index f0bbe7da0f..719ecb634b 100644 --- a/src/main.c +++ b/src/main.c @@ -14,10 +14,9 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.389 2007/08/20 22:48:42 drh Exp $ +** $Id: main.c,v 1.390 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include /* diff --git a/src/malloc.c b/src/malloc.c index adafe3daf9..3f9466cb73 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -12,10 +12,9 @@ ** Memory allocation functions used throughout sqlite. ** ** -** $Id: malloc.c,v 1.6 2007/08/16 10:09:03 danielk1977 Exp $ +** $Id: malloc.c,v 1.7 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include #include diff --git a/src/mutex.c b/src/mutex.c index 619a1afc48..db2e33ed06 100644 --- a/src/mutex.c +++ b/src/mutex.c @@ -12,21 +12,42 @@ ** This file contains the C functions that implement mutexes for ** use by the SQLite core. ** -** $Id: mutex.c,v 1.5 2007/08/20 22:48:43 drh Exp $ +** $Id: mutex.c,v 1.6 2007/08/21 10:44:16 drh Exp $ */ - /* ** If SQLITE_MUTEX_APPDEF is defined, then this whole module is -** omitted and equivalent functionality just be provided by the +** omitted and equivalent functionality must be provided by the ** application that links against the SQLite library. */ #ifndef SQLITE_MUTEX_APPDEF -/* -** The start of real code + +/* This is the beginning of real code */ #include "sqliteInt.h" +/* +** Figure out what version of the code to use +*/ +#define SQLITE_MUTEX_NOOP 1 /* The default */ +#if 0 +#if defined(SQLITE_DEBUG) && !SQLITE_THREADSAFE +# undef SQLITE_MUTEX_NOOP +# define SQLITE_MUTEX_NOOP_DEBUG +#endif +#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_UNIX +# undef SQLITE_MUTEX_NOOP +# define SQLITE_MUTEX_PTHREAD +#endif +#if defined(SQLITE_MUTEX_NOOP) && SQLITE_THREADSAFE && OS_WIN +# undef SQLITE_MUTEX_NOOP +# define SQLITE_MUTEX_WIN +#endif +#endif + + + +#ifdef SQLITE_MUTEX_NOOP /************************ No-op Mutex Implementation ********************** ** ** This first implementation of mutexes is really a no-op. In other words, @@ -81,8 +102,112 @@ int sqlite3_mutex_held(sqlite3_mutex *pNotUsed){ int sqlite3_mutex_notheld(sqlite3_mutex *pNotUsed){ return 1; } +#endif /* SQLITE_MUTEX_NOOP */ -#if 0 +#ifdef SQLITE_MUTEX_NOOP_DEBUG +/*************** Error-checking No-op Mutex Implementation ******************* +** +** In this implementation, mutexes do not provide any mutual exclusion. +** But the error checking is provided. This implementation is useful +** for test purposes. +*/ + +/* +** The mutex object +*/ +struct sqlite3_mutex { + int id; + int cnt; +}; + +/* +** The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. If it returns NULL +** that means that a mutex could not be allocated. +*/ +sqlite3_mutex *sqlite3_mutex_alloc(int id){ + static sqlite3_mutex aStatic[3]; + sqlite3_mutex *pNew = 0; + switch( id ){ + case SQLITE_MUTEX_FAST: + case SQLITE_MUTEX_RECURSIVE: { + pNew = sqlite3_malloc(sizeof(*pNew)); + if( pNew ){ + pNew->id = id; + pNew->cnt = 0; + } + break; + } + default: { + pNew = &aStatic[id-SQLITE_MUTEX_STATIC_MASTER]; + pNew->id = id; + break; + } + } + return pNew; +} + +/* +** This routine deallocates a previously allocated mutex. +*/ +void sqlite3_mutex_free(sqlite3_mutex *p){ + assert( p ); + assert( p->cnt==0 ); + assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); + sqlite3_free(p); +} + +/* +** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK +** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can +** be entered multiple times by the same thread. In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter. If the same thread tries to enter any other kind of mutex +** more than once, the behavior is undefined. +*/ +void sqlite3_mutex_enter(sqlite3_mutex *p){ + assert( p ); + assert( p->cnt==0 || p->id==SQLITE_MUTEX_RECURSIVE ); + p->cnt++; +} +int sqlite3_mutex_try(sqlite3_mutex *p){ + assert( p ); + if( p->cnt>0 && p->id!=SQLITE_MUTEX_RECURSIVE ){ + return SQLITE_BUSY; + } + p->cnt++; + return SQLITE_OK; +} + +/* +** The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered or +** is not currently allocated. SQLite will never do either. +*/ +void sqlite3_mutex_leave(sqlite3_mutex *p){ + assert( p->cnt>0 ); + p->cnt--; +} + +/* +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are +** intended for use inside assert() statements. +*/ +int sqlite3_mutex_held(sqlite3_mutex *p){ + return p==0 || p->cnt>0; +} +int sqlite3_mutex_notheld(sqlite3_mutex *p){ + return p==0 || p->cnt==0; +} +#endif /* SQLITE_MUTEX_NOOP_DEBUG */ + + + +#ifdef SQLITE_MUTEX_PTHREAD /**************** Non-recursive Pthread Mutex Implementation ***************** ** ** This implementation of mutexes is built using a version of pthreads that @@ -92,41 +217,14 @@ int sqlite3_mutex_notheld(sqlite3_mutex *pNotUsed){ /* ** Each recursive mutex is an instance of the following structure. */ -struct RMutex { - int recursiveMagic; /* Magic number identifying this as recursive */ - int nRef; /* Number of entrances */ - pthread_mutex_t auxMutex; /* Mutex controlling access to nRef and owner */ +struct sqlite3_mutex { pthread_mutex_t mainMutex; /* Mutex controlling the lock */ + pthread_mutex_t auxMutex; /* Mutex controlling access to nRef and owner */ + int id; /* Mutex type */ + int nRef; /* Number of entrances */ pthread_t owner; /* Thread that is within this mutex */ }; -/* -** Each fast mutex is an instance of the following structure -*/ -struct FMutex { - int fastMagic; /* Identifies this as a fast mutex */ - pthread_mutex_t mutex; /* The actual underlying mutex */ -}; - -/* -** Either of the above -*/ -union AnyMutex { - struct RMutex r; - struct FMutex f; -}; - -/* -** Magic numbers -*/ -#define SQLITE_MTX_RECURSIVE 0x4ED886ED -#define SQLITE_MTX_STATIC 0x56FCE1B4 -#define SQLITE_MTX_FAST 0x245BFD4F - -/* -** Static mutexes -*/ - /* ** The sqlite3_mutex_alloc() routine allocates a new ** mutex and returns a pointer to it. If it returns NULL @@ -167,35 +265,34 @@ union AnyMutex { ** the same type number. */ sqlite3_mutex *sqlite3_mutex_alloc(int iType){ - static struct FMutex staticMutexes[] = { - { SQLITE_MTX_STATIC, PTHREAD_MUTEX_INITIALIZER }, - { SQLITE_MTX_STATIC, PTHREAD_MUTEX_INITIALIZER }, - { SQLITE_MTX_STATIC, PTHREAD_MUTEX_INITIALIZER }, + static sqlite3_mutex staticMutexes[] = { + { PTHREAD_MUTEX_INITIALIZER, }, + { PTHREAD_MUTEX_INITIALIZER, }, + { PTHREAD_MUTEX_INITIALIZER, }, }; sqlite3_mutex *p; switch( iType ){ case SQLITE_MUTEX_FAST: { - struct FMutex *px = sqlite3_malloc( sizeof(*px) ); - if( px ){ - px->fastMagic = SQLITE_MTX_FAST; - pthread_mutex_init(&px->mutex, 0); + p = sqlite3MallocZero( sizeof(*p) ); + if( p ){ + p->id = iType; + pthread_mutex_init(&px->mainMutex, 0); } - p = (sqlite3_mutex*)px; break; } case SQLITE_MUTEX_RECURSIVE: { - struct RMutex *px = sqlite3_malloc( sizeof(*px) ); - if( px ){ - px->recursiveMagic = SQLITE_MTX_RECURSIVE; + p = sqlite3_malloc( sizeof(*p) ); + if( p ){ + px->id = iType; pthread_mutex_init(&px->auxMutex, 0); pthread_mutex_init(&px->mainMutex, 0); px->nRef = 0; } - p = (sqlite3_mutex*)px; break; } default: { p = &staticMutexes[iType-2]; + p->id = iType; break; } } @@ -208,18 +305,17 @@ sqlite3_mutex *sqlite3_mutex_alloc(int iType){ ** allocated mutex. SQLite is careful to deallocate every ** mutex that it allocates. */ -void sqlite3_mutex_free(sqlite3_mutex *pMutex){ - int iType = *(int*)pMutex; - if( iType==SQLITE_MTX_FAST ){ - struct FMutex *p = (struct FMutex*)pMutex; - pthread_mutex_destroy(&p->mutex); - sqlite3_free(p); - }else if( iType==SQLITE_MTX_RECURSIVE ){ - struct RMutex *p = (struct RMutex*)pMutex; +void sqlite3_mutex_free(sqlite3_mutex *p){ + assert( p ); + assert( p->nRef==0 ); + if( p->id==SQLITE_MUTEX_FAST ){ + pthread_mutex_destroy(&p->mainMutex); + }else{ + assert( p->id==SQLITE_MUTEX_RECURSIVE ); pthread_mutex_destroy(&p->auxMutex); pthread_mutex_destroy(&p->mainMutex); - sqlite3_free(p); } + sqlite3_free(p); } /* @@ -233,12 +329,8 @@ void sqlite3_mutex_free(sqlite3_mutex *pMutex){ ** can enter. If the same thread tries to enter any other kind of mutex ** more than once, the behavior is undefined. */ -void sqlite3_mutex_enter(sqlite3_mutex *pMutex){ - if( SQLITE_MTX_FAST == *(int*)pMutex ){ - struct FMutex *p = (struct FMutex*)pMutex; - pthread_mutex_lock(&p->mutex); - }else{ - struct RMutex *p = (struct RMutex*)pMutex; +void sqlite3_mutex_enter(sqlite3_mutex *p){ + if( p->id==SQLITE_MUTEX_RECURSIVE ){ while(1){ pthread_mutex_lock(&p->auxMutex); if( p->nRef==0 ){ @@ -257,16 +349,15 @@ void sqlite3_mutex_enter(sqlite3_mutex *pMutex){ pthread_mutex_unlock(&p->mainMutex); } } + }else{ + assert( p->nRef==0 || pthread_equal(p->owner, pthread_self())==0 ); + pthread_mutex_lock(&p->mutex); + assert( (p->nRef = 1)!=0 ); + assert( (p->owner = pthread_self())==pthread_self() ); } } -int sqlite3_mutex_try(sqlite3_mutex *pMutex){ - if( SQLITE_MTX_FAST == *(int*)pMutex ){ - struct FMutex *p = (struct FMutex*)pMutex; - if( pthread_mutex_trylock(&p->mutex) ){ - return SQLITE_BUSY; - } - }else{ - struct RMutex *p = (struct RMutex*)pMutex; +int sqlite3_mutex_try(sqlite3_mutex *p){ + if( p->id==SQLITE_MUTEX_RECURSIVE ){ pthread_mutex_lock(&p->auxMutex); if( p->nRef==0 ){ p->nRef++; @@ -280,28 +371,36 @@ int sqlite3_mutex_try(sqlite3_mutex *pMutex){ pthread_mutex_unlock(&p->auxMutex); return SQLITE_BUSY; } + }else{ + assert( p->nRef==0 || pthread_equal(p->owner, pthread_self())==0 ); + if( pthread_mutex_trylock(&p->mutex) ){ + return SQLITE_BUSY; + } } return SQLITE_OK; } /* -** The sqlite3_mutex_exit() routine exits a mutex that was +** The sqlite3_mutex_leave() routine exits a mutex that was ** previously entered by the same thread. The behavior ** is undefined if the mutex is not currently entered or ** is not currently allocated. SQLite will never do either. */ void sqlite3_mutex_leave(sqlite3_mutex *pMutex){ - if( SQLITE_MTX_FAST == *(int*)pMutex ){ - struct FMutex *p = (struct FMutex*)pMutex; - pthread_mutex_unlock(&p->mutex); - }else{ - struct RMutex *p = (struct RMutex*)pMutex; + if( p->id==SQLITE_MUTEX_RECURSIVE ){ pthread_mutex_lock(&p->auxMutex); + assert( p->nRef>0 ); + assert( pthread_equal(p->owner, pthread_self()) ); p->nRef--; if( p->nRef<=0 ){ pthread_mutex_unlock(&p->mainMutex); } pthread_mutex_unlock(&p->auxMutex); + }else{ + assert( p->nRef==1 ); + assert( pthread_equal(p->owner, pthread_self()) ); + p->nRef = 0; + pthread_mutex_unlock(&p->mutex); } } @@ -309,12 +408,14 @@ void sqlite3_mutex_leave(sqlite3_mutex *pMutex){ ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are ** intended for use inside assert() statements. */ -int sqlite3_mutex_held(sqlite3_mutex *pNotUsed){ - return 1; +int sqlite3_mutex_held(sqlite3_mutex *p){ + assert( p ); + return p==0 || (p->nRef!=0 && pthread_equal(p->owner, pthread_self())); } int sqlite3_mutex_notheld(sqlite3_mutex *pNotUsed){ - return 1; + assert( p ); + return p==0 || p->nRef==0 || pthread_equal(p->owner, pthread_self())==0; } -#endif /* non-recursive pthreads */ +#endif /* SQLITE_MUTEX_PTHREAD */ #endif /* !defined(SQLITE_MUTEX_APPDEF) */ diff --git a/src/os.c b/src/os.c index aeafb26da0..90dd4a39aa 100644 --- a/src/os.c +++ b/src/os.c @@ -15,7 +15,6 @@ */ #define _SQLITE_OS_C_ 1 #include "sqliteInt.h" -#include "os.h" #undef _SQLITE_OS_C_ /* diff --git a/src/os.h b/src/os.h index 7dfcda6dba..0f6c782c2e 100644 --- a/src/os.h +++ b/src/os.h @@ -13,13 +13,18 @@ ** This header file (together with is companion C source-code file ** "os.c") attempt to abstract the underlying operating system so that ** the SQLite library will work on both POSIX and windows systems. +** +** This header file is #include-ed by sqliteInt.h and thus ends up +** being included by every source file. */ #ifndef _SQLITE_OS_H_ #define _SQLITE_OS_H_ /* ** Figure out if we are dealing with Unix, Windows, or some other -** operating system. +** operating system. After the following block of preprocess macros, +** all of OS_UNIX, OS_WIN, OS_OS2, and OS_OTHER will defined to either +** 1 or 0. One of the four will be 1. The other three will be 0. */ #if defined(OS_OTHER) # if OS_OTHER==1 @@ -60,6 +65,7 @@ #endif + /* ** Define the maximum size of a temporary filename */ diff --git a/src/os_os2.c b/src/os_os2.c index 45d796bdf2..66f19fb460 100644 --- a/src/os_os2.c +++ b/src/os_os2.c @@ -14,7 +14,6 @@ */ #include "sqliteInt.h" -#include "os.h" #if OS_OS2 diff --git a/src/os_unix.c b/src/os_unix.c index 0544e071c0..a268f28bce 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -13,7 +13,6 @@ ** This file contains code that is specific to Unix systems. */ #include "sqliteInt.h" -#include "os.h" #if OS_UNIX /* This file is used on unix only */ /* #define SQLITE_ENABLE_LOCKING_STYLE 0 */ diff --git a/src/os_win.c b/src/os_win.c index 9ebb9dc304..66bf4f6b60 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -13,7 +13,6 @@ ** This file contains code that is specific to windows. */ #include "sqliteInt.h" -#include "os.h" #if OS_WIN /* This file is used for windows only */ #include diff --git a/src/pager.c b/src/pager.c index 871023eb92..f13f34c920 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,12 +18,10 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.362 2007/08/20 16:07:01 danielk1977 Exp $ +** @(#) $Id: pager.c,v 1.363 2007/08/21 10:44:16 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" -#include "os.h" -#include "pager.h" #include #include diff --git a/src/parse.y b/src/parse.y index a051b64a93..5077daf31b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -14,7 +14,7 @@ ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** -** @(#) $Id: parse.y,v 1.233 2007/08/16 10:09:03 danielk1977 Exp $ +** @(#) $Id: parse.y,v 1.234 2007/08/21 10:44:16 drh Exp $ */ // All token codes are small integers with #defines that begin with "TK_" @@ -55,7 +55,6 @@ // %include { #include "sqliteInt.h" -#include "parse.h" /* ** An instance of this structure holds information about the diff --git a/src/pragma.c b/src/pragma.c index f5ed28a4e0..13eee48485 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -11,21 +11,15 @@ ************************************************************************* ** This file contains code used to implement the PRAGMA command. ** -** $Id: pragma.c,v 1.145 2007/08/17 15:53:37 danielk1977 Exp $ +** $Id: pragma.c,v 1.146 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include /* Ignore this whole file if pragmas are disabled */ #if !defined(SQLITE_OMIT_PRAGMA) && !defined(SQLITE_OMIT_PARSER) -#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) -# include "pager.h" -# include "btree.h" -#endif - /* ** Interpret the given string as a safety level. Return 0 for OFF, ** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or diff --git a/src/prepare.c b/src/prepare.c index 256a3e27ad..376fd4e9b6 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -13,10 +13,9 @@ ** interface, and routines that contribute to loading the database schema ** from disk. ** -** $Id: prepare.c,v 1.54 2007/08/16 10:09:03 danielk1977 Exp $ +** $Id: prepare.c,v 1.55 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include /* diff --git a/src/random.c b/src/random.c index 58aa07d801..6443a01e0d 100644 --- a/src/random.c +++ b/src/random.c @@ -15,10 +15,9 @@ ** Random numbers are used by some of the database backends in order ** to generate random integer keys for tables or random filenames. ** -** $Id: random.c,v 1.18 2007/08/20 22:48:43 drh Exp $ +** $Id: random.c,v 1.19 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" /* diff --git a/src/tclsqlite.c b/src/tclsqlite.c index d3fbc375a9..c462900cde 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -12,7 +12,7 @@ ** A TCL Interface to SQLite. Append this file to sqlite3.c and ** compile the whole thing to build a TCL-enabled version of SQLite. ** -** $Id: tclsqlite.c,v 1.195 2007/08/15 19:16:43 drh Exp $ +** $Id: tclsqlite.c,v 1.196 2007/08/21 10:44:16 drh Exp $ */ #include "tcl.h" #include @@ -23,7 +23,6 @@ */ #ifndef SQLITE_AMALGAMATION # include "sqliteInt.h" -# include "hash.h" # include # include # include diff --git a/src/test1.c b/src/test1.c index d46be4526e..d04d8f67ea 100644 --- a/src/test1.c +++ b/src/test1.c @@ -13,11 +13,10 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test1.c,v 1.265 2007/08/20 22:48:43 drh Exp $ +** $Id: test1.c,v 1.266 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" -#include "os.h" #include #include diff --git a/src/test2.c b/src/test2.c index 676b188baa..9480f8f7f9 100644 --- a/src/test2.c +++ b/src/test2.c @@ -13,11 +13,9 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test2.c,v 1.49 2007/08/20 22:48:43 drh Exp $ +** $Id: test2.c,v 1.50 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" -#include "pager.h" #include "tcl.h" #include #include diff --git a/src/test3.c b/src/test3.c index 99f555bcb7..3a1191fd59 100644 --- a/src/test3.c +++ b/src/test3.c @@ -13,11 +13,9 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test3.c,v 1.79 2007/08/20 23:50:25 drh Exp $ +** $Id: test3.c,v 1.80 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "pager.h" -#include "btree.h" #include "tcl.h" #include #include diff --git a/src/test4.c b/src/test4.c index 221db0fb40..57ea1bed63 100644 --- a/src/test4.c +++ b/src/test4.c @@ -11,11 +11,10 @@ ************************************************************************* ** Code for testing the the SQLite library in a multithreaded environment. ** -** $Id: test4.c,v 1.19 2007/08/20 22:48:43 drh Exp $ +** $Id: test4.c,v 1.20 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" -#include "os.h" #if defined(OS_UNIX) && OS_UNIX==1 && SQLITE_THREADSAFE #include #include diff --git a/src/test5.c b/src/test5.c index b9e69d272c..88831b79cd 100644 --- a/src/test5.c +++ b/src/test5.c @@ -15,11 +15,10 @@ ** is used for testing the SQLite routines for converting between ** the various supported unicode encodings. ** -** $Id: test5.c,v 1.18 2007/08/16 10:09:03 danielk1977 Exp $ +** $Id: test5.c,v 1.19 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" -#include "os.h" /* to get SQLITE_BIGENDIAN */ #include "tcl.h" #include #include diff --git a/src/test6.c b/src/test6.c index df7418f091..db20725ed4 100644 --- a/src/test6.c +++ b/src/test6.c @@ -16,7 +16,6 @@ */ #if SQLITE_TEST /* This file is used for the testing only */ #include "sqliteInt.h" -#include "os.h" #include "tcl.h" #ifndef SQLITE_OMIT_DISKIO /* This file is a no-op if disk I/O is disabled */ diff --git a/src/test7.c b/src/test7.c index f3411f90a7..15ebce371f 100644 --- a/src/test7.c +++ b/src/test7.c @@ -12,11 +12,10 @@ ** Code for testing the client/server version of the SQLite library. ** Derived from test4.c. ** -** $Id: test7.c,v 1.6 2007/08/20 22:48:43 drh Exp $ +** $Id: test7.c,v 1.7 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" -#include "os.h" /* ** This test only works on UNIX with a SQLITE_THREADSAFE build that includes diff --git a/src/test8.c b/src/test8.c index 70c6c57f11..28a49a75fc 100644 --- a/src/test8.c +++ b/src/test8.c @@ -13,11 +13,10 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test8.c,v 1.51 2007/08/16 11:36:15 danielk1977 Exp $ +** $Id: test8.c,v 1.52 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" -#include "os.h" #include #include diff --git a/src/test9.c b/src/test9.c index f2ba5e7f66..1e92245fff 100644 --- a/src/test9.c +++ b/src/test9.c @@ -14,11 +14,10 @@ ** for completeness. Test code is written in C for these cases ** as there is not much point in binding to Tcl. ** -** $Id: test9.c,v 1.3 2007/04/23 23:56:32 drh Exp $ +** $Id: test9.c,v 1.4 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" -#include "os.h" #include #include diff --git a/src/test_async.c b/src/test_async.c index ead8442971..6527f1b09b 100644 --- a/src/test_async.c +++ b/src/test_async.c @@ -71,7 +71,6 @@ */ #include "sqliteInt.h" -#include "os.h" #include /* diff --git a/src/test_config.c b/src/test_config.c index fb2b963dce..17c1c584b3 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -16,11 +16,10 @@ ** The focus of this file is providing the TCL testing layer ** access to compile-time constants. ** -** $Id: test_config.c,v 1.10 2007/08/20 23:50:25 drh Exp $ +** $Id: test_config.c,v 1.11 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" -#include "os.h" #include #include diff --git a/src/test_tclvar.c b/src/test_tclvar.c index 03e2ca64af..63f262d8ff 100644 --- a/src/test_tclvar.c +++ b/src/test_tclvar.c @@ -16,11 +16,10 @@ ** The emphasis of this file is a virtual table that provides ** access to TCL variables. ** -** $Id: test_tclvar.c,v 1.13 2007/08/16 11:36:15 danielk1977 Exp $ +** $Id: test_tclvar.c,v 1.14 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" -#include "os.h" #include #include diff --git a/src/tokenize.c b/src/tokenize.c index 774166d7fe..5005fe1b59 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -15,10 +15,9 @@ ** individual tokens and sends those tokens one-by-one over to the ** parser for analysis. ** -** $Id: tokenize.c,v 1.133 2007/08/16 10:09:03 danielk1977 Exp $ +** $Id: tokenize.c,v 1.134 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include #include diff --git a/src/util.c b/src/util.c index 975aa19ba6..694d7da0b8 100644 --- a/src/util.c +++ b/src/util.c @@ -14,10 +14,9 @@ ** This file contains functions for allocating memory, comparing ** strings, and stuff like that. ** -** $Id: util.c,v 1.209 2007/08/16 10:09:03 danielk1977 Exp $ +** $Id: util.c,v 1.210 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include #include diff --git a/src/vacuum.c b/src/vacuum.c index ee0567f174..8be688d44c 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -14,11 +14,10 @@ ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. ** -** $Id: vacuum.c,v 1.70 2007/08/16 04:30:40 drh Exp $ +** $Id: vacuum.c,v 1.71 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" -#include "os.h" #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) /* diff --git a/src/vdbe.c b/src/vdbe.c index 6b12c5f938..80b77615d9 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -43,10 +43,9 @@ ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** -** $Id: vdbe.c,v 1.642 2007/08/17 15:53:37 danielk1977 Exp $ +** $Id: vdbe.c,v 1.643 2007/08/21 10:44:16 drh Exp $ */ #include "sqliteInt.h" -#include "os.h" #include #include #include "vdbeInt.h" diff --git a/src/vdbeapi.c b/src/vdbeapi.c index e8d9ddad56..1226956080 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -15,7 +15,6 @@ */ #include "sqliteInt.h" #include "vdbeInt.h" -#include "os.h" /* ** Return TRUE (non-zero) of the statement supplied as an argument needs diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 206fd0fda4..5eb9d22a6f 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -15,7 +15,6 @@ ** But that file was getting too big so this subroutines were split out. */ #include "sqliteInt.h" -#include "os.h" #include #include "vdbeInt.h" diff --git a/src/vdbemem.c b/src/vdbemem.c index 53b78c28fd..ad911fa0e7 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -16,7 +16,6 @@ ** name sqlite_value */ #include "sqliteInt.h" -#include "os.h" #include #include #include "vdbeInt.h"