Annotation of embedaddon/sqlite3/src/mutex_noop.c, revision 1.1.1.1

1.1       misho       1: /*
                      2: ** 2008 October 07
                      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 implementation in this file does not provide any mutual
                     15: ** exclusion and is thus suitable for use only in applications
                     16: ** that use SQLite in a single thread.  The routines defined
                     17: ** here are place-holders.  Applications can substitute working
                     18: ** mutex routines at start-time using the
                     19: **
                     20: **     sqlite3_config(SQLITE_CONFIG_MUTEX,...)
                     21: **
                     22: ** interface.
                     23: **
                     24: ** If compiled with SQLITE_DEBUG, then additional logic is inserted
                     25: ** that does error checking on mutexes to make sure they are being
                     26: ** called correctly.
                     27: */
                     28: #include "sqliteInt.h"
                     29: 
                     30: #ifndef SQLITE_MUTEX_OMIT
                     31: 
                     32: #ifndef SQLITE_DEBUG
                     33: /*
                     34: ** Stub routines for all mutex methods.
                     35: **
                     36: ** This routines provide no mutual exclusion or error checking.
                     37: */
                     38: static int noopMutexInit(void){ return SQLITE_OK; }
                     39: static int noopMutexEnd(void){ return SQLITE_OK; }
                     40: static sqlite3_mutex *noopMutexAlloc(int id){ 
                     41:   UNUSED_PARAMETER(id);
                     42:   return (sqlite3_mutex*)8; 
                     43: }
                     44: static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; }
                     45: static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; }
                     46: static int noopMutexTry(sqlite3_mutex *p){
                     47:   UNUSED_PARAMETER(p);
                     48:   return SQLITE_OK;
                     49: }
                     50: static void noopMutexLeave(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; }
                     51: 
                     52: sqlite3_mutex_methods const *sqlite3NoopMutex(void){
                     53:   static const sqlite3_mutex_methods sMutex = {
                     54:     noopMutexInit,
                     55:     noopMutexEnd,
                     56:     noopMutexAlloc,
                     57:     noopMutexFree,
                     58:     noopMutexEnter,
                     59:     noopMutexTry,
                     60:     noopMutexLeave,
                     61: 
                     62:     0,
                     63:     0,
                     64:   };
                     65: 
                     66:   return &sMutex;
                     67: }
                     68: #endif /* !SQLITE_DEBUG */
                     69: 
                     70: #ifdef SQLITE_DEBUG
                     71: /*
                     72: ** In this implementation, error checking is provided for testing
                     73: ** and debugging purposes.  The mutexes still do not provide any
                     74: ** mutual exclusion.
                     75: */
                     76: 
                     77: /*
                     78: ** The mutex object
                     79: */
                     80: typedef struct sqlite3_debug_mutex {
                     81:   int id;     /* The mutex type */
                     82:   int cnt;    /* Number of entries without a matching leave */
                     83: } sqlite3_debug_mutex;
                     84: 
                     85: /*
                     86: ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
                     87: ** intended for use inside assert() statements.
                     88: */
                     89: static int debugMutexHeld(sqlite3_mutex *pX){
                     90:   sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
                     91:   return p==0 || p->cnt>0;
                     92: }
                     93: static int debugMutexNotheld(sqlite3_mutex *pX){
                     94:   sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
                     95:   return p==0 || p->cnt==0;
                     96: }
                     97: 
                     98: /*
                     99: ** Initialize and deinitialize the mutex subsystem.
                    100: */
                    101: static int debugMutexInit(void){ return SQLITE_OK; }
                    102: static int debugMutexEnd(void){ return SQLITE_OK; }
                    103: 
                    104: /*
                    105: ** The sqlite3_mutex_alloc() routine allocates a new
                    106: ** mutex and returns a pointer to it.  If it returns NULL
                    107: ** that means that a mutex could not be allocated. 
                    108: */
                    109: static sqlite3_mutex *debugMutexAlloc(int id){
                    110:   static sqlite3_debug_mutex aStatic[6];
                    111:   sqlite3_debug_mutex *pNew = 0;
                    112:   switch( id ){
                    113:     case SQLITE_MUTEX_FAST:
                    114:     case SQLITE_MUTEX_RECURSIVE: {
                    115:       pNew = sqlite3Malloc(sizeof(*pNew));
                    116:       if( pNew ){
                    117:         pNew->id = id;
                    118:         pNew->cnt = 0;
                    119:       }
                    120:       break;
                    121:     }
                    122:     default: {
                    123:       assert( id-2 >= 0 );
                    124:       assert( id-2 < (int)(sizeof(aStatic)/sizeof(aStatic[0])) );
                    125:       pNew = &aStatic[id-2];
                    126:       pNew->id = id;
                    127:       break;
                    128:     }
                    129:   }
                    130:   return (sqlite3_mutex*)pNew;
                    131: }
                    132: 
                    133: /*
                    134: ** This routine deallocates a previously allocated mutex.
                    135: */
                    136: static void debugMutexFree(sqlite3_mutex *pX){
                    137:   sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
                    138:   assert( p->cnt==0 );
                    139:   assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
                    140:   sqlite3_free(p);
                    141: }
                    142: 
                    143: /*
                    144: ** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
                    145: ** to enter a mutex.  If another thread is already within the mutex,
                    146: ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
                    147: ** SQLITE_BUSY.  The sqlite3_mutex_try() interface returns SQLITE_OK
                    148: ** upon successful entry.  Mutexes created using SQLITE_MUTEX_RECURSIVE can
                    149: ** be entered multiple times by the same thread.  In such cases the,
                    150: ** mutex must be exited an equal number of times before another thread
                    151: ** can enter.  If the same thread tries to enter any other kind of mutex
                    152: ** more than once, the behavior is undefined.
                    153: */
                    154: static void debugMutexEnter(sqlite3_mutex *pX){
                    155:   sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
                    156:   assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
                    157:   p->cnt++;
                    158: }
                    159: static int debugMutexTry(sqlite3_mutex *pX){
                    160:   sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
                    161:   assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
                    162:   p->cnt++;
                    163:   return SQLITE_OK;
                    164: }
                    165: 
                    166: /*
                    167: ** The sqlite3_mutex_leave() routine exits a mutex that was
                    168: ** previously entered by the same thread.  The behavior
                    169: ** is undefined if the mutex is not currently entered or
                    170: ** is not currently allocated.  SQLite will never do either.
                    171: */
                    172: static void debugMutexLeave(sqlite3_mutex *pX){
                    173:   sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
                    174:   assert( debugMutexHeld(pX) );
                    175:   p->cnt--;
                    176:   assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
                    177: }
                    178: 
                    179: sqlite3_mutex_methods const *sqlite3NoopMutex(void){
                    180:   static const sqlite3_mutex_methods sMutex = {
                    181:     debugMutexInit,
                    182:     debugMutexEnd,
                    183:     debugMutexAlloc,
                    184:     debugMutexFree,
                    185:     debugMutexEnter,
                    186:     debugMutexTry,
                    187:     debugMutexLeave,
                    188: 
                    189:     debugMutexHeld,
                    190:     debugMutexNotheld
                    191:   };
                    192: 
                    193:   return &sMutex;
                    194: }
                    195: #endif /* SQLITE_DEBUG */
                    196: 
                    197: /*
                    198: ** If compiled with SQLITE_MUTEX_NOOP, then the no-op mutex implementation
                    199: ** is used regardless of the run-time threadsafety setting.
                    200: */
                    201: #ifdef SQLITE_MUTEX_NOOP
                    202: sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
                    203:   return sqlite3NoopMutex();
                    204: }
                    205: #endif /* defined(SQLITE_MUTEX_NOOP) */
                    206: #endif /* !defined(SQLITE_MUTEX_OMIT) */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>