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