Annotation of embedaddon/sqlite3/src/mutex.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2007 August 14
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** May you do good and not evil.
! 8: ** May you find forgiveness for yourself and forgive others.
! 9: ** May you share freely, never taking more than you give.
! 10: **
! 11: *************************************************************************
! 12: ** This file contains the C functions that implement mutexes.
! 13: **
! 14: ** This file contains code that is common across all mutex implementations.
! 15: */
! 16: #include "sqliteInt.h"
! 17:
! 18: #if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT)
! 19: /*
! 20: ** For debugging purposes, record when the mutex subsystem is initialized
! 21: ** and uninitialized so that we can assert() if there is an attempt to
! 22: ** allocate a mutex while the system is uninitialized.
! 23: */
! 24: static SQLITE_WSD int mutexIsInit = 0;
! 25: #endif /* SQLITE_DEBUG */
! 26:
! 27:
! 28: #ifndef SQLITE_MUTEX_OMIT
! 29: /*
! 30: ** Initialize the mutex system.
! 31: */
! 32: int sqlite3MutexInit(void){
! 33: int rc = SQLITE_OK;
! 34: if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){
! 35: /* If the xMutexAlloc method has not been set, then the user did not
! 36: ** install a mutex implementation via sqlite3_config() prior to
! 37: ** sqlite3_initialize() being called. This block copies pointers to
! 38: ** the default implementation into the sqlite3GlobalConfig structure.
! 39: */
! 40: sqlite3_mutex_methods const *pFrom;
! 41: sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
! 42:
! 43: if( sqlite3GlobalConfig.bCoreMutex ){
! 44: pFrom = sqlite3DefaultMutex();
! 45: }else{
! 46: pFrom = sqlite3NoopMutex();
! 47: }
! 48: memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc));
! 49: memcpy(&pTo->xMutexFree, &pFrom->xMutexFree,
! 50: sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree));
! 51: pTo->xMutexAlloc = pFrom->xMutexAlloc;
! 52: }
! 53: rc = sqlite3GlobalConfig.mutex.xMutexInit();
! 54:
! 55: #ifdef SQLITE_DEBUG
! 56: GLOBAL(int, mutexIsInit) = 1;
! 57: #endif
! 58:
! 59: return rc;
! 60: }
! 61:
! 62: /*
! 63: ** Shutdown the mutex system. This call frees resources allocated by
! 64: ** sqlite3MutexInit().
! 65: */
! 66: int sqlite3MutexEnd(void){
! 67: int rc = SQLITE_OK;
! 68: if( sqlite3GlobalConfig.mutex.xMutexEnd ){
! 69: rc = sqlite3GlobalConfig.mutex.xMutexEnd();
! 70: }
! 71:
! 72: #ifdef SQLITE_DEBUG
! 73: GLOBAL(int, mutexIsInit) = 0;
! 74: #endif
! 75:
! 76: return rc;
! 77: }
! 78:
! 79: /*
! 80: ** Retrieve a pointer to a static mutex or allocate a new dynamic one.
! 81: */
! 82: sqlite3_mutex *sqlite3_mutex_alloc(int id){
! 83: #ifndef SQLITE_OMIT_AUTOINIT
! 84: if( sqlite3_initialize() ) return 0;
! 85: #endif
! 86: return sqlite3GlobalConfig.mutex.xMutexAlloc(id);
! 87: }
! 88:
! 89: sqlite3_mutex *sqlite3MutexAlloc(int id){
! 90: if( !sqlite3GlobalConfig.bCoreMutex ){
! 91: return 0;
! 92: }
! 93: assert( GLOBAL(int, mutexIsInit) );
! 94: return sqlite3GlobalConfig.mutex.xMutexAlloc(id);
! 95: }
! 96:
! 97: /*
! 98: ** Free a dynamic mutex.
! 99: */
! 100: void sqlite3_mutex_free(sqlite3_mutex *p){
! 101: if( p ){
! 102: sqlite3GlobalConfig.mutex.xMutexFree(p);
! 103: }
! 104: }
! 105:
! 106: /*
! 107: ** Obtain the mutex p. If some other thread already has the mutex, block
! 108: ** until it can be obtained.
! 109: */
! 110: void sqlite3_mutex_enter(sqlite3_mutex *p){
! 111: if( p ){
! 112: sqlite3GlobalConfig.mutex.xMutexEnter(p);
! 113: }
! 114: }
! 115:
! 116: /*
! 117: ** Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another
! 118: ** thread holds the mutex and it cannot be obtained, return SQLITE_BUSY.
! 119: */
! 120: int sqlite3_mutex_try(sqlite3_mutex *p){
! 121: int rc = SQLITE_OK;
! 122: if( p ){
! 123: return sqlite3GlobalConfig.mutex.xMutexTry(p);
! 124: }
! 125: return rc;
! 126: }
! 127:
! 128: /*
! 129: ** The sqlite3_mutex_leave() routine exits a mutex that was previously
! 130: ** entered by the same thread. The behavior is undefined if the mutex
! 131: ** is not currently entered. If a NULL pointer is passed as an argument
! 132: ** this function is a no-op.
! 133: */
! 134: void sqlite3_mutex_leave(sqlite3_mutex *p){
! 135: if( p ){
! 136: sqlite3GlobalConfig.mutex.xMutexLeave(p);
! 137: }
! 138: }
! 139:
! 140: #ifndef NDEBUG
! 141: /*
! 142: ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
! 143: ** intended for use inside assert() statements.
! 144: */
! 145: int sqlite3_mutex_held(sqlite3_mutex *p){
! 146: return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p);
! 147: }
! 148: int sqlite3_mutex_notheld(sqlite3_mutex *p){
! 149: return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p);
! 150: }
! 151: #endif
! 152:
! 153: #endif /* !defined(SQLITE_MUTEX_OMIT) */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>