extensions/sqlite/sqlite-source/mutex_unix.c
changeset 3594 0a382baff180
parent 3593 f04de1a697bd
child 3595 09c38814fe7b
     1.1 --- a/extensions/sqlite/sqlite-source/mutex_unix.c	Fri Aug 03 07:56:31 2012 -0400
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,223 +0,0 @@
     1.4 -/*
     1.5 -** 2007 August 28
     1.6 -**
     1.7 -** The author disclaims copyright to this source code.  In place of
     1.8 -** a legal notice, here is a blessing:
     1.9 -**
    1.10 -**    May you do good and not evil.
    1.11 -**    May you find forgiveness for yourself and forgive others.
    1.12 -**    May you share freely, never taking more than you give.
    1.13 -**
    1.14 -*************************************************************************
    1.15 -** This file contains the C functions that implement mutexes for pthreads
    1.16 -**
    1.17 -** $Id$
    1.18 -*/
    1.19 -#include "sqliteInt.h"
    1.20 -
    1.21 -/*
    1.22 -** The code in this file is only used if we are compiling threadsafe
    1.23 -** under unix with pthreads.
    1.24 -**
    1.25 -** Note that this implementation requires a version of pthreads that
    1.26 -** supports recursive mutexes.
    1.27 -*/
    1.28 -#ifdef SQLITE_MUTEX_PTHREADS
    1.29 -
    1.30 -#include <pthread.h>
    1.31 -
    1.32 -/*
    1.33 -** Each recursive mutex is an instance of the following structure.
    1.34 -*/
    1.35 -struct sqlite3_mutex {
    1.36 -  pthread_mutex_t mutex;     /* Mutex controlling the lock */
    1.37 -  int id;                    /* Mutex type */
    1.38 -  int nRef;                  /* Number of entrances */
    1.39 -  pthread_t owner;           /* Thread that is within this mutex */
    1.40 -#ifdef SQLITE_DEBUG
    1.41 -  int trace;                 /* True to trace changes */
    1.42 -#endif
    1.43 -};
    1.44 -
    1.45 -/*
    1.46 -** The sqlite3_mutex_alloc() routine allocates a new
    1.47 -** mutex and returns a pointer to it.  If it returns NULL
    1.48 -** that means that a mutex could not be allocated.  SQLite
    1.49 -** will unwind its stack and return an error.  The argument
    1.50 -** to sqlite3_mutex_alloc() is one of these integer constants:
    1.51 -**
    1.52 -** <ul>
    1.53 -** <li>  SQLITE_MUTEX_FAST
    1.54 -** <li>  SQLITE_MUTEX_RECURSIVE
    1.55 -** <li>  SQLITE_MUTEX_STATIC_MASTER
    1.56 -** <li>  SQLITE_MUTEX_STATIC_MEM
    1.57 -** <li>  SQLITE_MUTEX_STATIC_MEM2
    1.58 -** <li>  SQLITE_MUTEX_STATIC_PRNG
    1.59 -** <li>  SQLITE_MUTEX_STATIC_LRU
    1.60 -** </ul>
    1.61 -**
    1.62 -** The first two constants cause sqlite3_mutex_alloc() to create
    1.63 -** a new mutex.  The new mutex is recursive when SQLITE_MUTEX_RECURSIVE
    1.64 -** is used but not necessarily so when SQLITE_MUTEX_FAST is used.
    1.65 -** The mutex implementation does not need to make a distinction
    1.66 -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does
    1.67 -** not want to.  But SQLite will only request a recursive mutex in
    1.68 -** cases where it really needs one.  If a faster non-recursive mutex
    1.69 -** implementation is available on the host platform, the mutex subsystem
    1.70 -** might return such a mutex in response to SQLITE_MUTEX_FAST.
    1.71 -**
    1.72 -** The other allowed parameters to sqlite3_mutex_alloc() each return
    1.73 -** a pointer to a static preexisting mutex.  Three static mutexes are
    1.74 -** used by the current version of SQLite.  Future versions of SQLite
    1.75 -** may add additional static mutexes.  Static mutexes are for internal
    1.76 -** use by SQLite only.  Applications that use SQLite mutexes should
    1.77 -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or
    1.78 -** SQLITE_MUTEX_RECURSIVE.
    1.79 -**
    1.80 -** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
    1.81 -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc()
    1.82 -** returns a different mutex on every call.  But for the static 
    1.83 -** mutex types, the same mutex is returned on every call that has
    1.84 -** the same type number.
    1.85 -*/
    1.86 -sqlite3_mutex *sqlite3_mutex_alloc(int iType){
    1.87 -  static sqlite3_mutex staticMutexes[] = {
    1.88 -    { PTHREAD_MUTEX_INITIALIZER, },
    1.89 -    { PTHREAD_MUTEX_INITIALIZER, },
    1.90 -    { PTHREAD_MUTEX_INITIALIZER, },
    1.91 -    { PTHREAD_MUTEX_INITIALIZER, },
    1.92 -    { PTHREAD_MUTEX_INITIALIZER, },
    1.93 -  };
    1.94 -  sqlite3_mutex *p;
    1.95 -  switch( iType ){
    1.96 -    case SQLITE_MUTEX_RECURSIVE: {
    1.97 -      p = sqlite3MallocZero( sizeof(*p) );
    1.98 -      if( p ){
    1.99 -        pthread_mutexattr_t recursiveAttr;
   1.100 -        pthread_mutexattr_init(&recursiveAttr);
   1.101 -        pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE);
   1.102 -        pthread_mutex_init(&p->mutex, &recursiveAttr);
   1.103 -        pthread_mutexattr_destroy(&recursiveAttr);
   1.104 -        p->id = iType;
   1.105 -      }
   1.106 -      break;
   1.107 -    }
   1.108 -    case SQLITE_MUTEX_FAST: {
   1.109 -      p = sqlite3MallocZero( sizeof(*p) );
   1.110 -      if( p ){
   1.111 -        p->id = iType;
   1.112 -        pthread_mutex_init(&p->mutex, 0);
   1.113 -      }
   1.114 -      break;
   1.115 -    }
   1.116 -    default: {
   1.117 -      assert( iType-2 >= 0 );
   1.118 -      assert( iType-2 < sizeof(staticMutexes)/sizeof(staticMutexes[0]) );
   1.119 -      p = &staticMutexes[iType-2];
   1.120 -      p->id = iType;
   1.121 -      break;
   1.122 -    }
   1.123 -  }
   1.124 -  return p;
   1.125 -}
   1.126 -
   1.127 -
   1.128 -/*
   1.129 -** This routine deallocates a previously
   1.130 -** allocated mutex.  SQLite is careful to deallocate every
   1.131 -** mutex that it allocates.
   1.132 -*/
   1.133 -void sqlite3_mutex_free(sqlite3_mutex *p){
   1.134 -  assert( p );
   1.135 -  assert( p->nRef==0 );
   1.136 -  assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
   1.137 -  pthread_mutex_destroy(&p->mutex);
   1.138 -  sqlite3_free(p);
   1.139 -}
   1.140 -
   1.141 -/*
   1.142 -** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
   1.143 -** to enter a mutex.  If another thread is already within the mutex,
   1.144 -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
   1.145 -** SQLITE_BUSY.  The sqlite3_mutex_try() interface returns SQLITE_OK
   1.146 -** upon successful entry.  Mutexes created using SQLITE_MUTEX_RECURSIVE can
   1.147 -** be entered multiple times by the same thread.  In such cases the,
   1.148 -** mutex must be exited an equal number of times before another thread
   1.149 -** can enter.  If the same thread tries to enter any other kind of mutex
   1.150 -** more than once, the behavior is undefined.
   1.151 -*/
   1.152 -void sqlite3_mutex_enter(sqlite3_mutex *p){
   1.153 -  assert( p );
   1.154 -  assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
   1.155 -  pthread_mutex_lock(&p->mutex);
   1.156 -  p->owner = pthread_self();
   1.157 -  p->nRef++;
   1.158 -#ifdef SQLITE_DEBUG
   1.159 -  if( p->trace ){
   1.160 -    printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
   1.161 -  }
   1.162 -#endif
   1.163 -}
   1.164 -int sqlite3_mutex_try(sqlite3_mutex *p){
   1.165 -  int rc;
   1.166 -  assert( p );
   1.167 -  assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
   1.168 -  if( pthread_mutex_trylock(&p->mutex)==0 ){
   1.169 -    p->owner = pthread_self();
   1.170 -    p->nRef++;
   1.171 -    rc = SQLITE_OK;
   1.172 -#ifdef SQLITE_DEBUG
   1.173 -    if( p->trace ){
   1.174 -      printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
   1.175 -    }
   1.176 -#endif
   1.177 -  }else{
   1.178 -    rc = SQLITE_BUSY;
   1.179 -  }
   1.180 -  return rc;
   1.181 -}
   1.182 -
   1.183 -/*
   1.184 -** The sqlite3_mutex_leave() routine exits a mutex that was
   1.185 -** previously entered by the same thread.  The behavior
   1.186 -** is undefined if the mutex is not currently entered or
   1.187 -** is not currently allocated.  SQLite will never do either.
   1.188 -*/
   1.189 -void sqlite3_mutex_leave(sqlite3_mutex *p){
   1.190 -  assert( p );
   1.191 -  assert( sqlite3_mutex_held(p) );
   1.192 -  p->nRef--;
   1.193 -  assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
   1.194 -#ifdef SQLITE_DEBUG
   1.195 -  if( p->trace ){
   1.196 -    printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
   1.197 -  }
   1.198 -#endif
   1.199 -  pthread_mutex_unlock(&p->mutex);
   1.200 -}
   1.201 -
   1.202 -/*
   1.203 -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
   1.204 -** intended for use only inside assert() statements.  On some platforms,
   1.205 -** there might be race conditions that can cause these routines to
   1.206 -** deliver incorrect results.  In particular, if pthread_equal() is
   1.207 -** not an atomic operation, then these routines might delivery
   1.208 -** incorrect results.  On most platforms, pthread_equal() is a 
   1.209 -** comparison of two integers and is therefore atomic.  But we are
   1.210 -** told that HPUX is not such a platform.  If so, then these routines
   1.211 -** will not always work correctly on HPUX.
   1.212 -**
   1.213 -** On those platforms where pthread_equal() is not atomic, SQLite
   1.214 -** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to
   1.215 -** make sure no assert() statements are evaluated and hence these
   1.216 -** routines are never called.
   1.217 -*/
   1.218 -#ifndef NDEBUG
   1.219 -int sqlite3_mutex_held(sqlite3_mutex *p){
   1.220 -  return p==0 || (p->nRef!=0 && pthread_equal(p->owner, pthread_self()));
   1.221 -}
   1.222 -int sqlite3_mutex_notheld(sqlite3_mutex *p){
   1.223 -  return p==0 || p->nRef==0 || pthread_equal(p->owner, pthread_self())==0;
   1.224 -}
   1.225 -#endif
   1.226 -#endif /* SQLITE_MUTEX_PTHREAD */