/ Hex Artifact Content
Login

Artifact 58c1a764c37ba3c139cfb9cd8c7449eb7b4d68d9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 14.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20   contains the C 
0190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
01a0: 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 65 78 65 73  mplement mutexes
01b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ..**.** This fil
01c0: 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  e contains code 
01d0: 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 61  that is common a
01e0: 63 72 6f 73 73 20 61 6c 6c 20 6d 75 74 65 78 20  cross all mutex 
01f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
0200: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0210: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 20  liteInt.h"..#if 
0220: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
0230: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
0240: 64 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f  d(SQLITE_MUTEX_O
0250: 4d 49 54 29 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 64  MIT)./*.** For d
0260: 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
0270: 73 2c 20 72 65 63 6f 72 64 20 77 68 65 6e 20 74  s, record when t
0280: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
0290: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
02a0: 64 0a 2a 2a 20 61 6e 64 20 75 6e 69 6e 69 74 69  d.** and uniniti
02b0: 61 6c 69 7a 65 64 20 73 6f 20 74 68 61 74 20 77  alized so that w
02c0: 65 20 63 61 6e 20 61 73 73 65 72 74 28 29 20 69  e can assert() i
02d0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 74  f there is an at
02e0: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 61 6c 6c 6f  tempt to.** allo
02f0: 63 61 74 65 20 61 20 6d 75 74 65 78 20 77 68 69  cate a mutex whi
0300: 6c 65 20 74 68 65 20 73 79 73 74 65 6d 20 69 73  le the system is
0310: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
0320: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
0330: 5f 57 53 44 20 69 6e 74 20 6d 75 74 65 78 49 73  _WSD int mutexIs
0340: 49 6e 69 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Init = 0;.#endif
0350: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
0360: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0370: 49 54 45 5f 4d 55 54 45 58 5f 4f 4d 49 54 29 20  ITE_MUTEX_OMIT) 
0380: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
0390: 49 54 45 5f 4d 55 54 45 58 5f 4f 4d 49 54 0a 2f  ITE_MUTEX_OMIT./
03a0: 2a 0a 2a 2a 20 43 6f 70 69 65 73 20 61 20 6d 75  *.** Copies a mu
03b0: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
03c0: 6f 6e 2e 20 20 42 6f 74 68 20 61 72 67 75 6d 65  on.  Both argume
03d0: 6e 74 73 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  nts must point t
03e0: 6f 20 76 61 6c 69 64 0a 2a 2a 20 6d 65 6d 6f 72  o valid.** memor
03f0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
0400: 64 20 6d 75 74 65 78 43 6f 70 79 28 0a 20 20 73  d mutexCopy(.  s
0410: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
0420: 68 6f 64 73 20 2a 70 54 6f 2c 0a 20 20 73 71 6c  hods *pTo,.  sql
0430: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
0440: 64 73 20 63 6f 6e 73 74 20 2a 70 46 72 6f 6d 0a  ds const *pFrom.
0450: 29 7b 0a 20 20 70 54 6f 2d 3e 78 4d 75 74 65 78  ){.  pTo->xMutex
0460: 49 6e 69 74 20 3d 20 70 46 72 6f 6d 2d 3e 78 4d  Init = pFrom->xM
0470: 75 74 65 78 49 6e 69 74 3b 0a 20 20 70 54 6f 2d  utexInit;.  pTo-
0480: 3e 78 4d 75 74 65 78 45 6e 64 20 3d 20 70 46 72  >xMutexEnd = pFr
0490: 6f 6d 2d 3e 78 4d 75 74 65 78 45 6e 64 3b 0a 20  om->xMutexEnd;. 
04a0: 20 70 54 6f 2d 3e 78 4d 75 74 65 78 46 72 65 65   pTo->xMutexFree
04b0: 20 3d 20 70 46 72 6f 6d 2d 3e 78 4d 75 74 65 78   = pFrom->xMutex
04c0: 46 72 65 65 3b 0a 20 20 70 54 6f 2d 3e 78 4d 75  Free;.  pTo->xMu
04d0: 74 65 78 45 6e 74 65 72 20 3d 20 70 46 72 6f 6d  texEnter = pFrom
04e0: 2d 3e 78 4d 75 74 65 78 45 6e 74 65 72 3b 0a 20  ->xMutexEnter;. 
04f0: 20 70 54 6f 2d 3e 78 4d 75 74 65 78 54 72 79 20   pTo->xMutexTry 
0500: 3d 20 70 46 72 6f 6d 2d 3e 78 4d 75 74 65 78 54  = pFrom->xMutexT
0510: 72 79 3b 0a 20 20 70 54 6f 2d 3e 78 4d 75 74 65  ry;.  pTo->xMute
0520: 78 4c 65 61 76 65 20 3d 20 70 46 72 6f 6d 2d 3e  xLeave = pFrom->
0530: 78 4d 75 74 65 78 4c 65 61 76 65 3b 0a 20 20 70  xMutexLeave;.  p
0540: 54 6f 2d 3e 78 4d 75 74 65 78 48 65 6c 64 20 3d  To->xMutexHeld =
0550: 20 70 46 72 6f 6d 2d 3e 78 4d 75 74 65 78 48 65   pFrom->xMutexHe
0560: 6c 64 3b 0a 20 20 70 54 6f 2d 3e 78 4d 75 74 65  ld;.  pTo->xMute
0570: 78 4e 6f 74 68 65 6c 64 20 3d 20 70 46 72 6f 6d  xNotheld = pFrom
0580: 2d 3e 78 4d 75 74 65 78 4e 6f 74 68 65 6c 64 3b  ->xMutexNotheld;
0590: 0a 20 20 70 54 6f 2d 3e 78 4d 75 74 65 78 41 6c  .  pTo->xMutexAl
05a0: 6c 6f 63 20 3d 20 70 46 72 6f 6d 2d 3e 78 4d 75  loc = pFrom->xMu
05b0: 74 65 78 41 6c 6c 6f 63 3b 0a 7d 0a 0a 2f 2a 0a  texAlloc;.}../*.
05c0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
05d0: 65 20 6d 75 74 65 78 20 73 79 73 74 65 6d 2e 0a  e mutex system..
05e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 75  */.int sqlite3Mu
05f0: 74 65 78 49 6e 69 74 28 76 6f 69 64 29 7b 20 0a  texInit(void){ .
0600: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
0610: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 6e  sqlite3CompareAn
0620: 64 53 77 61 70 28 28 76 6f 69 64 20 2a 20 76 6f  dSwap((void * vo
0630: 6c 61 74 69 6c 65 20 2a 29 26 73 71 6c 69 74 65  latile *)&sqlite
0640: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4d  3GlobalConfig.pM
0650: 75 74 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20  utex,.          
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0670: 20 20 30 2c 20 26 73 71 6c 69 74 65 33 47 6c 6f    0, &sqlite3Glo
0680: 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 29  balConfig.mutex)
0690: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
06a0: 20 74 68 65 20 78 4d 75 74 65 78 41 6c 6c 6f 63   the xMutexAlloc
06b0: 20 6d 65 74 68 6f 64 20 68 61 73 20 6e 6f 74 20   method has not 
06c0: 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 74  been set, then t
06d0: 68 65 20 75 73 65 72 20 64 69 64 20 6e 6f 74 0a  he user did not.
06e0: 20 20 20 20 2a 2a 20 69 6e 73 74 61 6c 6c 20 61      ** install a
06f0: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
0700: 61 74 69 6f 6e 20 76 69 61 20 73 71 6c 69 74 65  ation via sqlite
0710: 33 5f 63 6f 6e 66 69 67 28 29 20 70 72 69 6f 72  3_config() prior
0720: 20 74 6f 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69   to .    ** sqli
0730: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
0740: 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 2e 20 54   being called. T
0750: 68 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65 73  his block copies
0760: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 20 20 20   pointers to.   
0770: 20 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20   ** the default 
0780: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
0790: 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 47  nto the sqlite3G
07a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 20 73 74 72 75  lobalConfig stru
07b0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
07c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
07d0: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70  methods const *p
07e0: 46 72 6f 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73  From;..    if( s
07f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0800: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
0810: 0a 20 20 20 20 20 20 70 46 72 6f 6d 20 3d 20 73  .      pFrom = s
0820: 71 6c 69 74 65 33 44 65 66 61 75 6c 74 4d 75 74  qlite3DefaultMut
0830: 65 78 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ex();.    }else{
0840: 0a 20 20 20 20 20 20 70 46 72 6f 6d 20 3d 20 73  .      pFrom = s
0850: 71 6c 69 74 65 33 4e 6f 6f 70 4d 75 74 65 78 28  qlite3NoopMutex(
0860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 75 74  );.    }.    mut
0870: 65 78 43 6f 70 79 28 26 73 71 6c 69 74 65 33 47  exCopy(&sqlite3G
0880: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
0890: 78 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 73  x, pFrom);.    s
08a0: 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72  qlite3MemoryBarr
08b0: 69 65 72 28 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ier();.  }.  ass
08c0: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
08d0: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78  alConfig.mutex.x
08e0: 4d 75 74 65 78 49 6e 69 74 20 29 3b 0a 20 20 72  MutexInit );.  r
08f0: 63 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  c = sqlite3Globa
0900: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d  lConfig.mutex.xM
0910: 75 74 65 78 49 6e 69 74 28 29 3b 0a 0a 23 69 66  utexInit();..#if
0920: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0930: 0a 20 20 47 4c 4f 42 41 4c 28 69 6e 74 2c 20 6d  .  GLOBAL(int, m
0940: 75 74 65 78 49 73 49 6e 69 74 29 20 3d 20 31 3b  utexIsInit) = 1;
0950: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
0960: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
0970: 68 75 74 64 6f 77 6e 20 74 68 65 20 6d 75 74 65  hutdown the mute
0980: 78 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 63  x system. This c
0990: 61 6c 6c 20 66 72 65 65 73 20 72 65 73 6f 75 72  all frees resour
09a0: 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ces allocated by
09b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 4d 75 74 65 78  .** sqlite3Mutex
09c0: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Init()..*/.int s
09d0: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 76  qlite3MutexEnd(v
09e0: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  oid){.  int rc =
09f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
0a00: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
0a10: 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74  onfig.mutex.xMut
0a20: 65 78 45 6e 64 20 29 7b 0a 20 20 20 20 72 63 20  exEnd ){.    rc 
0a30: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
0a40: 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74  onfig.mutex.xMut
0a50: 65 78 45 6e 64 28 29 3b 0a 20 20 7d 0a 0a 23 69  exEnd();.  }..#i
0a60: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0a70: 47 0a 20 20 47 4c 4f 42 41 4c 28 69 6e 74 2c 20  G.  GLOBAL(int, 
0a80: 6d 75 74 65 78 49 73 49 6e 69 74 29 20 3d 20 30  mutexIsInit) = 0
0a90: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
0aa0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
0ab0: 52 65 74 72 69 65 76 65 20 61 20 70 6f 69 6e 74  Retrieve a point
0ac0: 65 72 20 74 6f 20 61 20 73 74 61 74 69 63 20 6d  er to a static m
0ad0: 75 74 65 78 20 6f 72 20 61 6c 6c 6f 63 61 74 65  utex or allocate
0ae0: 20 61 20 6e 65 77 20 64 79 6e 61 6d 69 63 20 6f   a new dynamic o
0af0: 6e 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d  ne..*/.sqlite3_m
0b00: 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 6d 75  utex *sqlite3_mu
0b10: 74 65 78 5f 61 6c 6c 6f 63 28 69 6e 74 20 69 64  tex_alloc(int id
0b20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
0b30: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
0b40: 20 20 69 66 28 20 69 64 3c 3d 53 51 4c 49 54 45    if( id<=SQLITE
0b50: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
0b60: 20 26 26 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   && sqlite3_init
0b70: 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72  ialize() ) retur
0b80: 6e 20 30 3b 0a 20 20 69 66 28 20 69 64 3e 53 51  n 0;.  if( id>SQ
0b90: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
0ba0: 53 49 56 45 20 26 26 20 73 71 6c 69 74 65 33 4d  SIVE && sqlite3M
0bb0: 75 74 65 78 49 6e 69 74 28 29 20 29 20 72 65 74  utexInit() ) ret
0bc0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
0bd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
0be0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
0bf0: 78 2e 78 4d 75 74 65 78 41 6c 6c 6f 63 20 29 3b  x.xMutexAlloc );
0c00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
0c10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
0c20: 74 65 78 2e 78 4d 75 74 65 78 41 6c 6c 6f 63 28  tex.xMutexAlloc(
0c30: 69 64 29 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f  id);.}..sqlite3_
0c40: 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 4d 75  mutex *sqlite3Mu
0c50: 74 65 78 41 6c 6c 6f 63 28 69 6e 74 20 69 64 29  texAlloc(int id)
0c60: 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  {.  if( !sqlite3
0c70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
0c80: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 72  reMutex ){.    r
0c90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
0ca0: 73 73 65 72 74 28 20 47 4c 4f 42 41 4c 28 69 6e  ssert( GLOBAL(in
0cb0: 74 2c 20 6d 75 74 65 78 49 73 49 6e 69 74 29 20  t, mutexIsInit) 
0cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
0cd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0ce0: 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 41 6c 6c  .mutex.xMutexAll
0cf0: 6f 63 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  oc );.  return s
0d00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0d10: 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 41  ig.mutex.xMutexA
0d20: 6c 6c 6f 63 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a  lloc(id);.}../*.
0d30: 2a 2a 20 46 72 65 65 20 61 20 64 79 6e 61 6d 69  ** Free a dynami
0d40: 63 20 6d 75 74 65 78 2e 0a 2a 2f 0a 76 6f 69 64  c mutex..*/.void
0d50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
0d60: 72 65 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ree(sqlite3_mute
0d70: 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  x *p){.  if( p )
0d80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
0d90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
0da0: 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78 46 72  g.mutex.xMutexFr
0db0: 65 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ee );.    sqlite
0dc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
0dd0: 74 65 78 2e 78 4d 75 74 65 78 46 72 65 65 28 70  tex.xMutexFree(p
0de0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0df0: 4f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78  Obtain the mutex
0e00: 20 70 2e 20 49 66 20 73 6f 6d 65 20 6f 74 68 65   p. If some othe
0e10: 72 20 74 68 72 65 61 64 20 61 6c 72 65 61 64 79  r thread already
0e20: 20 68 61 73 20 74 68 65 20 6d 75 74 65 78 2c 20   has the mutex, 
0e30: 62 6c 6f 63 6b 0a 2a 2a 20 75 6e 74 69 6c 20 69  block.** until i
0e40: 74 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65  t can be obtaine
0e50: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0e60: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
0e70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29  qlite3_mutex *p)
0e80: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
0e90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0ea0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
0eb0: 65 78 2e 78 4d 75 74 65 78 45 6e 74 65 72 20 29  ex.xMutexEnter )
0ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
0ed0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e  balConfig.mutex.
0ee0: 78 4d 75 74 65 78 45 6e 74 65 72 28 70 29 3b 0a  xMutexEnter(p);.
0ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74    }.}../*.** Obt
0f00: 61 69 6e 20 74 68 65 20 6d 75 74 65 78 20 70 2e  ain the mutex p.
0f10: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
0f20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0f30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
0f40: 61 6e 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61  another.** threa
0f50: 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  d holds the mute
0f60: 78 20 61 6e 64 20 69 74 20 63 61 6e 6e 6f 74 20  x and it cannot 
0f70: 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 72 65 74  be obtained, ret
0f80: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
0f90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0fa0: 6d 75 74 65 78 5f 74 72 79 28 73 71 6c 69 74 65  mutex_try(sqlite
0fb0: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 69  3_mutex *p){.  i
0fc0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
0fd0: 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  K;.  if( p ){.  
0fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0ff0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
1000: 74 65 78 2e 78 4d 75 74 65 78 54 72 79 20 29 3b  tex.xMutexTry );
1010: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
1020: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1030: 6d 75 74 65 78 2e 78 4d 75 74 65 78 54 72 79 28  mutex.xMutexTry(
1040: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1050: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1060: 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e sqlite3_mutex_
1070: 6c 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65 20  leave() routine 
1080: 65 78 69 74 73 20 61 20 6d 75 74 65 78 20 74 68  exits a mutex th
1090: 61 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  at was previousl
10a0: 79 0a 2a 2a 20 65 6e 74 65 72 65 64 20 62 79 20  y.** entered by 
10b0: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e  the same thread.
10c0: 20 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 69    The behavior i
10d0: 73 20 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74  s undefined if t
10e0: 68 65 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  he mutex .** is 
10f0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 65 6e  not currently en
1100: 74 65 72 65 64 2e 20 49 66 20 61 20 4e 55 4c 4c  tered. If a NULL
1110: 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73 73   pointer is pass
1120: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
1130: 74 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  t.** this functi
1140: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1150: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d  /.void sqlite3_m
1160: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
1170: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
1180: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
1190: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
11a0: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78  alConfig.mutex.x
11b0: 4d 75 74 65 78 4c 65 61 76 65 20 29 3b 0a 20 20  MutexLeave );.  
11c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
11d0: 6f 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74  onfig.mutex.xMut
11e0: 65 78 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  exLeave(p);.  }.
11f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1200: 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  G./*.** The sqli
1210: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
1220: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74   and sqlite3_mut
1230: 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20 72 6f 75  ex_notheld() rou
1240: 74 69 6e 65 20 61 72 65 0a 2a 2a 20 69 6e 74 65  tine are.** inte
1250: 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73  nded for use ins
1260: 69 64 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ide assert() sta
1270: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1280: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1290: 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ld(sqlite3_mutex
12a0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
12b0: 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47  p==0 || sqlite3G
12c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
12d0: 78 2e 78 4d 75 74 65 78 48 65 6c 64 20 29 3b 0a  x.xMutexHeld );.
12e0: 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c    return p==0 ||
12f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1300: 6e 66 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65  nfig.mutex.xMute
1310: 78 48 65 6c 64 28 70 29 3b 0a 7d 0a 69 6e 74 20  xHeld(p);.}.int 
1320: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
1330: 74 68 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75  theld(sqlite3_mu
1340: 74 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  tex *p){.  asser
1350: 74 28 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  t( p==0 || sqlit
1360: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1370: 75 74 65 78 2e 78 4d 75 74 65 78 4e 6f 74 68 65  utex.xMutexNothe
1380: 6c 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ld );.  return p
1390: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  ==0 || sqlite3Gl
13a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
13b0: 2e 78 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70  .xMutexNotheld(p
13c0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e  );.}.#endif..#en
13d0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
13e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4f 4d 49  SQLITE_MUTEX_OMI
13f0: 54 29 20 2a 2f 0a                                T) */.