/ Hex Artifact Content
Login

Artifact 38abc2b703aae750e062947b75442893b02d8e124383d0e72d309e1c0d96d5e9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 32 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 28.**.** 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: 20 66 6f 72 20 70 74 68 72 65 61 64 73 0a 2a 2f   for pthreads.*/
01c0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
01d0: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54  eInt.h"../*.** T
01e0: 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  he code in this 
01f0: 66 69 6c 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  file is only use
0200: 64 20 69 66 20 77 65 20 61 72 65 20 63 6f 6d 70  d if we are comp
0210: 69 6c 69 6e 67 20 74 68 72 65 61 64 73 61 66 65  iling threadsafe
0220: 0a 2a 2a 20 75 6e 64 65 72 20 75 6e 69 78 20 77  .** under unix w
0230: 69 74 68 20 70 74 68 72 65 61 64 73 2e 0a 2a 2a  ith pthreads..**
0240: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
0250: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
0260: 6e 20 72 65 71 75 69 72 65 73 20 61 20 76 65 72  n requires a ver
0270: 73 69 6f 6e 20 6f 66 20 70 74 68 72 65 61 64 73  sion of pthreads
0280: 20 74 68 61 74 0a 2a 2a 20 73 75 70 70 6f 72 74   that.** support
0290: 73 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65  s recursive mute
02a0: 78 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  xes..*/.#ifdef S
02b0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 50 54 48 52  QLITE_MUTEX_PTHR
02c0: 45 41 44 53 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  EADS..#include <
02d0: 70 74 68 72 65 61 64 2e 68 3e 0a 0a 2f 2a 0a 2a  pthread.h>../*.*
02e0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75  * The sqlite3_mu
02f0: 74 65 78 2e 69 64 2c 20 73 71 6c 69 74 65 33 5f  tex.id, sqlite3_
0300: 6d 75 74 65 78 2e 6e 52 65 66 2c 20 61 6e 64 20  mutex.nRef, and 
0310: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 2e 6f 77  sqlite3_mutex.ow
0320: 6e 65 72 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72  ner fields.** ar
0330: 65 20 6e 65 63 65 73 73 61 72 79 20 75 6e 64 65  e necessary unde
0340: 72 20 74 77 6f 20 63 6f 6e 64 69 64 74 69 6f 6e  r two condidtion
0350: 73 3a 20 20 28 31 29 20 44 65 62 75 67 20 62 75  s:  (1) Debug bu
0360: 69 6c 64 73 20 61 6e 64 20 28 32 29 20 75 73 69  ilds and (2) usi
0370: 6e 67 0a 2a 2a 20 68 6f 6d 65 2d 67 72 6f 77 6e  ng.** home-grown
0380: 20 6d 75 74 65 78 65 73 2e 20 20 45 6e 63 61 70   mutexes.  Encap
0390: 73 75 6c 61 74 65 20 74 68 65 73 65 20 63 6f 6e  sulate these con
03a0: 64 69 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73  ditions into a s
03b0: 69 6e 67 6c 65 20 23 64 65 66 69 6e 65 2e 0a 2a  ingle #define..*
03c0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
03d0: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
03e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 4f  efined(SQLITE_HO
03f0: 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52 53 49 56  MEGROWN_RECURSIV
0400: 45 5f 4d 55 54 45 58 29 0a 23 20 64 65 66 69 6e  E_MUTEX).# defin
0410: 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  e SQLITE_MUTEX_N
0420: 52 45 46 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  REF 1.#else.# de
0430: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 45  fine SQLITE_MUTE
0440: 58 5f 4e 52 45 46 20 30 0a 23 65 6e 64 69 66 0a  X_NREF 0.#endif.
0450: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 72 65 63 75  ./*.** Each recu
0460: 72 73 69 76 65 20 6d 75 74 65 78 20 69 73 20 61  rsive mutex is a
0470: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0480: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0490: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
04a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 7b   sqlite3_mutex {
04b0: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
04c0: 5f 74 20 6d 75 74 65 78 3b 20 20 20 20 20 2f 2a  _t mutex;     /*
04d0: 20 4d 75 74 65 78 20 63 6f 6e 74 72 6f 6c 6c 69   Mutex controlli
04e0: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 23  ng the lock */.#
04f0: 69 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  if SQLITE_MUTEX_
0500: 4e 52 45 46 20 7c 7c 20 64 65 66 69 6e 65 64 28  NREF || defined(
0510: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
0520: 49 5f 41 52 4d 4f 52 29 0a 20 20 69 6e 74 20 69  I_ARMOR).  int i
0530: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
0540: 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
0550: 79 70 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ype */.#endif.#i
0560: 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  f SQLITE_MUTEX_N
0570: 52 45 46 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69  REF.  volatile i
0580: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
0590: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
05a0: 74 72 61 6e 63 65 73 20 2a 2f 0a 20 20 76 6f 6c  trances */.  vol
05b0: 61 74 69 6c 65 20 70 74 68 72 65 61 64 5f 74 20  atile pthread_t 
05c0: 6f 77 6e 65 72 3b 20 20 2f 2a 20 54 68 72 65 61  owner;  /* Threa
05d0: 64 20 74 68 61 74 20 69 73 20 77 69 74 68 69 6e  d that is within
05e0: 20 74 68 69 73 20 6d 75 74 65 78 20 2a 2f 0a 20   this mutex */. 
05f0: 20 69 6e 74 20 74 72 61 63 65 3b 20 20 20 20 20   int trace;     
0600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0610: 72 75 65 20 74 6f 20 74 72 61 63 65 20 63 68 61  rue to trace cha
0620: 6e 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  nges */.#endif.}
0630: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 54  ;.#if SQLITE_MUT
0640: 45 58 5f 4e 52 45 46 0a 23 20 64 65 66 69 6e 65  EX_NREF.# define
0650: 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49   SQLITE3_MUTEX_I
0660: 4e 49 54 49 41 4c 49 5a 45 52 28 69 64 29 20 5c  NITIALIZER(id) \
0670: 0a 20 20 20 20 20 7b 50 54 48 52 45 41 44 5f 4d  .     {PTHREAD_M
0680: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
0690: 2c 69 64 2c 30 2c 28 70 74 68 72 65 61 64 5f 74  ,id,0,(pthread_t
06a0: 29 30 2c 30 7d 0a 23 65 6c 69 66 20 64 65 66 69  )0,0}.#elif defi
06b0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
06c0: 45 5f 41 50 49 5f 41 52 4d 4f 52 29 0a 23 20 64  E_API_ARMOR).# d
06d0: 65 66 69 6e 65 20 53 51 4c 49 54 45 33 5f 4d 55  efine SQLITE3_MU
06e0: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 28  TEX_INITIALIZER(
06f0: 69 64 29 20 7b 20 50 54 48 52 45 41 44 5f 4d 55  id) { PTHREAD_MU
0700: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c  TEX_INITIALIZER,
0710: 20 69 64 20 7d 0a 23 65 6c 73 65 0a 23 64 65 66   id }.#else.#def
0720: 69 6e 65 20 53 51 4c 49 54 45 33 5f 4d 55 54 45  ine SQLITE3_MUTE
0730: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 28 69 64  X_INITIALIZER(id
0740: 29 20 7b 20 50 54 48 52 45 41 44 5f 4d 55 54 45  ) { PTHREAD_MUTE
0750: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 7d 0a  X_INITIALIZER }.
0760: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0770: 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e sqlite3_mutex_
0780: 68 65 6c 64 28 29 20 61 6e 64 20 73 71 6c 69 74  held() and sqlit
0790: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
07a0: 28 29 20 72 6f 75 74 69 6e 65 20 61 72 65 0a 2a  () routine are.*
07b0: 2a 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  * intended for u
07c0: 73 65 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 61  se only inside a
07d0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
07e0: 74 73 2e 20 20 4f 6e 20 73 6f 6d 65 20 70 6c 61  ts.  On some pla
07f0: 74 66 6f 72 6d 73 2c 0a 2a 2a 20 74 68 65 72 65  tforms,.** there
0800: 20 6d 69 67 68 74 20 62 65 20 72 61 63 65 20 63   might be race c
0810: 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 63  onditions that c
0820: 61 6e 20 63 61 75 73 65 20 74 68 65 73 65 20 72  an cause these r
0830: 6f 75 74 69 6e 65 73 20 74 6f 0a 2a 2a 20 64 65  outines to.** de
0840: 6c 69 76 65 72 20 69 6e 63 6f 72 72 65 63 74 20  liver incorrect 
0850: 72 65 73 75 6c 74 73 2e 20 20 49 6e 20 70 61 72  results.  In par
0860: 74 69 63 75 6c 61 72 2c 20 69 66 20 70 74 68 72  ticular, if pthr
0870: 65 61 64 5f 65 71 75 61 6c 28 29 20 69 73 0a 2a  ead_equal() is.*
0880: 2a 20 6e 6f 74 20 61 6e 20 61 74 6f 6d 69 63 20  * not an atomic 
0890: 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65 6e 20  operation, then 
08a0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 6d  these routines m
08b0: 69 67 68 74 20 64 65 6c 69 76 65 72 79 0a 2a 2a  ight delivery.**
08c0: 20 69 6e 63 6f 72 72 65 63 74 20 72 65 73 75 6c   incorrect resul
08d0: 74 73 2e 20 20 4f 6e 20 6d 6f 73 74 20 70 6c 61  ts.  On most pla
08e0: 74 66 6f 72 6d 73 2c 20 70 74 68 72 65 61 64 5f  tforms, pthread_
08f0: 65 71 75 61 6c 28 29 20 69 73 20 61 20 0a 2a 2a  equal() is a .**
0900: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
0910: 77 6f 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  wo integers and 
0920: 69 73 20 74 68 65 72 65 66 6f 72 65 20 61 74 6f  is therefore ato
0930: 6d 69 63 2e 20 20 42 75 74 20 77 65 20 61 72 65  mic.  But we are
0940: 0a 2a 2a 20 74 6f 6c 64 20 74 68 61 74 20 48 50  .** told that HP
0950: 55 58 20 69 73 20 6e 6f 74 20 73 75 63 68 20 61  UX is not such a
0960: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 73   platform.  If s
0970: 6f 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  o, then these ro
0980: 75 74 69 6e 65 73 0a 2a 2a 20 77 69 6c 6c 20 6e  utines.** will n
0990: 6f 74 20 61 6c 77 61 79 73 20 77 6f 72 6b 20 63  ot always work c
09a0: 6f 72 72 65 63 74 6c 79 20 6f 6e 20 48 50 55 58  orrectly on HPUX
09b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 74 68 6f 73 65  ..**.** On those
09c0: 20 70 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65   platforms where
09d0: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 29   pthread_equal()
09e0: 20 69 73 20 6e 6f 74 20 61 74 6f 6d 69 63 2c 20   is not atomic, 
09f0: 53 51 4c 69 74 65 0a 2a 2a 20 73 68 6f 75 6c 64  SQLite.** should
0a00: 20 62 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   be compiled wit
0a10: 68 6f 75 74 20 2d 44 53 51 4c 49 54 45 5f 44 45  hout -DSQLITE_DE
0a20: 42 55 47 20 61 6e 64 20 77 69 74 68 20 2d 44 4e  BUG and with -DN
0a30: 44 45 42 55 47 20 74 6f 0a 2a 2a 20 6d 61 6b 65  DEBUG to.** make
0a40: 20 73 75 72 65 20 6e 6f 20 61 73 73 65 72 74 28   sure no assert(
0a50: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  ) statements are
0a60: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 68   evaluated and h
0a70: 65 6e 63 65 20 74 68 65 73 65 0a 2a 2a 20 72 6f  ence these.** ro
0a80: 75 74 69 6e 65 73 20 61 72 65 20 6e 65 76 65 72  utines are never
0a90: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 23 69 66 20   called..*/.#if 
0aa0: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
0ab0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
0ac0: 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
0ad0: 20 69 6e 74 20 70 74 68 72 65 61 64 4d 75 74 65   int pthreadMute
0ae0: 78 48 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75  xHeld(sqlite3_mu
0af0: 74 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  tex *p){.  retur
0b00: 6e 20 28 70 2d 3e 6e 52 65 66 21 3d 30 20 26 26  n (p->nRef!=0 &&
0b10: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70   pthread_equal(p
0b20: 2d 3e 6f 77 6e 65 72 2c 20 70 74 68 72 65 61 64  ->owner, pthread
0b30: 5f 73 65 6c 66 28 29 29 29 3b 0a 7d 0a 73 74 61  _self()));.}.sta
0b40: 74 69 63 20 69 6e 74 20 70 74 68 72 65 61 64 4d  tic int pthreadM
0b50: 75 74 65 78 4e 6f 74 68 65 6c 64 28 73 71 6c 69  utexNotheld(sqli
0b60: 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20  te3_mutex *p){. 
0b70: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
0b80: 3d 30 20 7c 7c 20 70 74 68 72 65 61 64 5f 65 71  =0 || pthread_eq
0b90: 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 70 74  ual(p->owner, pt
0ba0: 68 72 65 61 64 5f 73 65 6c 66 28 29 29 3d 3d 30  hread_self())==0
0bb0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
0bc0: 2a 20 54 72 79 20 74 6f 20 70 72 6f 76 69 64 65  * Try to provide
0bd0: 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
0be0: 72 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6e 65 65  r operation, nee
0bf0: 64 65 64 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ded for initiali
0c00: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 61 6c  zation.** and al
0c10: 73 6f 20 66 6f 72 20 74 68 65 20 69 6d 70 6c 65  so for the imple
0c20: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 53 68  mentation of xSh
0c30: 6d 42 61 72 72 69 65 72 20 69 6e 20 74 68 65 20  mBarrier in the 
0c40: 56 46 53 20 69 6e 20 63 61 73 65 73 0a 2a 2a 20  VFS in cases.** 
0c50: 77 68 65 72 65 20 53 51 4c 69 74 65 20 69 73 20  where SQLite is 
0c60: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 6f 75 74  compiled without
0c70: 20 6d 75 74 65 78 65 73 2e 0a 2a 2f 0a 76 6f 69   mutexes..*/.voi
0c80: 64 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42  d sqlite3MemoryB
0c90: 61 72 72 69 65 72 28 76 6f 69 64 29 7b 0a 23 69  arrier(void){.#i
0ca0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
0cb0: 5f 4d 45 4d 4f 52 59 5f 42 41 52 52 49 45 52 29  _MEMORY_BARRIER)
0cc0: 0a 20 20 53 51 4c 49 54 45 5f 4d 45 4d 4f 52 59  .  SQLITE_MEMORY
0cd0: 5f 42 41 52 52 49 45 52 3b 0a 23 65 6c 69 66 20  _BARRIER;.#elif 
0ce0: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f  defined(__GNUC__
0cf0: 29 20 26 26 20 47 43 43 5f 56 45 52 53 49 4f 4e  ) && GCC_VERSION
0d00: 3e 3d 34 30 30 31 30 30 30 0a 20 20 5f 5f 73 79  >=4001000.  __sy
0d10: 6e 63 5f 73 79 6e 63 68 72 6f 6e 69 7a 65 28 29  nc_synchronize()
0d20: 3b 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  ;.# define sqlit
0d30: 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 5f  e3MemoryBarrier_
0d40: 49 53 5f 52 45 4c 49 41 42 4c 45 20 31 0a 23 65  IS_RELIABLE 1.#e
0d50: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ndif.}../*.** In
0d60: 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
0d70: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75  nitialize the mu
0d80: 74 65 78 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a  tex subsystem..*
0d90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 68  /.static int pth
0da0: 72 65 61 64 4d 75 74 65 78 49 6e 69 74 28 76 6f  readMutexInit(vo
0db0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
0dc0: 54 45 5f 4f 4b 3b 20 7d 0a 73 74 61 74 69 63 20  TE_OK; }.static 
0dd0: 69 6e 74 20 70 74 68 72 65 61 64 4d 75 74 65 78  int pthreadMutex
0de0: 45 6e 64 28 76 6f 69 64 29 7b 20 72 65 74 75 72  End(void){ retur
0df0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 0a  n SQLITE_OK; }..
0e00: 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
0e10: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20  3_mutex_alloc() 
0e20: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
0e30: 73 20 61 20 6e 65 77 0a 2a 2a 20 6d 75 74 65 78  s a new.** mutex
0e40: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
0e50: 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 49  ointer to it.  I
0e60: 66 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c  f it returns NUL
0e70: 4c 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  L.** that means 
0e80: 74 68 61 74 20 61 20 6d 75 74 65 78 20 63 6f 75  that a mutex cou
0e90: 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ld not be alloca
0ea0: 74 65 64 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ted.  SQLite.** 
0eb0: 77 69 6c 6c 20 75 6e 77 69 6e 64 20 69 74 73 20  will unwind its 
0ec0: 73 74 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e  stack and return
0ed0: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
0ee0: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 74 6f 20 73  argument.** to s
0ef0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
0f00: 6f 63 28 29 20 69 73 20 6f 6e 65 20 6f 66 20 74  oc() is one of t
0f10: 68 65 73 65 20 69 6e 74 65 67 65 72 20 63 6f 6e  hese integer con
0f20: 73 74 61 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75  stants:.**.** <u
0f30: 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49  l>.** <li>  SQLI
0f40: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 0a 2a 2a  TE_MUTEX_FAST.**
0f50: 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55   <li>  SQLITE_MU
0f60: 54 45 58 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a  TEX_RECURSIVE.**
0f70: 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55   <li>  SQLITE_MU
0f80: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
0f90: 52 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  R.** <li>  SQLIT
0fa0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
0fb0: 45 4d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49  EM.** <li>  SQLI
0fc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0fd0: 4f 50 45 4e 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51  OPEN.** <li>  SQ
0fe0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0ff0: 43 5f 50 52 4e 47 0a 2a 2a 20 3c 6c 69 3e 20 20  C_PRNG.** <li>  
1000: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1010: 54 49 43 5f 4c 52 55 0a 2a 2a 20 3c 6c 69 3e 20  TIC_LRU.** <li> 
1020: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54   SQLITE_MUTEX_ST
1030: 41 54 49 43 5f 50 4d 45 4d 0a 2a 2a 20 3c 6c 69  ATIC_PMEM.** <li
1040: 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  >  SQLITE_MUTEX_
1050: 53 54 41 54 49 43 5f 41 50 50 31 0a 2a 2a 20 3c  STATIC_APP1.** <
1060: 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45  li>  SQLITE_MUTE
1070: 58 5f 53 54 41 54 49 43 5f 41 50 50 32 0a 2a 2a  X_STATIC_APP2.**
1080: 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55   <li>  SQLITE_MU
1090: 54 45 58 5f 53 54 41 54 49 43 5f 41 50 50 33 0a  TEX_STATIC_APP3.
10a0: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
10b0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53  MUTEX_STATIC_VFS
10c0: 31 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  1.** <li>  SQLIT
10d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56  E_MUTEX_STATIC_V
10e0: 46 53 32 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c  FS2.** <li>  SQL
10f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1100: 5f 56 46 53 33 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  _VFS3.** </ul>.*
1110: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1120: 77 6f 20 63 6f 6e 73 74 61 6e 74 73 20 63 61 75  wo constants cau
1130: 73 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  se sqlite3_mutex
1140: 5f 61 6c 6c 6f 63 28 29 20 74 6f 20 63 72 65 61  _alloc() to crea
1150: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6d 75 74 65  te.** a new mute
1160: 78 2e 20 20 54 68 65 20 6e 65 77 20 6d 75 74 65  x.  The new mute
1170: 78 20 69 73 20 72 65 63 75 72 73 69 76 65 20 77  x is recursive w
1180: 68 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  hen SQLITE_MUTEX
1190: 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 69 73  _RECURSIVE.** is
11a0: 20 75 73 65 64 20 62 75 74 20 6e 6f 74 20 6e 65   used but not ne
11b0: 63 65 73 73 61 72 69 6c 79 20 73 6f 20 77 68 65  cessarily so whe
11c0: 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  n SQLITE_MUTEX_F
11d0: 41 53 54 20 69 73 20 75 73 65 64 2e 0a 2a 2a 20  AST is used..** 
11e0: 54 68 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  The mutex implem
11f0: 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
1200: 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
1210: 20 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20   distinction.** 
1220: 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 4d  between SQLITE_M
1230: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 61  UTEX_RECURSIVE a
1240: 6e 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  nd SQLITE_MUTEX_
1250: 46 41 53 54 20 69 66 20 69 74 20 64 6f 65 73 0a  FAST if it does.
1260: 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 2e 20  ** not want to. 
1270: 20 42 75 74 20 53 51 4c 69 74 65 20 77 69 6c 6c   But SQLite will
1280: 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 20 61 20   only request a 
1290: 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20  recursive mutex 
12a0: 69 6e 0a 2a 2a 20 63 61 73 65 73 20 77 68 65 72  in.** cases wher
12b0: 65 20 69 74 20 72 65 61 6c 6c 79 20 6e 65 65 64  e it really need
12c0: 73 20 6f 6e 65 2e 20 20 49 66 20 61 20 66 61 73  s one.  If a fas
12d0: 74 65 72 20 6e 6f 6e 2d 72 65 63 75 72 73 69 76  ter non-recursiv
12e0: 65 20 6d 75 74 65 78 0a 2a 2a 20 69 6d 70 6c 65  e mutex.** imple
12f0: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 76 61  mentation is ava
1300: 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f  ilable on the ho
1310: 73 74 20 70 6c 61 74 66 6f 72 6d 2c 20 74 68 65  st platform, the
1320: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1330: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
1340: 20 73 75 63 68 20 61 20 6d 75 74 65 78 20 69 6e   such a mutex in
1350: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 53 51 4c   response to SQL
1360: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 2e 0a  ITE_MUTEX_FAST..
1370: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 74 68 65 72 20  **.** The other 
1380: 61 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65 74 65  allowed paramete
1390: 72 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 75  rs to sqlite3_mu
13a0: 74 65 78 5f 61 6c 6c 6f 63 28 29 20 65 61 63 68  tex_alloc() each
13b0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
13c0: 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 69 63  nter to a static
13d0: 20 70 72 65 65 78 69 73 74 69 6e 67 20 6d 75 74   preexisting mut
13e0: 65 78 2e 20 20 53 69 78 20 73 74 61 74 69 63 20  ex.  Six static 
13f0: 6d 75 74 65 78 65 73 20 61 72 65 0a 2a 2a 20 75  mutexes are.** u
1400: 73 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  sed by the curre
1410: 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  nt version of SQ
1420: 4c 69 74 65 2e 20 20 46 75 74 75 72 65 20 76 65  Lite.  Future ve
1430: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
1440: 0a 2a 2a 20 6d 61 79 20 61 64 64 20 61 64 64 69  .** may add addi
1450: 74 69 6f 6e 61 6c 20 73 74 61 74 69 63 20 6d 75  tional static mu
1460: 74 65 78 65 73 2e 20 20 53 74 61 74 69 63 20 6d  texes.  Static m
1470: 75 74 65 78 65 73 20 61 72 65 20 66 6f 72 20 69  utexes are for i
1480: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 20 62  nternal.** use b
1490: 79 20 53 51 4c 69 74 65 20 6f 6e 6c 79 2e 20 20  y SQLite only.  
14a0: 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61  Applications tha
14b0: 74 20 75 73 65 20 53 51 4c 69 74 65 20 6d 75 74  t use SQLite mut
14c0: 65 78 65 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 75  exes should.** u
14d0: 73 65 20 6f 6e 6c 79 20 74 68 65 20 64 79 6e 61  se only the dyna
14e0: 6d 69 63 20 6d 75 74 65 78 65 73 20 72 65 74 75  mic mutexes retu
14f0: 72 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d  rned by SQLITE_M
1500: 55 54 45 58 5f 46 41 53 54 20 6f 72 0a 2a 2a 20  UTEX_FAST or.** 
1510: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
1520: 55 52 53 49 56 45 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  URSIVE..**.** No
1530: 74 65 20 74 68 61 74 20 69 66 20 6f 6e 65 20 6f  te that if one o
1540: 66 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6d 75  f the dynamic mu
1550: 74 65 78 20 70 61 72 61 6d 65 74 65 72 73 20 28  tex parameters (
1560: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
1570: 54 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4d  T.** or SQLITE_M
1580: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 20  UTEX_RECURSIVE) 
1590: 69 73 20 75 73 65 64 20 74 68 65 6e 20 73 71 6c  is used then sql
15a0: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
15b0: 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ().** returns a 
15c0: 64 69 66 66 65 72 65 6e 74 20 6d 75 74 65 78 20  different mutex 
15d0: 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e 20 20  on every call.  
15e0: 42 75 74 20 66 6f 72 20 74 68 65 20 73 74 61 74  But for the stat
15f0: 69 63 20 0a 2a 2a 20 6d 75 74 65 78 20 74 79 70  ic .** mutex typ
1600: 65 73 2c 20 74 68 65 20 73 61 6d 65 20 6d 75 74  es, the same mut
1610: 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  ex is returned o
1620: 6e 20 65 76 65 72 79 20 63 61 6c 6c 20 74 68 61  n every call tha
1630: 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 73 61 6d  t has.** the sam
1640: 65 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 0a 2a  e type number..*
1650: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1660: 5f 6d 75 74 65 78 20 2a 70 74 68 72 65 61 64 4d  _mutex *pthreadM
1670: 75 74 65 78 41 6c 6c 6f 63 28 69 6e 74 20 69 54  utexAlloc(int iT
1680: 79 70 65 29 7b 0a 20 20 73 74 61 74 69 63 20 73  ype){.  static s
1690: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 73 74 61  qlite3_mutex sta
16a0: 74 69 63 4d 75 74 65 78 65 73 5b 5d 20 3d 20 7b  ticMutexes[] = {
16b0: 0a 20 20 20 20 53 51 4c 49 54 45 33 5f 4d 55 54  .    SQLITE3_MUT
16c0: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 28 32  EX_INITIALIZER(2
16d0: 29 2c 0a 20 20 20 20 53 51 4c 49 54 45 33 5f 4d  ),.    SQLITE3_M
16e0: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
16f0: 28 33 29 2c 0a 20 20 20 20 53 51 4c 49 54 45 33  (3),.    SQLITE3
1700: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
1710: 45 52 28 34 29 2c 0a 20 20 20 20 53 51 4c 49 54  ER(4),.    SQLIT
1720: 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  E3_MUTEX_INITIAL
1730: 49 5a 45 52 28 35 29 2c 0a 20 20 20 20 53 51 4c  IZER(5),.    SQL
1740: 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49  ITE3_MUTEX_INITI
1750: 41 4c 49 5a 45 52 28 36 29 2c 0a 20 20 20 20 53  ALIZER(6),.    S
1760: 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49  QLITE3_MUTEX_INI
1770: 54 49 41 4c 49 5a 45 52 28 37 29 2c 0a 20 20 20  TIALIZER(7),.   
1780: 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49   SQLITE3_MUTEX_I
1790: 4e 49 54 49 41 4c 49 5a 45 52 28 38 29 2c 0a 20  NITIALIZER(8),. 
17a0: 20 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58     SQLITE3_MUTEX
17b0: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 28 39 29 2c  _INITIALIZER(9),
17c0: 0a 20 20 20 20 53 51 4c 49 54 45 33 5f 4d 55 54  .    SQLITE3_MUT
17d0: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 28 31  EX_INITIALIZER(1
17e0: 30 29 2c 0a 20 20 20 20 53 51 4c 49 54 45 33 5f  0),.    SQLITE3_
17f0: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
1800: 52 28 31 31 29 2c 0a 20 20 20 20 53 51 4c 49 54  R(11),.    SQLIT
1810: 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  E3_MUTEX_INITIAL
1820: 49 5a 45 52 28 31 32 29 2c 0a 20 20 20 20 53 51  IZER(12),.    SQ
1830: 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54  LITE3_MUTEX_INIT
1840: 49 41 4c 49 5a 45 52 28 31 33 29 0a 20 20 7d 3b  IALIZER(13).  };
1850: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1860: 20 2a 70 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *p;.  switch( i
1870: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
1880: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45   SQLITE_MUTEX_RE
1890: 43 55 52 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CURSIVE: {.     
18a0: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
18b0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
18c0: 70 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  p) );.      if( 
18d0: 70 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  p ){.#ifdef SQLI
18e0: 54 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 43  TE_HOMEGROWN_REC
18f0: 55 52 53 49 56 45 5f 4d 55 54 45 58 0a 20 20 20  URSIVE_MUTEX.   
1900: 20 20 20 20 20 2f 2a 20 49 66 20 72 65 63 75 72       /* If recur
1910: 73 69 76 65 20 6d 75 74 65 78 65 73 20 61 72 65  sive mutexes are
1920: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
1930: 77 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 0a  we will have to.
1940: 20 20 20 20 20 20 20 20 2a 2a 20 62 75 69 6c 64          ** build
1950: 20 6f 75 72 20 6f 77 6e 2e 20 20 53 65 65 20 62   our own.  See b
1960: 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20  elow. */.       
1970: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69   pthread_mutex_i
1980: 6e 69 74 28 26 70 2d 3e 6d 75 74 65 78 2c 20 30  nit(&p->mutex, 0
1990: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
19a0: 20 2f 2a 20 55 73 65 20 61 20 72 65 63 75 72 73   /* Use a recurs
19b0: 69 76 65 20 6d 75 74 65 78 20 69 66 20 69 74 20  ive mutex if it 
19c0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  is available */.
19d0: 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f          pthread_
19e0: 6d 75 74 65 78 61 74 74 72 5f 74 20 72 65 63 75  mutexattr_t recu
19f0: 72 73 69 76 65 41 74 74 72 3b 0a 20 20 20 20 20  rsiveAttr;.     
1a00: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
1a10: 61 74 74 72 5f 69 6e 69 74 28 26 72 65 63 75 72  attr_init(&recur
1a20: 73 69 76 65 41 74 74 72 29 3b 0a 20 20 20 20 20  siveAttr);.     
1a30: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
1a40: 61 74 74 72 5f 73 65 74 74 79 70 65 28 26 72 65  attr_settype(&re
1a50: 63 75 72 73 69 76 65 41 74 74 72 2c 20 50 54 48  cursiveAttr, PTH
1a60: 52 45 41 44 5f 4d 55 54 45 58 5f 52 45 43 55 52  READ_MUTEX_RECUR
1a70: 53 49 56 45 29 3b 0a 20 20 20 20 20 20 20 20 70  SIVE);.        p
1a80: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
1a90: 74 28 26 70 2d 3e 6d 75 74 65 78 2c 20 26 72 65  t(&p->mutex, &re
1aa0: 63 75 72 73 69 76 65 41 74 74 72 29 3b 0a 20 20  cursiveAttr);.  
1ab0: 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75        pthread_mu
1ac0: 74 65 78 61 74 74 72 5f 64 65 73 74 72 6f 79 28  texattr_destroy(
1ad0: 26 72 65 63 75 72 73 69 76 65 41 74 74 72 29 3b  &recursiveAttr);
1ae0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1af0: 54 45 5f 4d 55 54 45 58 5f 4e 52 45 46 20 7c 7c  TE_MUTEX_NREF ||
1b00: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b10: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1b20: 29 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 64 20  ).        p->id 
1b30: 3d 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  = SQLITE_MUTEX_R
1b40: 45 43 55 52 53 49 56 45 3b 0a 23 65 6e 64 69 66  ECURSIVE;.#endif
1b50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1b60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b70: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45  case SQLITE_MUTE
1b80: 58 5f 46 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  X_FAST: {.      
1b90: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
1ba0: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
1bb0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 68 72   ){.        pthr
1bd0: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
1be0: 70 2d 3e 6d 75 74 65 78 2c 20 30 29 3b 0a 23 69  p->mutex, 0);.#i
1bf0: 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  f SQLITE_MUTEX_N
1c00: 52 45 46 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  REF || defined(S
1c10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1c20: 5f 41 52 4d 4f 52 29 0a 20 20 20 20 20 20 20 20  _ARMOR).        
1c30: 70 2d 3e 69 64 20 3d 20 53 51 4c 49 54 45 5f 4d  p->id = SQLITE_M
1c40: 55 54 45 58 5f 46 41 53 54 3b 0a 23 65 6e 64 69  UTEX_FAST;.#endi
1c50: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
1c60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c70: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 23 69 66 64   default: {.#ifd
1c80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c90: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 20 20 20  _API_ARMOR.     
1ca0: 20 69 66 28 20 69 54 79 70 65 2d 32 3c 30 20 7c   if( iType-2<0 |
1cb0: 7c 20 69 54 79 70 65 2d 32 3e 3d 41 72 72 61 79  | iType-2>=Array
1cc0: 53 69 7a 65 28 73 74 61 74 69 63 4d 75 74 65 78  Size(staticMutex
1cd0: 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28  es) ){.        (
1ce0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1cf0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  SE_BKPT;.       
1d00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1d10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1d20: 70 20 3d 20 26 73 74 61 74 69 63 4d 75 74 65 78  p = &staticMutex
1d30: 65 73 5b 69 54 79 70 65 2d 32 5d 3b 0a 20 20 20  es[iType-2];.   
1d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d50: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
1d60: 55 54 45 58 5f 4e 52 45 46 20 7c 7c 20 64 65 66  UTEX_NREF || def
1d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d80: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 29 0a 20 20  LE_API_ARMOR).  
1d90: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
1da0: 70 2d 3e 69 64 3d 3d 69 54 79 70 65 20 29 3b 0a  p->id==iType );.
1db0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1dc0: 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p;.}.../*.** Thi
1dd0: 73 20 72 6f 75 74 69 6e 65 20 64 65 61 6c 6c 6f  s routine deallo
1de0: 63 61 74 65 73 20 61 20 70 72 65 76 69 6f 75 73  cates a previous
1df0: 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
1e00: 6d 75 74 65 78 2e 20 20 53 51 4c 69 74 65 20 69  mutex.  SQLite i
1e10: 73 20 63 61 72 65 66 75 6c 20 74 6f 20 64 65 61  s careful to dea
1e20: 6c 6c 6f 63 61 74 65 20 65 76 65 72 79 0a 2a 2a  llocate every.**
1e30: 20 6d 75 74 65 78 20 74 68 61 74 20 69 74 20 61   mutex that it a
1e40: 6c 6c 6f 63 61 74 65 73 2e 0a 2a 2f 0a 73 74 61  llocates..*/.sta
1e50: 74 69 63 20 76 6f 69 64 20 70 74 68 72 65 61 64  tic void pthread
1e60: 4d 75 74 65 78 46 72 65 65 28 73 71 6c 69 74 65  MutexFree(sqlite
1e70: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61  3_mutex *p){.  a
1e80: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
1e90: 30 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  0 );.#if SQLITE_
1ea0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1eb0: 0a 20 20 69 66 28 20 70 2d 3e 69 64 3d 3d 53 51  .  if( p->id==SQ
1ec0: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20  LITE_MUTEX_FAST 
1ed0: 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45  || p->id==SQLITE
1ee0: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
1ef0: 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
1f00: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
1f10: 64 65 73 74 72 6f 79 28 26 70 2d 3e 6d 75 74 65  destroy(&p->mute
1f20: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
1f30: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 23 69 66  free(p);.  }.#if
1f40: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1f50: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 65 6c  E_API_ARMOR.  el
1f60: 73 65 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51  se{.    (void)SQ
1f70: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1f80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
1f90: 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
1fa0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20  3_mutex_enter() 
1fb0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  and sqlite3_mute
1fc0: 78 5f 74 72 79 28 29 20 72 6f 75 74 69 6e 65 73  x_try() routines
1fd0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
1fe0: 6e 74 65 72 20 61 20 6d 75 74 65 78 2e 20 20 49  nter a mutex.  I
1ff0: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
2000: 20 69 73 20 61 6c 72 65 61 64 79 20 77 69 74 68   is already with
2010: 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 0a 2a 2a  in the mutex,.**
2020: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2030: 6e 74 65 72 28 29 20 77 69 6c 6c 20 62 6c 6f 63  nter() will bloc
2040: 6b 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75  k and sqlite3_mu
2050: 74 65 78 5f 74 72 79 28 29 20 77 69 6c 6c 20 72  tex_try() will r
2060: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2070: 42 55 53 59 2e 20 20 54 68 65 20 73 71 6c 69 74  BUSY.  The sqlit
2080: 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 69  e3_mutex_try() i
2090: 6e 74 65 72 66 61 63 65 20 72 65 74 75 72 6e 73  nterface returns
20a0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 75 70   SQLITE_OK.** up
20b0: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 20 65 6e  on successful en
20c0: 74 72 79 2e 20 20 4d 75 74 65 78 65 73 20 63 72  try.  Mutexes cr
20d0: 65 61 74 65 64 20 75 73 69 6e 67 20 53 51 4c 49  eated using SQLI
20e0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
20f0: 56 45 20 63 61 6e 0a 2a 2a 20 62 65 20 65 6e 74  VE can.** be ent
2100: 65 72 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ered multiple ti
2110: 6d 65 73 20 62 79 20 74 68 65 20 73 61 6d 65 20  mes by the same 
2120: 74 68 72 65 61 64 2e 20 20 49 6e 20 73 75 63 68  thread.  In such
2130: 20 63 61 73 65 73 20 74 68 65 2c 0a 2a 2a 20 6d   cases the,.** m
2140: 75 74 65 78 20 6d 75 73 74 20 62 65 20 65 78 69  utex must be exi
2150: 74 65 64 20 61 6e 20 65 71 75 61 6c 20 6e 75 6d  ted an equal num
2160: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 62 65 66  ber of times bef
2170: 6f 72 65 20 61 6e 6f 74 68 65 72 20 74 68 72 65  ore another thre
2180: 61 64 0a 2a 2a 20 63 61 6e 20 65 6e 74 65 72 2e  ad.** can enter.
2190: 20 20 49 66 20 74 68 65 20 73 61 6d 65 20 74 68    If the same th
21a0: 72 65 61 64 20 74 72 69 65 73 20 74 6f 20 65 6e  read tries to en
21b0: 74 65 72 20 61 6e 79 20 6f 74 68 65 72 20 6b 69  ter any other ki
21c0: 6e 64 20 6f 66 20 6d 75 74 65 78 0a 2a 2a 20 6d  nd of mutex.** m
21d0: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74  ore than once, t
21e0: 68 65 20 62 65 68 61 76 69 6f 72 20 69 73 20 75  he behavior is u
21f0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2200: 74 69 63 20 76 6f 69 64 20 70 74 68 72 65 61 64  tic void pthread
2210: 4d 75 74 65 78 45 6e 74 65 72 28 73 71 6c 69 74  MutexEnter(sqlit
2220: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
2230: 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53  assert( p->id==S
2240: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
2250: 52 53 49 56 45 20 7c 7c 20 70 74 68 72 65 61 64  RSIVE || pthread
2260: 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 29 20  MutexNotheld(p) 
2270: 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
2280: 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55  E_HOMEGROWN_RECU
2290: 52 53 49 56 45 5f 4d 55 54 45 58 0a 20 20 2f 2a  RSIVE_MUTEX.  /*
22a0: 20 49 66 20 72 65 63 75 72 73 69 76 65 20 6d 75   If recursive mu
22b0: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 61 76  texes are not av
22c0: 61 69 6c 61 62 6c 65 2c 20 74 68 65 6e 20 77 65  ailable, then we
22d0: 20 68 61 76 65 20 74 6f 20 67 72 6f 77 0a 20 20   have to grow.  
22e0: 2a 2a 20 6f 75 72 20 6f 77 6e 2e 20 20 54 68 69  ** our own.  Thi
22f0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
2300: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 70 74   assumes that pt
2310: 68 72 65 61 64 5f 65 71 75 61 6c 28 29 0a 20 20  hread_equal().  
2320: 2a 2a 20 69 73 20 61 74 6f 6d 69 63 20 2d 20 74  ** is atomic - t
2330: 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
2340: 20 64 65 63 65 69 76 65 64 20 69 6e 74 6f 20 74   deceived into t
2350: 68 69 6e 6b 69 6e 67 20 73 65 6c 66 0a 20 20 2a  hinking self.  *
2360: 2a 20 61 6e 64 20 70 2d 3e 6f 77 6e 65 72 20 61  * and p->owner a
2370: 72 65 20 65 71 75 61 6c 20 69 66 20 70 2d 3e 6f  re equal if p->o
2380: 77 6e 65 72 20 63 68 61 6e 67 65 73 20 62 65 74  wner changes bet
2390: 77 65 65 6e 20 74 77 6f 20 76 61 6c 75 65 73 0a  ween two values.
23a0: 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
23b0: 74 20 65 71 75 61 6c 20 74 6f 20 73 65 6c 66 20  t equal to self 
23c0: 77 68 69 6c 65 20 74 68 65 20 63 6f 6d 70 61 72  while the compar
23d0: 69 73 6f 6e 20 69 73 20 74 61 6b 69 6e 67 20 70  ison is taking p
23e0: 6c 61 63 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lace..  ** This 
23f0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
2400: 6c 73 6f 20 61 73 73 75 6d 65 73 20 61 20 63 6f  lso assumes a co
2410: 68 65 72 65 6e 74 20 63 61 63 68 65 20 2d 20 74  herent cache - t
2420: 68 61 74 20 0a 20 20 2a 2a 20 73 65 70 61 72 61  hat .  ** separa
2430: 74 65 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  te processes can
2440: 6e 6f 74 20 72 65 61 64 20 64 69 66 66 65 72 65  not read differe
2450: 6e 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  nt values from t
2460: 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61 64 64  he same.  ** add
2470: 72 65 73 73 20 61 74 20 74 68 65 20 73 61 6d 65  ress at the same
2480: 20 74 69 6d 65 2e 20 20 49 66 20 65 69 74 68 65   time.  If eithe
2490: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 63  r of these two c
24a0: 6f 6e 64 69 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  onditions.  ** a
24b0: 72 65 20 6e 6f 74 20 6d 65 74 2c 20 74 68 65 6e  re not met, then
24c0: 20 74 68 65 20 6d 75 74 65 78 65 73 20 77 69 6c   the mutexes wil
24d0: 6c 20 66 61 69 6c 20 61 6e 64 20 70 72 6f 62 6c  l fail and probl
24e0: 65 6d 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ems will result.
24f0: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 70 74  .  */.  {.    pt
2500: 68 72 65 61 64 5f 74 20 73 65 6c 66 20 3d 20 70  hread_t self = p
2510: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20  thread_self();. 
2520: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3e 30     if( p->nRef>0
2530: 20 26 26 20 70 74 68 72 65 61 64 5f 65 71 75 61   && pthread_equa
2540: 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 73 65 6c 66  l(p->owner, self
2550: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 52  ) ){.      p->nR
2560: 65 66 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ef++;.    }else{
2570: 0a 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d  .      pthread_m
2580: 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e 6d 75  utex_lock(&p->mu
2590: 74 65 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65  tex);.      asse
25a0: 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  rt( p->nRef==0 )
25b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 77 6e 65 72  ;.      p->owner
25c0: 20 3d 20 73 65 6c 66 3b 0a 20 20 20 20 20 20 70   = self;.      p
25d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
25e0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  }.  }.#else.  /*
25f0: 20 55 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   Use the built-i
2600: 6e 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65  n recursive mute
2610: 78 65 73 20 69 66 20 74 68 65 79 20 61 72 65 20  xes if they are 
2620: 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 2a 2f 0a  available..  */.
2630: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
2640: 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74 65 78 29 3b  lock(&p->mutex);
2650: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 54 45  .#if SQLITE_MUTE
2660: 58 5f 4e 52 45 46 0a 20 20 61 73 73 65 72 74 28  X_NREF.  assert(
2670: 20 70 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 2d   p->nRef>0 || p-
2680: 3e 6f 77 6e 65 72 3d 3d 30 20 29 3b 0a 20 20 70  >owner==0 );.  p
2690: 2d 3e 6f 77 6e 65 72 20 3d 20 70 74 68 72 65 61  ->owner = pthrea
26a0: 64 5f 73 65 6c 66 28 29 3b 0a 20 20 70 2d 3e 6e  d_self();.  p->n
26b0: 52 65 66 2b 2b 3b 0a 23 65 6e 64 69 66 0a 23 65  Ref++;.#endif.#e
26c0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
26d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
26e0: 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20  p->trace ){.    
26f0: 70 72 69 6e 74 66 28 22 65 6e 74 65 72 20 6d 75  printf("enter mu
2700: 74 65 78 20 25 70 20 28 25 64 29 20 77 69 74 68  tex %p (%d) with
2710: 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 70 2c 20   nRef=%d\n", p, 
2720: 70 2d 3e 74 72 61 63 65 2c 20 70 2d 3e 6e 52 65  p->trace, p->nRe
2730: 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  f);.  }.#endif.}
2740: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 68 72  .static int pthr
2750: 65 61 64 4d 75 74 65 78 54 72 79 28 73 71 6c 69  eadMutexTry(sqli
2760: 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20  te3_mutex *p){. 
2770: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
2780: 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45  t( p->id==SQLITE
2790: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
27a0: 20 7c 7c 20 70 74 68 72 65 61 64 4d 75 74 65 78   || pthreadMutex
27b0: 4e 6f 74 68 65 6c 64 28 70 29 20 29 3b 0a 0a 23  Notheld(p) );..#
27c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 4f 4d  ifdef SQLITE_HOM
27d0: 45 47 52 4f 57 4e 5f 52 45 43 55 52 53 49 56 45  EGROWN_RECURSIVE
27e0: 5f 4d 55 54 45 58 0a 20 20 2f 2a 20 49 66 20 72  _MUTEX.  /* If r
27f0: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 65 73  ecursive mutexes
2800: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
2810: 6c 65 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65  le, then we have
2820: 20 74 6f 20 67 72 6f 77 0a 20 20 2a 2a 20 6f 75   to grow.  ** ou
2830: 72 20 6f 77 6e 2e 20 20 54 68 69 73 20 69 6d 70  r own.  This imp
2840: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
2850: 6d 65 73 20 74 68 61 74 20 70 74 68 72 65 61 64  mes that pthread
2860: 5f 65 71 75 61 6c 28 29 0a 20 20 2a 2a 20 69 73  _equal().  ** is
2870: 20 61 74 6f 6d 69 63 20 2d 20 74 68 61 74 20 69   atomic - that i
2880: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 63 65  t cannot be dece
2890: 69 76 65 64 20 69 6e 74 6f 20 74 68 69 6e 6b 69  ived into thinki
28a0: 6e 67 20 73 65 6c 66 0a 20 20 2a 2a 20 61 6e 64  ng self.  ** and
28b0: 20 70 2d 3e 6f 77 6e 65 72 20 61 72 65 20 65 71   p->owner are eq
28c0: 75 61 6c 20 69 66 20 70 2d 3e 6f 77 6e 65 72 20  ual if p->owner 
28d0: 63 68 61 6e 67 65 73 20 62 65 74 77 65 65 6e 20  changes between 
28e0: 74 77 6f 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  two values.  ** 
28f0: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 65 71 75  that are not equ
2900: 61 6c 20 74 6f 20 73 65 6c 66 20 77 68 69 6c 65  al to self while
2910: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
2920: 69 73 20 74 61 6b 69 6e 67 20 70 6c 61 63 65 2e  is taking place.
2930: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65  .  ** This imple
2940: 6d 65 6e 74 61 74 69 6f 6e 20 61 6c 73 6f 20 61  mentation also a
2950: 73 73 75 6d 65 73 20 61 20 63 6f 68 65 72 65 6e  ssumes a coheren
2960: 74 20 63 61 63 68 65 20 2d 20 74 68 61 74 20 0a  t cache - that .
2970: 20 20 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72    ** separate pr
2980: 6f 63 65 73 73 65 73 20 63 61 6e 6e 6f 74 20 72  ocesses cannot r
2990: 65 61 64 20 64 69 66 66 65 72 65 6e 74 20 76 61  ead different va
29a0: 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73 61  lues from the sa
29b0: 6d 65 0a 20 20 2a 2a 20 61 64 64 72 65 73 73 20  me.  ** address 
29c0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
29d0: 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  .  If either of 
29e0: 74 68 65 73 65 20 74 77 6f 20 63 6f 6e 64 69 74  these two condit
29f0: 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  ions.  ** are no
2a00: 74 20 6d 65 74 2c 20 74 68 65 6e 20 74 68 65 20  t met, then the 
2a10: 6d 75 74 65 78 65 73 20 77 69 6c 6c 20 66 61 69  mutexes will fai
2a20: 6c 20 61 6e 64 20 70 72 6f 62 6c 65 6d 73 20 77  l and problems w
2a30: 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  ill result..  */
2a40: 0a 20 20 7b 0a 20 20 20 20 70 74 68 72 65 61 64  .  {.    pthread
2a50: 5f 74 20 73 65 6c 66 20 3d 20 70 74 68 72 65 61  _t self = pthrea
2a60: 64 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20 69 66  d_self();.    if
2a70: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 26 26 20 70  ( p->nRef>0 && p
2a80: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e  thread_equal(p->
2a90: 6f 77 6e 65 72 2c 20 73 65 6c 66 29 20 29 7b 0a  owner, self) ){.
2aa0: 20 20 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b        p->nRef++;
2ab0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2ac0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
2ad0: 20 69 66 28 20 70 74 68 72 65 61 64 5f 6d 75 74   if( pthread_mut
2ae0: 65 78 5f 74 72 79 6c 6f 63 6b 28 26 70 2d 3e 6d  ex_trylock(&p->m
2af0: 75 74 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  utex)==0 ){.    
2b00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
2b10: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d  f==0 );.      p-
2b20: 3e 6f 77 6e 65 72 20 3d 20 73 65 6c 66 3b 0a 20  >owner = self;. 
2b30: 20 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31       p->nRef = 1
2b40: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2b50: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
2b60: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2b70: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
2b80: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
2b90: 55 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  Use the built-in
2ba0: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
2bb0: 65 73 20 69 66 20 74 68 65 79 20 61 72 65 20 61  es if they are a
2bc0: 76 61 69 6c 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  vailable..  */. 
2bd0: 20 69 66 28 20 70 74 68 72 65 61 64 5f 6d 75 74   if( pthread_mut
2be0: 65 78 5f 74 72 79 6c 6f 63 6b 28 26 70 2d 3e 6d  ex_trylock(&p->m
2bf0: 75 74 65 78 29 3d 3d 30 20 29 7b 0a 23 69 66 20  utex)==0 ){.#if 
2c00: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 52 45  SQLITE_MUTEX_NRE
2c10: 46 0a 20 20 20 20 70 2d 3e 6f 77 6e 65 72 20 3d  F.    p->owner =
2c20: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
2c30: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
2c40: 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
2c50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2c60: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
2c70: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65  ITE_BUSY;.  }.#e
2c80: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
2c90: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
2ca0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2cb0: 20 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20   p->trace ){.   
2cc0: 20 70 72 69 6e 74 66 28 22 65 6e 74 65 72 20 6d   printf("enter m
2cd0: 75 74 65 78 20 25 70 20 28 25 64 29 20 77 69 74  utex %p (%d) wit
2ce0: 68 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 70 2c  h nRef=%d\n", p,
2cf0: 20 70 2d 3e 74 72 61 63 65 2c 20 70 2d 3e 6e 52   p->trace, p->nR
2d00: 65 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ef);.  }.#endif.
2d10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d20: 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
2d30: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 29 20  3_mutex_leave() 
2d40: 72 6f 75 74 69 6e 65 20 65 78 69 74 73 20 61 20  routine exits a 
2d50: 6d 75 74 65 78 20 74 68 61 74 20 77 61 73 0a 2a  mutex that was.*
2d60: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65 6e 74  * previously ent
2d70: 65 72 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  ered by the same
2d80: 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 62 65   thread.  The be
2d90: 68 61 76 69 6f 72 0a 2a 2a 20 69 73 20 75 6e 64  havior.** is und
2da0: 65 66 69 6e 65 64 20 69 66 20 74 68 65 20 6d 75  efined if the mu
2db0: 74 65 78 20 69 73 20 6e 6f 74 20 63 75 72 72 65  tex is not curre
2dc0: 6e 74 6c 79 20 65 6e 74 65 72 65 64 20 6f 72 0a  ntly entered or.
2dd0: 2a 2a 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  ** is not curren
2de0: 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  tly allocated.  
2df0: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 65 76 65  SQLite will neve
2e00: 72 20 64 6f 20 65 69 74 68 65 72 2e 0a 2a 2f 0a  r do either..*/.
2e10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 68 72  static void pthr
2e20: 65 61 64 4d 75 74 65 78 4c 65 61 76 65 28 73 71  eadMutexLeave(sq
2e30: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
2e40: 0a 20 20 61 73 73 65 72 74 28 20 70 74 68 72 65  .  assert( pthre
2e50: 61 64 4d 75 74 65 78 48 65 6c 64 28 70 29 20 29  adMutexHeld(p) )
2e60: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 54  ;.#if SQLITE_MUT
2e70: 45 58 5f 4e 52 45 46 0a 20 20 70 2d 3e 6e 52 65  EX_NREF.  p->nRe
2e80: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52  f--;.  if( p->nR
2e90: 65 66 3d 3d 30 20 29 20 70 2d 3e 6f 77 6e 65 72  ef==0 ) p->owner
2ea0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 61   = 0;.#endif.  a
2eb0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
2ec0: 30 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49  0 || p->id==SQLI
2ed0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
2ee0: 56 45 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  VE );..#ifdef SQ
2ef0: 4c 49 54 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52  LITE_HOMEGROWN_R
2f00: 45 43 55 52 53 49 56 45 5f 4d 55 54 45 58 0a 20  ECURSIVE_MUTEX. 
2f10: 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
2f20: 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d  ){.    pthread_m
2f30: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e  utex_unlock(&p->
2f40: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6c 73  mutex);.  }.#els
2f50: 65 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  e.  pthread_mute
2f60: 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74  x_unlock(&p->mut
2f70: 65 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ex);.#endif..#if
2f80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2f90: 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 20  .  if( p->trace 
2fa0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 6c  ){.    printf("l
2fb0: 65 61 76 65 20 6d 75 74 65 78 20 25 70 20 28 25  eave mutex %p (%
2fc0: 64 29 20 77 69 74 68 20 6e 52 65 66 3d 25 64 5c  d) with nRef=%d\
2fd0: 6e 22 2c 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c  n", p, p->trace,
2fe0: 20 70 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 23   p->nRef);.  }.#
2ff0: 65 6e 64 69 66 0a 7d 0a 0a 73 71 6c 69 74 65 33  endif.}..sqlite3
3000: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 63  _mutex_methods c
3010: 6f 6e 73 74 20 2a 73 71 6c 69 74 65 33 44 65 66  onst *sqlite3Def
3020: 61 75 6c 74 4d 75 74 65 78 28 76 6f 69 64 29 7b  aultMutex(void){
3030: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
3040: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
3050: 74 68 6f 64 73 20 73 4d 75 74 65 78 20 3d 20 7b  thods sMutex = {
3060: 0a 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65  .    pthreadMute
3070: 78 49 6e 69 74 2c 0a 20 20 20 20 70 74 68 72 65  xInit,.    pthre
3080: 61 64 4d 75 74 65 78 45 6e 64 2c 0a 20 20 20 20  adMutexEnd,.    
3090: 70 74 68 72 65 61 64 4d 75 74 65 78 41 6c 6c 6f  pthreadMutexAllo
30a0: 63 2c 0a 20 20 20 20 70 74 68 72 65 61 64 4d 75  c,.    pthreadMu
30b0: 74 65 78 46 72 65 65 2c 0a 20 20 20 20 70 74 68  texFree,.    pth
30c0: 72 65 61 64 4d 75 74 65 78 45 6e 74 65 72 2c 0a  readMutexEnter,.
30d0: 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65 78      pthreadMutex
30e0: 54 72 79 2c 0a 20 20 20 20 70 74 68 72 65 61 64  Try,.    pthread
30f0: 4d 75 74 65 78 4c 65 61 76 65 2c 0a 23 69 66 64  MutexLeave,.#ifd
3100: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3110: 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65 78      pthreadMutex
3120: 48 65 6c 64 2c 0a 20 20 20 20 70 74 68 72 65 61  Held,.    pthrea
3130: 64 4d 75 74 65 78 4e 6f 74 68 65 6c 64 0a 23 65  dMutexNotheld.#e
3140: 6c 73 65 0a 20 20 20 20 30 2c 0a 20 20 20 20 30  lse.    0,.    0
3150: 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 0a 20 20  .#endif.  };..  
3160: 72 65 74 75 72 6e 20 26 73 4d 75 74 65 78 3b 0a  return &sMutex;.
3170: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3180: 49 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 45 41  ITE_MUTEX_PTHREA
3190: 44 53 20 2a 2f 0a                                DS */.