| Index: third_party/sqlite/src/src/mutex.c
|
| diff --git a/third_party/sqlite/src/src/mutex.c b/third_party/sqlite/src/src/mutex.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..869a4aeb08d262995bbffcc11b4e6debb8e3088f
|
| --- /dev/null
|
| +++ b/third_party/sqlite/src/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 */
|
|
|