| Index: third_party/sqlite/sqlite-src-3070603/src/mutex.c | 
| diff --git a/third_party/sqlite/sqlite-src-3070603/src/mutex.c b/third_party/sqlite/sqlite-src-3070603/src/mutex.c | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..869a4aeb08d262995bbffcc11b4e6debb8e3088f | 
| --- /dev/null | 
| +++ b/third_party/sqlite/sqlite-src-3070603/src/mutex.c | 
| @@ -0,0 +1,153 @@ | 
| +/* | 
| +** 2007 August 14 | 
| +** | 
| +** 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 the C functions that implement mutexes. | 
| +** | 
| +** This file contains code that is common across all mutex implementations. | 
| +*/ | 
| +#include "sqliteInt.h" | 
| + | 
| +#if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT) | 
| +/* | 
| +** For debugging purposes, record when the mutex subsystem is initialized | 
| +** and uninitialized so that we can assert() if there is an attempt to | 
| +** allocate a mutex while the system is uninitialized. | 
| +*/ | 
| +static SQLITE_WSD int mutexIsInit = 0; | 
| +#endif /* SQLITE_DEBUG */ | 
| + | 
| + | 
| +#ifndef SQLITE_MUTEX_OMIT | 
| +/* | 
| +** Initialize the mutex system. | 
| +*/ | 
| +int sqlite3MutexInit(void){ | 
| +  int rc = SQLITE_OK; | 
| +  if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){ | 
| +    /* If the xMutexAlloc method has not been set, then the user did not | 
| +    ** install a mutex implementation via sqlite3_config() prior to | 
| +    ** sqlite3_initialize() being called. This block copies pointers to | 
| +    ** the default implementation into the sqlite3GlobalConfig structure. | 
| +    */ | 
| +    sqlite3_mutex_methods const *pFrom; | 
| +    sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex; | 
| + | 
| +    if( sqlite3GlobalConfig.bCoreMutex ){ | 
| +      pFrom = sqlite3DefaultMutex(); | 
| +    }else{ | 
| +      pFrom = sqlite3NoopMutex(); | 
| +    } | 
| +    memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc)); | 
| +    memcpy(&pTo->xMutexFree, &pFrom->xMutexFree, | 
| +           sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree)); | 
| +    pTo->xMutexAlloc = pFrom->xMutexAlloc; | 
| +  } | 
| +  rc = sqlite3GlobalConfig.mutex.xMutexInit(); | 
| + | 
| +#ifdef SQLITE_DEBUG | 
| +  GLOBAL(int, mutexIsInit) = 1; | 
| +#endif | 
| + | 
| +  return rc; | 
| +} | 
| + | 
| +/* | 
| +** Shutdown the mutex system. This call frees resources allocated by | 
| +** sqlite3MutexInit(). | 
| +*/ | 
| +int sqlite3MutexEnd(void){ | 
| +  int rc = SQLITE_OK; | 
| +  if( sqlite3GlobalConfig.mutex.xMutexEnd ){ | 
| +    rc = sqlite3GlobalConfig.mutex.xMutexEnd(); | 
| +  } | 
| + | 
| +#ifdef SQLITE_DEBUG | 
| +  GLOBAL(int, mutexIsInit) = 0; | 
| +#endif | 
| + | 
| +  return rc; | 
| +} | 
| + | 
| +/* | 
| +** Retrieve a pointer to a static mutex or allocate a new dynamic one. | 
| +*/ | 
| +sqlite3_mutex *sqlite3_mutex_alloc(int id){ | 
| +#ifndef SQLITE_OMIT_AUTOINIT | 
| +  if( sqlite3_initialize() ) return 0; | 
| +#endif | 
| +  return sqlite3GlobalConfig.mutex.xMutexAlloc(id); | 
| +} | 
| + | 
| +sqlite3_mutex *sqlite3MutexAlloc(int id){ | 
| +  if( !sqlite3GlobalConfig.bCoreMutex ){ | 
| +    return 0; | 
| +  } | 
| +  assert( GLOBAL(int, mutexIsInit) ); | 
| +  return sqlite3GlobalConfig.mutex.xMutexAlloc(id); | 
| +} | 
| + | 
| +/* | 
| +** Free a dynamic mutex. | 
| +*/ | 
| +void sqlite3_mutex_free(sqlite3_mutex *p){ | 
| +  if( p ){ | 
| +    sqlite3GlobalConfig.mutex.xMutexFree(p); | 
| +  } | 
| +} | 
| + | 
| +/* | 
| +** Obtain the mutex p. If some other thread already has the mutex, block | 
| +** until it can be obtained. | 
| +*/ | 
| +void sqlite3_mutex_enter(sqlite3_mutex *p){ | 
| +  if( p ){ | 
| +    sqlite3GlobalConfig.mutex.xMutexEnter(p); | 
| +  } | 
| +} | 
| + | 
| +/* | 
| +** Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another | 
| +** thread holds the mutex and it cannot be obtained, return SQLITE_BUSY. | 
| +*/ | 
| +int sqlite3_mutex_try(sqlite3_mutex *p){ | 
| +  int rc = SQLITE_OK; | 
| +  if( p ){ | 
| +    return sqlite3GlobalConfig.mutex.xMutexTry(p); | 
| +  } | 
| +  return rc; | 
| +} | 
| + | 
| +/* | 
| +** 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. If a NULL pointer is passed as an argument | 
| +** this function is a no-op. | 
| +*/ | 
| +void sqlite3_mutex_leave(sqlite3_mutex *p){ | 
| +  if( p ){ | 
| +    sqlite3GlobalConfig.mutex.xMutexLeave(p); | 
| +  } | 
| +} | 
| + | 
| +#ifndef NDEBUG | 
| +/* | 
| +** 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 || sqlite3GlobalConfig.mutex.xMutexHeld(p); | 
| +} | 
| +int sqlite3_mutex_notheld(sqlite3_mutex *p){ | 
| +  return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p); | 
| +} | 
| +#endif | 
| + | 
| +#endif /* SQLITE_MUTEX_OMIT */ | 
|  |