Index: third_party/sqlite/src/src/mutex_unix.c |
diff --git a/third_party/sqlite/src/src/mutex_unix.c b/third_party/sqlite/src/src/mutex_unix.c |
index dc57988e2f74fdf09d3f531949f40688d41bcc5e..aa9a8cf2650beb5d810e9a41d4bf5826ff26bbb6 100644 |
--- a/third_party/sqlite/src/src/mutex_unix.c |
+++ b/third_party/sqlite/src/src/mutex_unix.c |
@@ -10,8 +10,6 @@ |
** |
************************************************************************* |
** This file contains the C functions that implement mutexes for pthreads |
-** |
-** $Id: mutex_unix.c,v 1.16 2008/12/08 18:19:18 drh Exp $ |
*/ |
#include "sqliteInt.h" |
@@ -26,23 +24,33 @@ |
#include <pthread.h> |
+/* |
+** The sqlite3_mutex.id, sqlite3_mutex.nRef, and sqlite3_mutex.owner fields |
+** are necessary under two condidtions: (1) Debug builds and (2) using |
+** home-grown mutexes. Encapsulate these conditions into a single #define. |
+*/ |
+#if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX) |
+# define SQLITE_MUTEX_NREF 1 |
+#else |
+# define SQLITE_MUTEX_NREF 0 |
+#endif |
/* |
** Each recursive mutex is an instance of the following structure. |
*/ |
struct sqlite3_mutex { |
pthread_mutex_t mutex; /* Mutex controlling the lock */ |
+#if SQLITE_MUTEX_NREF |
int id; /* Mutex type */ |
- int nRef; /* Number of entrances */ |
- pthread_t owner; /* Thread that is within this mutex */ |
-#ifdef SQLITE_DEBUG |
+ volatile int nRef; /* Number of entrances */ |
+ volatile pthread_t owner; /* Thread that is within this mutex */ |
int trace; /* True to trace changes */ |
#endif |
}; |
-#ifdef SQLITE_DEBUG |
+#if SQLITE_MUTEX_NREF |
#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0, (pthread_t)0, 0 } |
#else |
-#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0, (pthread_t)0 } |
+#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER } |
#endif |
/* |
@@ -91,7 +99,7 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; } |
** <li> SQLITE_MUTEX_STATIC_MEM2 |
** <li> SQLITE_MUTEX_STATIC_PRNG |
** <li> SQLITE_MUTEX_STATIC_LRU |
-** <li> SQLITE_MUTEX_STATIC_LRU2 |
+** <li> SQLITE_MUTEX_STATIC_PMEM |
** </ul> |
** |
** The first two constants cause sqlite3_mutex_alloc() to create |
@@ -144,14 +152,18 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ |
pthread_mutex_init(&p->mutex, &recursiveAttr); |
pthread_mutexattr_destroy(&recursiveAttr); |
#endif |
+#if SQLITE_MUTEX_NREF |
p->id = iType; |
+#endif |
} |
break; |
} |
case SQLITE_MUTEX_FAST: { |
p = sqlite3MallocZero( sizeof(*p) ); |
if( p ){ |
+#if SQLITE_MUTEX_NREF |
p->id = iType; |
+#endif |
pthread_mutex_init(&p->mutex, 0); |
} |
break; |
@@ -160,7 +172,9 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ |
assert( iType-2 >= 0 ); |
assert( iType-2 < ArraySize(staticMutexes) ); |
p = &staticMutexes[iType-2]; |
+#if SQLITE_MUTEX_NREF |
p->id = iType; |
+#endif |
break; |
} |
} |
@@ -220,9 +234,12 @@ static void pthreadMutexEnter(sqlite3_mutex *p){ |
/* Use the built-in recursive mutexes if they are available. |
*/ |
pthread_mutex_lock(&p->mutex); |
+#if SQLITE_MUTEX_NREF |
+ assert( p->nRef>0 || p->owner==0 ); |
p->owner = pthread_self(); |
p->nRef++; |
#endif |
+#endif |
#ifdef SQLITE_DEBUG |
if( p->trace ){ |
@@ -263,8 +280,10 @@ static int pthreadMutexTry(sqlite3_mutex *p){ |
/* Use the built-in recursive mutexes if they are available. |
*/ |
if( pthread_mutex_trylock(&p->mutex)==0 ){ |
+#if SQLITE_MUTEX_NREF |
p->owner = pthread_self(); |
p->nRef++; |
+#endif |
rc = SQLITE_OK; |
}else{ |
rc = SQLITE_BUSY; |
@@ -287,7 +306,10 @@ static int pthreadMutexTry(sqlite3_mutex *p){ |
*/ |
static void pthreadMutexLeave(sqlite3_mutex *p){ |
assert( pthreadMutexHeld(p) ); |
+#if SQLITE_MUTEX_NREF |
p->nRef--; |
+ if( p->nRef==0 ) p->owner = 0; |
+#endif |
assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE ); |
#ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX |
@@ -305,8 +327,8 @@ static void pthreadMutexLeave(sqlite3_mutex *p){ |
#endif |
} |
-sqlite3_mutex_methods *sqlite3DefaultMutex(void){ |
- static sqlite3_mutex_methods sMutex = { |
+sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ |
+ static const sqlite3_mutex_methods sMutex = { |
pthreadMutexInit, |
pthreadMutexEnd, |
pthreadMutexAlloc, |