/ Hex Artifact Content
Login

Artifact aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58:


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 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
0d30: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
0d40: 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
0d50: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
0d60: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
0d70: 20 70 74 68 72 65 61 64 4d 75 74 65 78 49 6e 69   pthreadMutexIni
0d80: 74 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  t(void){ return 
0d90: 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 73 74 61  SQLITE_OK; }.sta
0da0: 74 69 63 20 69 6e 74 20 70 74 68 72 65 61 64 4d  tic int pthreadM
0db0: 75 74 65 78 45 6e 64 28 76 6f 69 64 29 7b 20 72  utexEnd(void){ r
0dc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0dd0: 20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71   }../*.** The sq
0de0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
0df0: 63 28 29 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  c() routine allo
0e00: 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6d  cates a new.** m
0e10: 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 73  utex and returns
0e20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
0e30: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
0e40: 20 4e 55 4c 4c 0a 2a 2a 20 74 68 61 74 20 6d 65   NULL.** that me
0e50: 61 6e 73 20 74 68 61 74 20 61 20 6d 75 74 65 78  ans that a mutex
0e60: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c   could not be al
0e70: 6c 6f 63 61 74 65 64 2e 20 20 53 51 4c 69 74 65  located.  SQLite
0e80: 0a 2a 2a 20 77 69 6c 6c 20 75 6e 77 69 6e 64 20  .** will unwind 
0e90: 69 74 73 20 73 74 61 63 6b 20 61 6e 64 20 72 65  its stack and re
0ea0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 20 20  turn an error.  
0eb0: 54 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  The argument.** 
0ec0: 74 6f 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  to sqlite3_mutex
0ed0: 5f 61 6c 6c 6f 63 28 29 20 69 73 20 6f 6e 65 20  _alloc() is one 
0ee0: 6f 66 20 74 68 65 73 65 20 69 6e 74 65 67 65 72  of these integer
0ef0: 20 63 6f 6e 73 74 61 6e 74 73 3a 0a 2a 2a 0a 2a   constants:.**.*
0f00: 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20  * <ul>.** <li>  
0f10: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
0f20: 54 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  T.** <li>  SQLIT
0f30: 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
0f40: 45 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  E.** <li>  SQLIT
0f50: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
0f60: 41 53 54 45 52 0a 2a 2a 20 3c 6c 69 3e 20 20 53  ASTER.** <li>  S
0f70: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
0f80: 49 43 5f 4d 45 4d 0a 2a 2a 20 3c 6c 69 3e 20 20  IC_MEM.** <li>  
0f90: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
0fa0: 54 49 43 5f 4f 50 45 4e 0a 2a 2a 20 3c 6c 69 3e  TIC_OPEN.** <li>
0fb0: 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53    SQLITE_MUTEX_S
0fc0: 54 41 54 49 43 5f 50 52 4e 47 0a 2a 2a 20 3c 6c  TATIC_PRNG.** <l
0fd0: 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  i>  SQLITE_MUTEX
0fe0: 5f 53 54 41 54 49 43 5f 4c 52 55 0a 2a 2a 20 3c  _STATIC_LRU.** <
0ff0: 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45  li>  SQLITE_MUTE
1000: 58 5f 53 54 41 54 49 43 5f 50 4d 45 4d 0a 2a 2a  X_STATIC_PMEM.**
1010: 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55   <li>  SQLITE_MU
1020: 54 45 58 5f 53 54 41 54 49 43 5f 41 50 50 31 0a  TEX_STATIC_APP1.
1030: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
1040: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 41 50 50  MUTEX_STATIC_APP
1050: 32 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  2.** <li>  SQLIT
1060: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 41  E_MUTEX_STATIC_A
1070: 50 50 33 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c  PP3.** <li>  SQL
1080: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1090: 5f 56 46 53 31 0a 2a 2a 20 3c 6c 69 3e 20 20 53  _VFS1.** <li>  S
10a0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
10b0: 49 43 5f 56 46 53 32 0a 2a 2a 20 3c 6c 69 3e 20  IC_VFS2.** <li> 
10c0: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54   SQLITE_MUTEX_ST
10d0: 41 54 49 43 5f 56 46 53 33 0a 2a 2a 20 3c 2f 75  ATIC_VFS3.** </u
10e0: 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  l>.**.** The fir
10f0: 73 74 20 74 77 6f 20 63 6f 6e 73 74 61 6e 74 73  st two constants
1100: 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 6d   cause sqlite3_m
1110: 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 74 6f 20  utex_alloc() to 
1120: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
1130: 6d 75 74 65 78 2e 20 20 54 68 65 20 6e 65 77 20  mutex.  The new 
1140: 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73 69  mutex is recursi
1150: 76 65 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d  ve when SQLITE_M
1160: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 0a 2a  UTEX_RECURSIVE.*
1170: 2a 20 69 73 20 75 73 65 64 20 62 75 74 20 6e 6f  * is used but no
1180: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 6f  t necessarily so
1190: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54   when SQLITE_MUT
11a0: 45 58 5f 46 41 53 54 20 69 73 20 75 73 65 64 2e  EX_FAST is used.
11b0: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 69 6d  .** The mutex im
11c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
11d0: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  s not need to ma
11e0: 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e  ke a distinction
11f0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 53 51 4c 49  .** between SQLI
1200: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1210: 56 45 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 55  VE and SQLITE_MU
1220: 54 45 58 5f 46 41 53 54 20 69 66 20 69 74 20 64  TEX_FAST if it d
1230: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 77 61 6e 74 20  oes.** not want 
1240: 74 6f 2e 20 20 42 75 74 20 53 51 4c 69 74 65 20  to.  But SQLite 
1250: 77 69 6c 6c 20 6f 6e 6c 79 20 72 65 71 75 65 73  will only reques
1260: 74 20 61 20 72 65 63 75 72 73 69 76 65 20 6d 75  t a recursive mu
1270: 74 65 78 20 69 6e 0a 2a 2a 20 63 61 73 65 73 20  tex in.** cases 
1280: 77 68 65 72 65 20 69 74 20 72 65 61 6c 6c 79 20  where it really 
1290: 6e 65 65 64 73 20 6f 6e 65 2e 20 20 49 66 20 61  needs one.  If a
12a0: 20 66 61 73 74 65 72 20 6e 6f 6e 2d 72 65 63 75   faster non-recu
12b0: 72 73 69 76 65 20 6d 75 74 65 78 0a 2a 2a 20 69  rsive mutex.** i
12c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
12d0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
12e0: 65 20 68 6f 73 74 20 70 6c 61 74 66 6f 72 6d 2c  e host platform,
12f0: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1300: 73 74 65 6d 0a 2a 2a 20 6d 69 67 68 74 20 72 65  stem.** might re
1310: 74 75 72 6e 20 73 75 63 68 20 61 20 6d 75 74 65  turn such a mute
1320: 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
1330: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41   SQLITE_MUTEX_FA
1340: 53 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 74  ST..**.** The ot
1350: 68 65 72 20 61 6c 6c 6f 77 65 64 20 70 61 72 61  her allowed para
1360: 6d 65 74 65 72 73 20 74 6f 20 73 71 6c 69 74 65  meters to sqlite
1370: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20  3_mutex_alloc() 
1380: 65 61 63 68 20 72 65 74 75 72 6e 0a 2a 2a 20 61  each return.** a
1390: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
13a0: 61 74 69 63 20 70 72 65 65 78 69 73 74 69 6e 67  atic preexisting
13b0: 20 6d 75 74 65 78 2e 20 20 53 69 78 20 73 74 61   mutex.  Six sta
13c0: 74 69 63 20 6d 75 74 65 78 65 73 20 61 72 65 0a  tic mutexes are.
13d0: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ** used by the c
13e0: 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f  urrent version o
13f0: 66 20 53 51 4c 69 74 65 2e 20 20 46 75 74 75 72  f SQLite.  Futur
1400: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  e versions of SQ
1410: 4c 69 74 65 0a 2a 2a 20 6d 61 79 20 61 64 64 20  Lite.** may add 
1420: 61 64 64 69 74 69 6f 6e 61 6c 20 73 74 61 74 69  additional stati
1430: 63 20 6d 75 74 65 78 65 73 2e 20 20 53 74 61 74  c mutexes.  Stat
1440: 69 63 20 6d 75 74 65 78 65 73 20 61 72 65 20 66  ic mutexes are f
1450: 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75  or internal.** u
1460: 73 65 20 62 79 20 53 51 4c 69 74 65 20 6f 6e 6c  se by SQLite onl
1470: 79 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73  y.  Applications
1480: 20 74 68 61 74 20 75 73 65 20 53 51 4c 69 74 65   that use SQLite
1490: 20 6d 75 74 65 78 65 73 20 73 68 6f 75 6c 64 0a   mutexes should.
14a0: 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ** use only the 
14b0: 64 79 6e 61 6d 69 63 20 6d 75 74 65 78 65 73 20  dynamic mutexes 
14c0: 72 65 74 75 72 6e 65 64 20 62 79 20 53 51 4c 49  returned by SQLI
14d0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 6f 72  TE_MUTEX_FAST or
14e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  .** SQLITE_MUTEX
14f0: 5f 52 45 43 55 52 53 49 56 45 2e 0a 2a 2a 0a 2a  _RECURSIVE..**.*
1500: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 6f  * Note that if o
1510: 6e 65 20 6f 66 20 74 68 65 20 64 79 6e 61 6d 69  ne of the dynami
1520: 63 20 6d 75 74 65 78 20 70 61 72 61 6d 65 74 65  c mutex paramete
1530: 72 73 20 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  rs (SQLITE_MUTEX
1540: 5f 46 41 53 54 0a 2a 2a 20 6f 72 20 53 51 4c 49  _FAST.** or SQLI
1550: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1560: 56 45 29 20 69 73 20 75 73 65 64 20 74 68 65 6e  VE) is used then
1570: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1580: 6c 6c 6f 63 28 29 0a 2a 2a 20 72 65 74 75 72 6e  lloc().** return
1590: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 75  s a different mu
15a0: 74 65 78 20 6f 6e 20 65 76 65 72 79 20 63 61 6c  tex on every cal
15b0: 6c 2e 20 20 42 75 74 20 66 6f 72 20 74 68 65 20  l.  But for the 
15c0: 73 74 61 74 69 63 20 0a 2a 2a 20 6d 75 74 65 78  static .** mutex
15d0: 20 74 79 70 65 73 2c 20 74 68 65 20 73 61 6d 65   types, the same
15e0: 20 6d 75 74 65 78 20 69 73 20 72 65 74 75 72 6e   mutex is return
15f0: 65 64 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c  ed on every call
1600: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 74 68 65   that has.** the
1610: 20 73 61 6d 65 20 74 79 70 65 20 6e 75 6d 62 65   same type numbe
1620: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  r..*/.static sql
1630: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 74 68 72  ite3_mutex *pthr
1640: 65 61 64 4d 75 74 65 78 41 6c 6c 6f 63 28 69 6e  eadMutexAlloc(in
1650: 74 20 69 54 79 70 65 29 7b 0a 20 20 73 74 61 74  t iType){.  stat
1660: 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ic sqlite3_mutex
1670: 20 73 74 61 74 69 63 4d 75 74 65 78 65 73 5b 5d   staticMutexes[]
1680: 20 3d 20 7b 0a 20 20 20 20 53 51 4c 49 54 45 33   = {.    SQLITE3
1690: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
16a0: 45 52 28 32 29 2c 0a 20 20 20 20 53 51 4c 49 54  ER(2),.    SQLIT
16b0: 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  E3_MUTEX_INITIAL
16c0: 49 5a 45 52 28 33 29 2c 0a 20 20 20 20 53 51 4c  IZER(3),.    SQL
16d0: 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49  ITE3_MUTEX_INITI
16e0: 41 4c 49 5a 45 52 28 34 29 2c 0a 20 20 20 20 53  ALIZER(4),.    S
16f0: 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49  QLITE3_MUTEX_INI
1700: 54 49 41 4c 49 5a 45 52 28 35 29 2c 0a 20 20 20  TIALIZER(5),.   
1710: 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49   SQLITE3_MUTEX_I
1720: 4e 49 54 49 41 4c 49 5a 45 52 28 36 29 2c 0a 20  NITIALIZER(6),. 
1730: 20 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58     SQLITE3_MUTEX
1740: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 28 37 29 2c  _INITIALIZER(7),
1750: 0a 20 20 20 20 53 51 4c 49 54 45 33 5f 4d 55 54  .    SQLITE3_MUT
1760: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 28 38  EX_INITIALIZER(8
1770: 29 2c 0a 20 20 20 20 53 51 4c 49 54 45 33 5f 4d  ),.    SQLITE3_M
1780: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
1790: 28 39 29 2c 0a 20 20 20 20 53 51 4c 49 54 45 33  (9),.    SQLITE3
17a0: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
17b0: 45 52 28 31 30 29 2c 0a 20 20 20 20 53 51 4c 49  ER(10),.    SQLI
17c0: 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  TE3_MUTEX_INITIA
17d0: 4c 49 5a 45 52 28 31 31 29 2c 0a 20 20 20 20 53  LIZER(11),.    S
17e0: 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49  QLITE3_MUTEX_INI
17f0: 54 49 41 4c 49 5a 45 52 28 31 32 29 2c 0a 20 20  TIALIZER(12),.  
1800: 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f    SQLITE3_MUTEX_
1810: 49 4e 49 54 49 41 4c 49 5a 45 52 28 31 33 29 0a  INITIALIZER(13).
1820: 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d    };.  sqlite3_m
1830: 75 74 65 78 20 2a 70 3b 0a 20 20 73 77 69 74 63  utex *p;.  switc
1840: 68 28 20 69 54 79 70 65 20 29 7b 0a 20 20 20 20  h( iType ){.    
1850: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45  case SQLITE_MUTE
1860: 58 5f 52 45 43 55 52 53 49 56 45 3a 20 7b 0a 20  X_RECURSIVE: {. 
1870: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
1880: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1890: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 20 20  of(*p) );.      
18a0: 69 66 28 20 70 20 29 7b 0a 23 69 66 64 65 66 20  if( p ){.#ifdef 
18b0: 53 51 4c 49 54 45 5f 48 4f 4d 45 47 52 4f 57 4e  SQLITE_HOMEGROWN
18c0: 5f 52 45 43 55 52 53 49 56 45 5f 4d 55 54 45 58  _RECURSIVE_MUTEX
18d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72  .        /* If r
18e0: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 65 73  ecursive mutexes
18f0: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
1900: 6c 65 2c 20 77 65 20 77 69 6c 6c 20 68 61 76 65  le, we will have
1910: 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62   to.        ** b
1920: 75 69 6c 64 20 6f 75 72 20 6f 77 6e 2e 20 20 53  uild our own.  S
1930: 65 65 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ee below. */.   
1940: 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74       pthread_mut
1950: 65 78 5f 69 6e 69 74 28 26 70 2d 3e 6d 75 74 65  ex_init(&p->mute
1960: 78 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  x, 0);.#else.   
1970: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 65       /* Use a re
1980: 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 66  cursive mutex if
1990: 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
19a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 74 68 72   */.        pthr
19b0: 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f 74 20  ead_mutexattr_t 
19c0: 72 65 63 75 72 73 69 76 65 41 74 74 72 3b 0a 20  recursiveAttr;. 
19d0: 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
19e0: 75 74 65 78 61 74 74 72 5f 69 6e 69 74 28 26 72  utexattr_init(&r
19f0: 65 63 75 72 73 69 76 65 41 74 74 72 29 3b 0a 20  ecursiveAttr);. 
1a00: 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
1a10: 75 74 65 78 61 74 74 72 5f 73 65 74 74 79 70 65  utexattr_settype
1a20: 28 26 72 65 63 75 72 73 69 76 65 41 74 74 72 2c  (&recursiveAttr,
1a30: 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 52   PTHREAD_MUTEX_R
1a40: 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20  ECURSIVE);.     
1a50: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
1a60: 5f 69 6e 69 74 28 26 70 2d 3e 6d 75 74 65 78 2c  _init(&p->mutex,
1a70: 20 26 72 65 63 75 72 73 69 76 65 41 74 74 72 29   &recursiveAttr)
1a80: 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61  ;.        pthrea
1a90: 64 5f 6d 75 74 65 78 61 74 74 72 5f 64 65 73 74  d_mutexattr_dest
1aa0: 72 6f 79 28 26 72 65 63 75 72 73 69 76 65 41 74  roy(&recursiveAt
1ab0: 74 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  tr);.#endif.#if 
1ac0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 52 45  SQLITE_MUTEX_NRE
1ad0: 46 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  F || defined(SQL
1ae0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1af0: 52 4d 4f 52 29 0a 20 20 20 20 20 20 20 20 70 2d  RMOR).        p-
1b00: 3e 69 64 20 3d 20 53 51 4c 49 54 45 5f 4d 55 54  >id = SQLITE_MUT
1b10: 45 58 5f 52 45 43 55 52 53 49 56 45 3b 0a 23 65  EX_RECURSIVE;.#e
1b20: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
1b30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b50: 4d 55 54 45 58 5f 46 41 53 54 3a 20 7b 0a 20 20  MUTEX_FAST: {.  
1b60: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d      p = sqlite3M
1b70: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1b80: 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 20 20 69  f(*p) );.      i
1b90: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  f( p ){.        
1ba0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
1bb0: 69 74 28 26 70 2d 3e 6d 75 74 65 78 2c 20 30 29  it(&p->mutex, 0)
1bc0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 54  ;.#if SQLITE_MUT
1bd0: 45 58 5f 4e 52 45 46 20 7c 7c 20 64 65 66 69 6e  EX_NREF || defin
1be0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1bf0: 5f 41 50 49 5f 41 52 4d 4f 52 29 0a 20 20 20 20  _API_ARMOR).    
1c00: 20 20 20 20 70 2d 3e 69 64 20 3d 20 53 51 4c 49      p->id = SQLI
1c10: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 3b 0a 23  TE_MUTEX_FAST;.#
1c20: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
1c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c40: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1c50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1c60: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1c70: 20 20 20 20 20 69 66 28 20 69 54 79 70 65 2d 32       if( iType-2
1c80: 3c 30 20 7c 7c 20 69 54 79 70 65 2d 32 3e 3d 41  <0 || iType-2>=A
1c90: 72 72 61 79 53 69 7a 65 28 73 74 61 74 69 63 4d  rraySize(staticM
1ca0: 75 74 65 78 65 73 29 20 29 7b 0a 20 20 20 20 20  utexes) ){.     
1cb0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1cc0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1cd0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ce0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1cf0: 20 20 20 20 70 20 3d 20 26 73 74 61 74 69 63 4d      p = &staticM
1d00: 75 74 65 78 65 73 5b 69 54 79 70 65 2d 32 5d 3b  utexes[iType-2];
1d10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d20: 20 20 7d 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49    }.  }.#if SQLI
1d30: 54 45 5f 4d 55 54 45 58 5f 4e 52 45 46 20 7c 7c  TE_MUTEX_NREF ||
1d40: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d50: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1d60: 29 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  ).  assert( p==0
1d70: 20 7c 7c 20 70 2d 3e 69 64 3d 3d 69 54 79 70 65   || p->id==iType
1d80: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
1d90: 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn p;.}.../*.**
1da0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
1db0: 61 6c 6c 6f 63 61 74 65 73 20 61 20 70 72 65 76  allocates a prev
1dc0: 69 6f 75 73 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  iously.** alloca
1dd0: 74 65 64 20 6d 75 74 65 78 2e 20 20 53 51 4c 69  ted mutex.  SQLi
1de0: 74 65 20 69 73 20 63 61 72 65 66 75 6c 20 74 6f  te is careful to
1df0: 20 64 65 61 6c 6c 6f 63 61 74 65 20 65 76 65 72   deallocate ever
1e00: 79 0a 2a 2a 20 6d 75 74 65 78 20 74 68 61 74 20  y.** mutex that 
1e10: 69 74 20 61 6c 6c 6f 63 61 74 65 73 2e 0a 2a 2f  it allocates..*/
1e20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 68  .static void pth
1e30: 72 65 61 64 4d 75 74 65 78 46 72 65 65 28 73 71  readMutexFree(sq
1e40: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
1e50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
1e60: 65 66 3d 3d 30 20 29 3b 0a 23 69 66 20 53 51 4c  ef==0 );.#if SQL
1e70: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1e80: 52 4d 4f 52 0a 20 20 69 66 28 20 70 2d 3e 69 64  RMOR.  if( p->id
1e90: 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  ==SQLITE_MUTEX_F
1ea0: 41 53 54 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51  AST || p->id==SQ
1eb0: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
1ec0: 53 49 56 45 20 29 0a 23 65 6e 64 69 66 0a 20 20  SIVE ).#endif.  
1ed0: 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  {.    pthread_mu
1ee0: 74 65 78 5f 64 65 73 74 72 6f 79 28 26 70 2d 3e  tex_destroy(&p->
1ef0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  mutex);.    sqli
1f00: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1f10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f20: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1f30: 20 20 65 6c 73 65 7b 0a 20 20 20 20 28 76 6f 69    else{.    (voi
1f40: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
1f50: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
1f70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1f80: 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  r() and sqlite3_
1f90: 6d 75 74 65 78 5f 74 72 79 28 29 20 72 6f 75 74  mutex_try() rout
1fa0: 69 6e 65 73 20 61 74 74 65 6d 70 74 0a 2a 2a 20  ines attempt.** 
1fb0: 74 6f 20 65 6e 74 65 72 20 61 20 6d 75 74 65 78  to enter a mutex
1fc0: 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 74 68  .  If another th
1fd0: 72 65 61 64 20 69 73 20 61 6c 72 65 61 64 79 20  read is already 
1fe0: 77 69 74 68 69 6e 20 74 68 65 20 6d 75 74 65 78  within the mutex
1ff0: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74  ,.** sqlite3_mut
2000: 65 78 5f 65 6e 74 65 72 28 29 20 77 69 6c 6c 20  ex_enter() will 
2010: 62 6c 6f 63 6b 20 61 6e 64 20 73 71 6c 69 74 65  block and sqlite
2020: 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 77 69  3_mutex_try() wi
2030: 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  ll return.** SQL
2040: 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 20 73  ITE_BUSY.  The s
2050: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79  qlite3_mutex_try
2060: 28 29 20 69 6e 74 65 72 66 61 63 65 20 72 65 74  () interface ret
2070: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  urns SQLITE_OK.*
2080: 2a 20 75 70 6f 6e 20 73 75 63 63 65 73 73 66 75  * upon successfu
2090: 6c 20 65 6e 74 72 79 2e 20 20 4d 75 74 65 78 65  l entry.  Mutexe
20a0: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
20b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
20c0: 55 52 53 49 56 45 20 63 61 6e 0a 2a 2a 20 62 65  URSIVE can.** be
20d0: 20 65 6e 74 65 72 65 64 20 6d 75 6c 74 69 70 6c   entered multipl
20e0: 65 20 74 69 6d 65 73 20 62 79 20 74 68 65 20 73  e times by the s
20f0: 61 6d 65 20 74 68 72 65 61 64 2e 20 20 49 6e 20  ame thread.  In 
2100: 73 75 63 68 20 63 61 73 65 73 20 74 68 65 2c 0a  such cases the,.
2110: 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65  ** mutex must be
2120: 20 65 78 69 74 65 64 20 61 6e 20 65 71 75 61 6c   exited an equal
2130: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
2140: 20 62 65 66 6f 72 65 20 61 6e 6f 74 68 65 72 20   before another 
2150: 74 68 72 65 61 64 0a 2a 2a 20 63 61 6e 20 65 6e  thread.** can en
2160: 74 65 72 2e 20 20 49 66 20 74 68 65 20 73 61 6d  ter.  If the sam
2170: 65 20 74 68 72 65 61 64 20 74 72 69 65 73 20 74  e thread tries t
2180: 6f 20 65 6e 74 65 72 20 61 6e 79 20 6f 74 68 65  o enter any othe
2190: 72 20 6b 69 6e 64 20 6f 66 20 6d 75 74 65 78 0a  r kind of mutex.
21a0: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
21b0: 65 2c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  e, the behavior 
21c0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
21d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 68  .static void pth
21e0: 72 65 61 64 4d 75 74 65 78 45 6e 74 65 72 28 73  readMutexEnter(s
21f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29  qlite3_mutex *p)
2200: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  {.  assert( p->i
2210: 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  d==SQLITE_MUTEX_
2220: 52 45 43 55 52 53 49 56 45 20 7c 7c 20 70 74 68  RECURSIVE || pth
2230: 72 65 61 64 4d 75 74 65 78 4e 6f 74 68 65 6c 64  readMutexNotheld
2240: 28 70 29 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  (p) );..#ifdef S
2250: 51 4c 49 54 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f  QLITE_HOMEGROWN_
2260: 52 45 43 55 52 53 49 56 45 5f 4d 55 54 45 58 0a  RECURSIVE_MUTEX.
2270: 20 20 2f 2a 20 49 66 20 72 65 63 75 72 73 69 76    /* If recursiv
2280: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
2290: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65  t available, the
22a0: 6e 20 77 65 20 68 61 76 65 20 74 6f 20 67 72 6f  n we have to gro
22b0: 77 0a 20 20 2a 2a 20 6f 75 72 20 6f 77 6e 2e 20  w.  ** our own. 
22c0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   This implementa
22d0: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
22e0: 74 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  t pthread_equal(
22f0: 29 0a 20 20 2a 2a 20 69 73 20 61 74 6f 6d 69 63  ).  ** is atomic
2300: 20 2d 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f   - that it canno
2310: 74 20 62 65 20 64 65 63 65 69 76 65 64 20 69 6e  t be deceived in
2320: 74 6f 20 74 68 69 6e 6b 69 6e 67 20 73 65 6c 66  to thinking self
2330: 0a 20 20 2a 2a 20 61 6e 64 20 70 2d 3e 6f 77 6e  .  ** and p->own
2340: 65 72 20 61 72 65 20 65 71 75 61 6c 20 69 66 20  er are equal if 
2350: 70 2d 3e 6f 77 6e 65 72 20 63 68 61 6e 67 65 73  p->owner changes
2360: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76 61 6c   between two val
2370: 75 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 61 72  ues.  ** that ar
2380: 65 20 6e 6f 74 20 65 71 75 61 6c 20 74 6f 20 73  e not equal to s
2390: 65 6c 66 20 77 68 69 6c 65 20 74 68 65 20 63 6f  elf while the co
23a0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 61 6b 69  mparison is taki
23b0: 6e 67 20 70 6c 61 63 65 2e 0a 20 20 2a 2a 20 54  ng place..  ** T
23c0: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
23d0: 6f 6e 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  on also assumes 
23e0: 61 20 63 6f 68 65 72 65 6e 74 20 63 61 63 68 65  a coherent cache
23f0: 20 2d 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 65   - that .  ** se
2400: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
2410: 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 64 69 66   cannot read dif
2420: 66 65 72 65 6e 74 20 76 61 6c 75 65 73 20 66 72  ferent values fr
2430: 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  om the same.  **
2440: 20 61 64 64 72 65 73 73 20 61 74 20 74 68 65 20   address at the 
2450: 73 61 6d 65 20 74 69 6d 65 2e 20 20 49 66 20 65  same time.  If e
2460: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
2470: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 0a 20 20  wo conditions.  
2480: 2a 2a 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20  ** are not met, 
2490: 74 68 65 6e 20 74 68 65 20 6d 75 74 65 78 65 73  then the mutexes
24a0: 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 70   will fail and p
24b0: 72 6f 62 6c 65 6d 73 20 77 69 6c 6c 20 72 65 73  roblems will res
24c0: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ult..  */.  {.  
24d0: 20 20 70 74 68 72 65 61 64 5f 74 20 73 65 6c 66    pthread_t self
24e0: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
24f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  );.    if( p->nR
2500: 65 66 3e 30 20 26 26 20 70 74 68 72 65 61 64 5f  ef>0 && pthread_
2510: 65 71 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20  equal(p->owner, 
2520: 73 65 6c 66 29 20 29 7b 0a 20 20 20 20 20 20 70  self) ){.      p
2530: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 65  ->nRef++;.    }e
2540: 6c 73 65 7b 0a 20 20 20 20 20 20 70 74 68 72 65  lse{.      pthre
2550: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70  ad_mutex_lock(&p
2560: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
2570: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
2580: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f  =0 );.      p->o
2590: 77 6e 65 72 20 3d 20 73 65 6c 66 3b 0a 20 20 20  wner = self;.   
25a0: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
25b0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
25c0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 62 75 69    /* Use the bui
25d0: 6c 74 2d 69 6e 20 72 65 63 75 72 73 69 76 65 20  lt-in recursive 
25e0: 6d 75 74 65 78 65 73 20 69 66 20 74 68 65 79 20  mutexes if they 
25f0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20  are available.. 
2600: 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f 6d 75   */.  pthread_mu
2610: 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74  tex_lock(&p->mut
2620: 65 78 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ex);.#if SQLITE_
2630: 4d 55 54 45 58 5f 4e 52 45 46 0a 20 20 61 73 73  MUTEX_NREF.  ass
2640: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 7c  ert( p->nRef>0 |
2650: 7c 20 70 2d 3e 6f 77 6e 65 72 3d 3d 30 20 29 3b  | p->owner==0 );
2660: 0a 20 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 70 74  .  p->owner = pt
2670: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
2680: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 65 6e 64 69  p->nRef++;.#endi
2690: 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  f.#endif..#ifdef
26a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26b0: 69 66 28 20 70 2d 3e 74 72 61 63 65 20 29 7b 0a  if( p->trace ){.
26c0: 20 20 20 20 70 72 69 6e 74 66 28 22 65 6e 74 65      printf("ente
26d0: 72 20 6d 75 74 65 78 20 25 70 20 28 25 64 29 20  r mutex %p (%d) 
26e0: 77 69 74 68 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  with nRef=%d\n",
26f0: 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c 20 70 2d   p, p->trace, p-
2700: 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 23 65 6e 64  >nRef);.  }.#end
2710: 69 66 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  if.}.static int 
2720: 70 74 68 72 65 61 64 4d 75 74 65 78 54 72 79 28  pthreadMutexTry(
2730: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
2740: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
2750: 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51  ssert( p->id==SQ
2760: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
2770: 53 49 56 45 20 7c 7c 20 70 74 68 72 65 61 64 4d  SIVE || pthreadM
2780: 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 29 20 29  utexNotheld(p) )
2790: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
27a0: 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52  _HOMEGROWN_RECUR
27b0: 53 49 56 45 5f 4d 55 54 45 58 0a 20 20 2f 2a 20  SIVE_MUTEX.  /* 
27c0: 49 66 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  If recursive mut
27d0: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  exes are not ava
27e0: 69 6c 61 62 6c 65 2c 20 74 68 65 6e 20 77 65 20  ilable, then we 
27f0: 68 61 76 65 20 74 6f 20 67 72 6f 77 0a 20 20 2a  have to grow.  *
2800: 2a 20 6f 75 72 20 6f 77 6e 2e 20 20 54 68 69 73  * our own.  This
2810: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2820: 61 73 73 75 6d 65 73 20 74 68 61 74 20 70 74 68  assumes that pth
2830: 72 65 61 64 5f 65 71 75 61 6c 28 29 0a 20 20 2a  read_equal().  *
2840: 2a 20 69 73 20 61 74 6f 6d 69 63 20 2d 20 74 68  * is atomic - th
2850: 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  at it cannot be 
2860: 64 65 63 65 69 76 65 64 20 69 6e 74 6f 20 74 68  deceived into th
2870: 69 6e 6b 69 6e 67 20 73 65 6c 66 0a 20 20 2a 2a  inking self.  **
2880: 20 61 6e 64 20 70 2d 3e 6f 77 6e 65 72 20 61 72   and p->owner ar
2890: 65 20 65 71 75 61 6c 20 69 66 20 70 2d 3e 6f 77  e equal if p->ow
28a0: 6e 65 72 20 63 68 61 6e 67 65 73 20 62 65 74 77  ner changes betw
28b0: 65 65 6e 20 74 77 6f 20 76 61 6c 75 65 73 0a 20  een two values. 
28c0: 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
28d0: 20 65 71 75 61 6c 20 74 6f 20 73 65 6c 66 20 77   equal to self w
28e0: 68 69 6c 65 20 74 68 65 20 63 6f 6d 70 61 72 69  hile the compari
28f0: 73 6f 6e 20 69 73 20 74 61 6b 69 6e 67 20 70 6c  son is taking pl
2900: 61 63 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  ace..  ** This i
2910: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 6c  mplementation al
2920: 73 6f 20 61 73 73 75 6d 65 73 20 61 20 63 6f 68  so assumes a coh
2930: 65 72 65 6e 74 20 63 61 63 68 65 20 2d 20 74 68  erent cache - th
2940: 61 74 20 0a 20 20 2a 2a 20 73 65 70 61 72 61 74  at .  ** separat
2950: 65 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 6e  e processes cann
2960: 6f 74 20 72 65 61 64 20 64 69 66 66 65 72 65 6e  ot read differen
2970: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68  t values from th
2980: 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61 64 64 72  e same.  ** addr
2990: 65 73 73 20 61 74 20 74 68 65 20 73 61 6d 65 20  ess at the same 
29a0: 74 69 6d 65 2e 20 20 49 66 20 65 69 74 68 65 72  time.  If either
29b0: 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 63 6f   of these two co
29c0: 6e 64 69 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72  nditions.  ** ar
29d0: 65 20 6e 6f 74 20 6d 65 74 2c 20 74 68 65 6e 20  e not met, then 
29e0: 74 68 65 20 6d 75 74 65 78 65 73 20 77 69 6c 6c  the mutexes will
29f0: 20 66 61 69 6c 20 61 6e 64 20 70 72 6f 62 6c 65   fail and proble
2a00: 6d 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  ms will result..
2a10: 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 70 74 68    */.  {.    pth
2a20: 72 65 61 64 5f 74 20 73 65 6c 66 20 3d 20 70 74  read_t self = pt
2a30: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
2a40: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3e 30 20    if( p->nRef>0 
2a50: 26 26 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c  && pthread_equal
2a60: 28 70 2d 3e 6f 77 6e 65 72 2c 20 73 65 6c 66 29  (p->owner, self)
2a70: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65   ){.      p->nRe
2a80: 66 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  f++;.      rc = 
2a90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2aa0: 65 6c 73 65 20 69 66 28 20 70 74 68 72 65 61 64  else if( pthread
2ab0: 5f 6d 75 74 65 78 5f 74 72 79 6c 6f 63 6b 28 26  _mutex_trylock(&
2ac0: 70 2d 3e 6d 75 74 65 78 29 3d 3d 30 20 29 7b 0a  p->mutex)==0 ){.
2ad0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2ae0: 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
2af0: 20 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 73 65 6c    p->owner = sel
2b00: 66 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 66  f;.      p->nRef
2b10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
2b20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2b40: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2b50: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
2b60: 20 2f 2a 20 55 73 65 20 74 68 65 20 62 75 69 6c   /* Use the buil
2b70: 74 2d 69 6e 20 72 65 63 75 72 73 69 76 65 20 6d  t-in recursive m
2b80: 75 74 65 78 65 73 20 69 66 20 74 68 65 79 20 61  utexes if they a
2b90: 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  re available..  
2ba0: 2a 2f 0a 20 20 69 66 28 20 70 74 68 72 65 61 64  */.  if( pthread
2bb0: 5f 6d 75 74 65 78 5f 74 72 79 6c 6f 63 6b 28 26  _mutex_trylock(&
2bc0: 70 2d 3e 6d 75 74 65 78 29 3d 3d 30 20 29 7b 0a  p->mutex)==0 ){.
2bd0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  #if SQLITE_MUTEX
2be0: 5f 4e 52 45 46 0a 20 20 20 20 70 2d 3e 6f 77 6e  _NREF.    p->own
2bf0: 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  er = pthread_sel
2c00: 66 28 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  f();.    p->nRef
2c10: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  ++;.#endif.    r
2c20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2c40: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2c50: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
2c60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2c70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c80: 4b 20 26 26 20 70 2d 3e 74 72 61 63 65 20 29 7b  K && p->trace ){
2c90: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 65 6e 74  .    printf("ent
2ca0: 65 72 20 6d 75 74 65 78 20 25 70 20 28 25 64 29  er mutex %p (%d)
2cb0: 20 77 69 74 68 20 6e 52 65 66 3d 25 64 5c 6e 22   with nRef=%d\n"
2cc0: 2c 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c 20 70  , p, p->trace, p
2cd0: 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 23 65 6e  ->nRef);.  }.#en
2ce0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
2cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
2d00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2d10: 65 28 29 20 72 6f 75 74 69 6e 65 20 65 78 69 74  e() routine exit
2d20: 73 20 61 20 6d 75 74 65 78 20 74 68 61 74 20 77  s a mutex that w
2d30: 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  as.** previously
2d40: 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20   entered by the 
2d50: 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 54 68  same thread.  Th
2d60: 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20 69 73  e behavior.** is
2d70: 20 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74 68   undefined if th
2d80: 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 63  e mutex is not c
2d90: 75 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 64  urrently entered
2da0: 20 6f 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 75   or.** is not cu
2db0: 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65  rrently allocate
2dc0: 64 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  d.  SQLite will 
2dd0: 6e 65 76 65 72 20 64 6f 20 65 69 74 68 65 72 2e  never do either.
2de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2df0: 70 74 68 72 65 61 64 4d 75 74 65 78 4c 65 61 76  pthreadMutexLeav
2e00: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  e(sqlite3_mutex 
2e10: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
2e20: 74 68 72 65 61 64 4d 75 74 65 78 48 65 6c 64 28  threadMutexHeld(
2e30: 70 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  p) );.#if SQLITE
2e40: 5f 4d 55 54 45 58 5f 4e 52 45 46 0a 20 20 70 2d  _MUTEX_NREF.  p-
2e50: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
2e60: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 70 2d 3e 6f  ->nRef==0 ) p->o
2e70: 77 6e 65 72 20 3d 20 30 3b 0a 23 65 6e 64 69 66  wner = 0;.#endif
2e80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
2e90: 65 66 3d 3d 30 20 7c 7c 20 70 2d 3e 69 64 3d 3d  ef==0 || p->id==
2ea0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
2eb0: 55 52 53 49 56 45 20 29 3b 0a 0a 23 69 66 64 65  URSIVE );..#ifde
2ec0: 66 20 53 51 4c 49 54 45 5f 48 4f 4d 45 47 52 4f  f SQLITE_HOMEGRO
2ed0: 57 4e 5f 52 45 43 55 52 53 49 56 45 5f 4d 55 54  WN_RECURSIVE_MUT
2ee0: 45 58 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  EX.  if( p->nRef
2ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 74 68 72 65  ==0 ){.    pthre
2f00: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
2f10: 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  &p->mutex);.  }.
2f20: 23 65 6c 73 65 0a 20 20 70 74 68 72 65 61 64 5f  #else.  pthread_
2f30: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d  mutex_unlock(&p-
2f40: 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a  >mutex);.#endif.
2f50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2f60: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 74 72  EBUG.  if( p->tr
2f70: 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
2f80: 66 28 22 6c 65 61 76 65 20 6d 75 74 65 78 20 25  f("leave mutex %
2f90: 70 20 28 25 64 29 20 77 69 74 68 20 6e 52 65 66  p (%d) with nRef
2fa0: 3d 25 64 5c 6e 22 2c 20 70 2c 20 70 2d 3e 74 72  =%d\n", p, p->tr
2fb0: 61 63 65 2c 20 70 2d 3e 6e 52 65 66 29 3b 0a 20  ace, p->nRef);. 
2fc0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73 71 6c   }.#endif.}..sql
2fd0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
2fe0: 64 73 20 63 6f 6e 73 74 20 2a 73 71 6c 69 74 65  ds const *sqlite
2ff0: 33 44 65 66 61 75 6c 74 4d 75 74 65 78 28 76 6f  3DefaultMutex(vo
3000: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
3010: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  nst sqlite3_mute
3020: 78 5f 6d 65 74 68 6f 64 73 20 73 4d 75 74 65 78  x_methods sMutex
3030: 20 3d 20 7b 0a 20 20 20 20 70 74 68 72 65 61 64   = {.    pthread
3040: 4d 75 74 65 78 49 6e 69 74 2c 0a 20 20 20 20 70  MutexInit,.    p
3050: 74 68 72 65 61 64 4d 75 74 65 78 45 6e 64 2c 0a  threadMutexEnd,.
3060: 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65 78      pthreadMutex
3070: 41 6c 6c 6f 63 2c 0a 20 20 20 20 70 74 68 72 65  Alloc,.    pthre
3080: 61 64 4d 75 74 65 78 46 72 65 65 2c 0a 20 20 20  adMutexFree,.   
3090: 20 70 74 68 72 65 61 64 4d 75 74 65 78 45 6e 74   pthreadMutexEnt
30a0: 65 72 2c 0a 20 20 20 20 70 74 68 72 65 61 64 4d  er,.    pthreadM
30b0: 75 74 65 78 54 72 79 2c 0a 20 20 20 20 70 74 68  utexTry,.    pth
30c0: 72 65 61 64 4d 75 74 65 78 4c 65 61 76 65 2c 0a  readMutexLeave,.
30d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
30e0: 42 55 47 0a 20 20 20 20 70 74 68 72 65 61 64 4d  BUG.    pthreadM
30f0: 75 74 65 78 48 65 6c 64 2c 0a 20 20 20 20 70 74  utexHeld,.    pt
3100: 68 72 65 61 64 4d 75 74 65 78 4e 6f 74 68 65 6c  hreadMutexNothel
3110: 64 0a 23 65 6c 73 65 0a 20 20 20 20 30 2c 0a 20  d.#else.    0,. 
3120: 20 20 20 30 0a 23 65 6e 64 69 66 0a 20 20 7d 3b     0.#endif.  };
3130: 0a 0a 20 20 72 65 74 75 72 6e 20 26 73 4d 75 74  ..  return &sMut
3140: 65 78 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ex;.}..#endif /*
3150: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 50 54   SQLITE_MUTEX_PT
3160: 48 52 45 41 44 53 20 2a 2f 0a                    HREADS */.