| 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,
|
|
|