Annotation of embedaddon/sqlite3/src/mutex.c, revision 1.1.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>