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>