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>