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 */ |