| OLD | NEW |
| (Empty) |
| 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 ** $Id: mutex_noop.c,v 1.3 2008/12/05 17:17:08 drh Exp $ | |
| 29 */ | |
| 30 #include "sqliteInt.h" | |
| 31 | |
| 32 | |
| 33 #if defined(SQLITE_MUTEX_NOOP) && !defined(SQLITE_DEBUG) | |
| 34 /* | |
| 35 ** Stub routines for all mutex methods. | |
| 36 ** | |
| 37 ** This routines provide no mutual exclusion or error checking. | |
| 38 */ | |
| 39 static int noopMutexHeld(sqlite3_mutex *p){ return 1; } | |
| 40 static int noopMutexNotheld(sqlite3_mutex *p){ return 1; } | |
| 41 static int noopMutexInit(void){ return SQLITE_OK; } | |
| 42 static int noopMutexEnd(void){ return SQLITE_OK; } | |
| 43 static sqlite3_mutex *noopMutexAlloc(int id){ return (sqlite3_mutex*)8; } | |
| 44 static void noopMutexFree(sqlite3_mutex *p){ return; } | |
| 45 static void noopMutexEnter(sqlite3_mutex *p){ return; } | |
| 46 static int noopMutexTry(sqlite3_mutex *p){ return SQLITE_OK; } | |
| 47 static void noopMutexLeave(sqlite3_mutex *p){ return; } | |
| 48 | |
| 49 sqlite3_mutex_methods *sqlite3DefaultMutex(void){ | |
| 50 static sqlite3_mutex_methods sMutex = { | |
| 51 noopMutexInit, | |
| 52 noopMutexEnd, | |
| 53 noopMutexAlloc, | |
| 54 noopMutexFree, | |
| 55 noopMutexEnter, | |
| 56 noopMutexTry, | |
| 57 noopMutexLeave, | |
| 58 | |
| 59 noopMutexHeld, | |
| 60 noopMutexNotheld | |
| 61 }; | |
| 62 | |
| 63 return &sMutex; | |
| 64 } | |
| 65 #endif /* defined(SQLITE_MUTEX_NOOP) && !defined(SQLITE_DEBUG) */ | |
| 66 | |
| 67 #if defined(SQLITE_MUTEX_NOOP) && defined(SQLITE_DEBUG) | |
| 68 /* | |
| 69 ** In this implementation, error checking is provided for testing | |
| 70 ** and debugging purposes. The mutexes still do not provide any | |
| 71 ** mutual exclusion. | |
| 72 */ | |
| 73 | |
| 74 /* | |
| 75 ** The mutex object | |
| 76 */ | |
| 77 struct sqlite3_mutex { | |
| 78 int id; /* The mutex type */ | |
| 79 int cnt; /* Number of entries without a matching leave */ | |
| 80 }; | |
| 81 | |
| 82 /* | |
| 83 ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are | |
| 84 ** intended for use inside assert() statements. | |
| 85 */ | |
| 86 static int debugMutexHeld(sqlite3_mutex *p){ | |
| 87 return p==0 || p->cnt>0; | |
| 88 } | |
| 89 static int debugMutexNotheld(sqlite3_mutex *p){ | |
| 90 return p==0 || p->cnt==0; | |
| 91 } | |
| 92 | |
| 93 /* | |
| 94 ** Initialize and deinitialize the mutex subsystem. | |
| 95 */ | |
| 96 static int debugMutexInit(void){ return SQLITE_OK; } | |
| 97 static int debugMutexEnd(void){ return SQLITE_OK; } | |
| 98 | |
| 99 /* | |
| 100 ** The sqlite3_mutex_alloc() routine allocates a new | |
| 101 ** mutex and returns a pointer to it. If it returns NULL | |
| 102 ** that means that a mutex could not be allocated. | |
| 103 */ | |
| 104 static sqlite3_mutex *debugMutexAlloc(int id){ | |
| 105 static sqlite3_mutex aStatic[6]; | |
| 106 sqlite3_mutex *pNew = 0; | |
| 107 switch( id ){ | |
| 108 case SQLITE_MUTEX_FAST: | |
| 109 case SQLITE_MUTEX_RECURSIVE: { | |
| 110 pNew = sqlite3Malloc(sizeof(*pNew)); | |
| 111 if( pNew ){ | |
| 112 pNew->id = id; | |
| 113 pNew->cnt = 0; | |
| 114 } | |
| 115 break; | |
| 116 } | |
| 117 default: { | |
| 118 assert( id-2 >= 0 ); | |
| 119 assert( id-2 < (int)(sizeof(aStatic)/sizeof(aStatic[0])) ); | |
| 120 pNew = &aStatic[id-2]; | |
| 121 pNew->id = id; | |
| 122 break; | |
| 123 } | |
| 124 } | |
| 125 return pNew; | |
| 126 } | |
| 127 | |
| 128 /* | |
| 129 ** This routine deallocates a previously allocated mutex. | |
| 130 */ | |
| 131 static void debugMutexFree(sqlite3_mutex *p){ | |
| 132 assert( p->cnt==0 ); | |
| 133 assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); | |
| 134 sqlite3_free(p); | |
| 135 } | |
| 136 | |
| 137 /* | |
| 138 ** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt | |
| 139 ** to enter a mutex. If another thread is already within the mutex, | |
| 140 ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return | |
| 141 ** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK | |
| 142 ** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can | |
| 143 ** be entered multiple times by the same thread. In such cases the, | |
| 144 ** mutex must be exited an equal number of times before another thread | |
| 145 ** can enter. If the same thread tries to enter any other kind of mutex | |
| 146 ** more than once, the behavior is undefined. | |
| 147 */ | |
| 148 static void debugMutexEnter(sqlite3_mutex *p){ | |
| 149 assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) ); | |
| 150 p->cnt++; | |
| 151 } | |
| 152 static int debugMutexTry(sqlite3_mutex *p){ | |
| 153 assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) ); | |
| 154 p->cnt++; | |
| 155 return SQLITE_OK; | |
| 156 } | |
| 157 | |
| 158 /* | |
| 159 ** The sqlite3_mutex_leave() routine exits a mutex that was | |
| 160 ** previously entered by the same thread. The behavior | |
| 161 ** is undefined if the mutex is not currently entered or | |
| 162 ** is not currently allocated. SQLite will never do either. | |
| 163 */ | |
| 164 static void debugMutexLeave(sqlite3_mutex *p){ | |
| 165 assert( debugMutexHeld(p) ); | |
| 166 p->cnt--; | |
| 167 assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(p) ); | |
| 168 } | |
| 169 | |
| 170 sqlite3_mutex_methods *sqlite3DefaultMutex(void){ | |
| 171 static sqlite3_mutex_methods sMutex = { | |
| 172 debugMutexInit, | |
| 173 debugMutexEnd, | |
| 174 debugMutexAlloc, | |
| 175 debugMutexFree, | |
| 176 debugMutexEnter, | |
| 177 debugMutexTry, | |
| 178 debugMutexLeave, | |
| 179 | |
| 180 debugMutexHeld, | |
| 181 debugMutexNotheld | |
| 182 }; | |
| 183 | |
| 184 return &sMutex; | |
| 185 } | |
| 186 #endif /* defined(SQLITE_MUTEX_NOOP) && defined(SQLITE_DEBUG) */ | |
| OLD | NEW |