/ Hex Artifact Content
Login

Artifact 81e4c57389ba5851b6bc78c704508f0a1d8659b8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 14.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20   contains the C 
0190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
01a0: 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 65 78 65 73  mplement mutexes
01b0: 20 66 6f 72 0a 2a 2a 20 75 73 65 20 62 79 20 74   for.** use by t
01c0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a  he SQLite core..
01d0: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 75 74 65 78  **.** $Id: mutex
01e0: 2e 63 2c 76 20 31 2e 31 31 20 32 30 30 37 2f 30  .c,v 1.11 2007/0
01f0: 38 2f 32 35 20 31 34 3a 33 39 3a 34 36 20 64 72  8/25 14:39:46 dr
0200: 68 20 45 78 70 20 24 0a 2a 2f 0a 2f 2a 0a 2a 2a  h Exp $.*/./*.**
0210: 20 49 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   If SQLITE_MUTEX
0220: 5f 41 50 50 44 45 46 20 69 73 20 64 65 66 69 6e  _APPDEF is defin
0230: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 77 68  ed, then this wh
0240: 6f 6c 65 20 6d 6f 64 75 6c 65 20 69 73 0a 2a 2a  ole module is.**
0250: 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 65 71 75   omitted and equ
0260: 69 76 61 6c 65 6e 74 20 66 75 6e 63 74 69 6f 6e  ivalent function
0270: 61 6c 69 74 79 20 6d 75 73 74 20 62 65 20 70 72  ality must be pr
0280: 6f 76 69 64 65 64 20 62 79 20 74 68 65 0a 2a 2a  ovided by the.**
0290: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 68 61   application tha
02a0: 74 20 6c 69 6e 6b 73 20 61 67 61 69 6e 73 74 20  t links against 
02b0: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
02c0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
02d0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 41 50 50 44  QLITE_MUTEX_APPD
02e0: 45 46 0a 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20  EF.../* This is 
02f0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
0300: 20 72 65 61 6c 20 63 6f 64 65 0a 2a 2f 0a 23 69   real code.*/.#i
0310: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0320: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 46 69 67 75  t.h"../*.** Figu
0330: 72 65 20 6f 75 74 20 77 68 61 74 20 76 65 72 73  re out what vers
0340: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ion of the code 
0350: 74 6f 20 75 73 65 0a 2a 2f 0a 23 64 65 66 69 6e  to use.*/.#defin
0360: 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  e SQLITE_MUTEX_N
0370: 4f 4f 50 20 31 20 20 20 2f 2a 20 54 68 65 20 64  OOP 1   /* The d
0380: 65 66 61 75 6c 74 20 2a 2f 0a 23 69 66 20 64 65  efault */.#if de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03a0: 55 47 29 20 26 26 20 21 53 51 4c 49 54 45 5f 54  UG) && !SQLITE_T
03b0: 48 52 45 41 44 53 41 46 45 0a 23 20 75 6e 64 65  HREADSAFE.# unde
03c0: 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  f SQLITE_MUTEX_N
03d0: 4f 4f 50 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OOP.# define SQL
03e0: 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 5f 44  ITE_MUTEX_NOOP_D
03f0: 45 42 55 47 0a 23 65 6e 64 69 66 0a 23 69 66 20  EBUG.#endif.#if 
0400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
0410: 55 54 45 58 5f 4e 4f 4f 50 29 20 26 26 20 53 51  UTEX_NOOP) && SQ
0420: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
0430: 26 26 20 4f 53 5f 55 4e 49 58 0a 23 20 75 6e 64  && OS_UNIX.# und
0440: 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ef SQLITE_MUTEX_
0450: 4e 4f 4f 50 0a 23 20 64 65 66 69 6e 65 20 53 51  NOOP.# define SQ
0460: 4c 49 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 45  LITE_MUTEX_PTHRE
0470: 41 44 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  AD.#endif.#if de
0480: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 55 54  fined(SQLITE_MUT
0490: 45 58 5f 4e 4f 4f 50 29 20 26 26 20 53 51 4c 49  EX_NOOP) && SQLI
04a0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
04b0: 20 4f 53 5f 57 49 4e 0a 23 20 75 6e 64 65 66 20   OS_WIN.# undef 
04c0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f  SQLITE_MUTEX_NOO
04d0: 50 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  P.# define SQLIT
04e0: 45 5f 4d 55 54 45 58 5f 57 49 4e 0a 23 65 6e 64  E_MUTEX_WIN.#end
04f0: 69 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  if....#ifdef SQL
0500: 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 2f  ITE_MUTEX_NOOP./
0510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0520: 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4d  ******** No-op M
0530: 75 74 65 78 20 49 6d 70 6c 65 6d 65 6e 74 61 74  utex Implementat
0540: 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
0550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
0560: 20 54 68 69 73 20 66 69 72 73 74 20 69 6d 70 6c   This first impl
0570: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 75  ementation of mu
0580: 74 65 78 65 73 20 69 73 20 72 65 61 6c 6c 79 20  texes is really 
0590: 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e 20 6f 74 68  a no-op.  In oth
05a0: 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 6e 6f 20  er words,.** no 
05b0: 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 6f 63 63  real locking occ
05c0: 75 72 73 2e 20 20 54 68 69 73 20 69 6d 70 6c 65  urs.  This imple
05d0: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 70 70  mentation is app
05e0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
05f0: 0a 2a 2a 20 69 6e 20 73 69 6e 67 6c 65 20 74 68  .** in single th
0600: 72 65 61 64 65 64 20 61 70 70 6c 69 63 61 74 69  readed applicati
0610: 6f 6e 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  ons which do not
0620: 20 77 61 6e 74 20 74 68 65 20 65 78 74 72 61 20   want the extra 
0630: 6f 76 65 72 68 65 61 64 0a 2a 2a 20 6f 66 20 74  overhead.** of t
0640: 68 72 65 61 64 20 6c 6f 63 6b 69 6e 67 20 70 72  hread locking pr
0650: 69 6d 69 74 69 76 65 73 2e 0a 2a 2f 0a 0a 2f 2a  imitives..*/../*
0660: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
0670: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 72 6f  mutex_alloc() ro
0680: 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20  utine allocates 
0690: 61 20 6e 65 77 0a 2a 2a 20 6d 75 74 65 78 20 61  a new.** mutex a
06a0: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
06b0: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 49 66 20  nter to it.  If 
06c0: 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 0a  it returns NULL.
06d0: 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
06e0: 61 74 20 61 20 6d 75 74 65 78 20 63 6f 75 6c 64  at a mutex could
06f0: 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
0700: 64 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d  d. .*/.sqlite3_m
0710: 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 6d 75  utex *sqlite3_mu
0720: 74 65 78 5f 61 6c 6c 6f 63 28 69 6e 74 20 69 64  tex_alloc(int id
0730: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 72 65 74 75  NotUsed){.  retu
0740: 72 6e 20 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rn (sqlite3_mute
0750: 78 2a 29 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  x*)8;.}../*.** T
0760: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 61 6c  his routine deal
0770: 6c 6f 63 61 74 65 73 20 61 20 70 72 65 76 69 6f  locates a previo
0780: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d  usly allocated m
0790: 75 74 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  utex..*/.void sq
07a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
07b0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
07c0: 70 4e 6f 74 55 73 65 64 29 7b 7d 0a 0a 2f 2a 0a  pNotUsed){}../*.
07d0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** The sqlite3_m
07e0: 75 74 65 78 5f 65 6e 74 65 72 28 29 20 61 6e 64  utex_enter() and
07f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74   sqlite3_mutex_t
0800: 72 79 28 29 20 72 6f 75 74 69 6e 65 73 20 61 74  ry() routines at
0810: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 74 65  tempt.** to ente
0820: 72 20 61 20 6d 75 74 65 78 2e 20 20 49 66 20 61  r a mutex.  If a
0830: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 73  nother thread is
0840: 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
0850: 74 68 65 20 6d 75 74 65 78 2c 0a 2a 2a 20 73 71  the mutex,.** sq
0860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
0870: 72 28 29 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 61  r() will block a
0880: 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  nd sqlite3_mutex
0890: 5f 74 72 79 28 29 20 77 69 6c 6c 20 72 65 74 75  _try() will retu
08a0: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  rn.** SQLITE_BUS
08b0: 59 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  Y.  The sqlite3_
08c0: 6d 75 74 65 78 5f 74 72 79 28 29 20 69 6e 74 65  mutex_try() inte
08d0: 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 53 51  rface returns SQ
08e0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 75 70 6f 6e 20  LITE_OK.** upon 
08f0: 73 75 63 63 65 73 73 66 75 6c 20 65 6e 74 72 79  successful entry
0900: 2e 20 20 4d 75 74 65 78 65 73 20 63 72 65 61 74  .  Mutexes creat
0910: 65 64 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ed using SQLITE_
0920: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20  MUTEX_RECURSIVE 
0930: 63 61 6e 0a 2a 2a 20 62 65 20 65 6e 74 65 72 65  can.** be entere
0940: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
0950: 20 62 79 20 74 68 65 20 73 61 6d 65 20 74 68 72   by the same thr
0960: 65 61 64 2e 20 20 49 6e 20 73 75 63 68 20 63 61  ead.  In such ca
0970: 73 65 73 20 74 68 65 2c 0a 2a 2a 20 6d 75 74 65  ses the,.** mute
0980: 78 20 6d 75 73 74 20 62 65 20 65 78 69 74 65 64  x must be exited
0990: 20 61 6e 20 65 71 75 61 6c 20 6e 75 6d 62 65 72   an equal number
09a0: 20 6f 66 20 74 69 6d 65 73 20 62 65 66 6f 72 65   of times before
09b0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 0a   another thread.
09c0: 2a 2a 20 63 61 6e 20 65 6e 74 65 72 2e 20 20 49  ** can enter.  I
09d0: 66 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  f the same threa
09e0: 64 20 74 72 69 65 73 20 74 6f 20 65 6e 74 65 72  d tries to enter
09f0: 20 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64 20   any other kind 
0a00: 6f 66 20 6d 75 74 65 78 0a 2a 2a 20 6d 6f 72 65  of mutex.** more
0a10: 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68 65 20   than once, the 
0a20: 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65  behavior is unde
0a30: 66 69 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  fined..*/.void s
0a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
0a50: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
0a60: 20 2a 70 4e 6f 74 55 73 65 64 29 7b 7d 0a 69 6e   *pNotUsed){}.in
0a70: 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  t sqlite3_mutex_
0a80: 74 72 79 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  try(sqlite3_mute
0a90: 78 20 2a 70 4e 6f 74 55 73 65 64 29 7b 20 72 65  x *pNotUsed){ re
0aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
0ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  }../*.** The sql
0ac0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
0ad0: 28 29 20 72 6f 75 74 69 6e 65 20 65 78 69 74 73  () routine exits
0ae0: 20 61 20 6d 75 74 65 78 20 74 68 61 74 20 77 61   a mutex that wa
0af0: 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
0b00: 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20 73  entered by the s
0b10: 61 6d 65 20 74 68 72 65 61 64 2e 20 20 54 68 65  ame thread.  The
0b20: 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20 69 73 20   behavior.** is 
0b30: 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74 68 65  undefined if the
0b40: 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 63 75   mutex is not cu
0b50: 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 64 20  rrently entered 
0b60: 6f 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 75 72  or.** is not cur
0b70: 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64  rently allocated
0b80: 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  .  SQLite will n
0b90: 65 76 65 72 20 64 6f 20 65 69 74 68 65 72 2e 0a  ever do either..
0ba0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
0bb0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
0bc0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4e 6f 74 55  te3_mutex *pNotU
0bd0: 73 65 64 29 7b 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sed){}../*.** Th
0be0: 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e sqlite3_mutex_
0bf0: 68 65 6c 64 28 29 20 61 6e 64 20 73 71 6c 69 74  held() and sqlit
0c00: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
0c10: 28 29 20 72 6f 75 74 69 6e 65 20 61 72 65 0a 2a  () routine are.*
0c20: 2a 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  * intended for u
0c30: 73 65 20 69 6e 73 69 64 65 20 61 73 73 65 72 74  se inside assert
0c40: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
0c50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75  /.int sqlite3_mu
0c60: 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
0c70: 5f 6d 75 74 65 78 20 2a 70 4e 6f 74 55 73 65 64  _mutex *pNotUsed
0c80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  ){.  return 1;.}
0c90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75 74  .int sqlite3_mut
0ca0: 65 78 5f 6e 6f 74 68 65 6c 64 28 73 71 6c 69 74  ex_notheld(sqlit
0cb0: 65 33 5f 6d 75 74 65 78 20 2a 70 4e 6f 74 55 73  e3_mutex *pNotUs
0cc0: 65 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ed){.  return 1;
0cd0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
0ce0: 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 20 2a  ITE_MUTEX_NOOP *
0cf0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
0d00: 5f 4d 55 54 45 58 5f 4e 4f 4f 50 5f 44 45 42 55  _MUTEX_NOOP_DEBU
0d10: 47 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G./*************
0d20: 2a 2a 20 45 72 72 6f 72 2d 63 68 65 63 6b 69 6e  ** Error-checkin
0d30: 67 20 4e 6f 2d 6f 70 20 4d 75 74 65 78 20 49 6d  g No-op Mutex Im
0d40: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
0d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d60: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 69  .**.** In this i
0d70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 6d  mplementation, m
0d80: 75 74 65 78 65 73 20 64 6f 20 6e 6f 74 20 70 72  utexes do not pr
0d90: 6f 76 69 64 65 20 61 6e 79 20 6d 75 74 75 61 6c  ovide any mutual
0da0: 20 65 78 63 6c 75 73 69 6f 6e 2e 0a 2a 2a 20 42   exclusion..** B
0db0: 75 74 20 74 68 65 20 65 72 72 6f 72 20 63 68 65  ut the error che
0dc0: 63 6b 69 6e 67 20 69 73 20 70 72 6f 76 69 64 65  cking is provide
0dd0: 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  d.  This impleme
0de0: 6e 74 61 74 69 6f 6e 20 69 73 20 75 73 65 66 75  ntation is usefu
0df0: 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 20 70 75  l.** for test pu
0e00: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  rposes..*/../*.*
0e10: 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 62 6a 65  * The mutex obje
0e20: 63 74 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c  ct.*/.struct sql
0e30: 69 74 65 33 5f 6d 75 74 65 78 20 7b 0a 20 20 69  ite3_mutex {.  i
0e40: 6e 74 20 69 64 3b 0a 20 20 69 6e 74 20 63 6e 74  nt id;.  int cnt
0e50: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.};../*.** The 
0e60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
0e70: 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65 20 61 6c  loc() routine al
0e80: 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  locates a new.**
0e90: 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72   mutex and retur
0ea0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
0eb0: 69 74 2e 20 20 49 66 20 69 74 20 72 65 74 75 72  it.  If it retur
0ec0: 6e 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 61 74 20  ns NULL.** that 
0ed0: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 75 74  means that a mut
0ee0: 65 78 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ex could not be 
0ef0: 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 2a 2f 0a 73  allocated. .*/.s
0f00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71  qlite3_mutex *sq
0f10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
0f20: 63 28 69 6e 74 20 69 64 29 7b 0a 20 20 73 74 61  c(int id){.  sta
0f30: 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  tic sqlite3_mute
0f40: 78 20 61 53 74 61 74 69 63 5b 34 5d 3b 0a 20 20  x aStatic[4];.  
0f50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0f60: 4e 65 77 20 3d 20 30 3b 0a 20 20 73 77 69 74 63  New = 0;.  switc
0f70: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
0f80: 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  e SQLITE_MUTEX_F
0f90: 41 53 54 3a 0a 20 20 20 20 63 61 73 65 20 53 51  AST:.    case SQ
0fa0: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
0fb0: 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 70 4e  SIVE: {.      pN
0fc0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
0fd0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77  loc(sizeof(*pNew
0fe0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  ));.      if( pN
0ff0: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ew ){.        pN
1000: 65 77 2d 3e 69 64 20 3d 20 69 64 3b 0a 20 20 20  ew->id = id;.   
1010: 20 20 20 20 20 70 4e 65 77 2d 3e 63 6e 74 20 3d       pNew->cnt =
1020: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1040: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1050: 20 20 20 20 61 73 73 65 72 74 28 20 69 64 2d 32      assert( id-2
1060: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 61   >= 0 );.      a
1070: 73 73 65 72 74 28 20 69 64 2d 32 20 3c 20 73 69  ssert( id-2 < si
1080: 7a 65 6f 66 28 61 53 74 61 74 69 63 29 2f 73 69  zeof(aStatic)/si
1090: 7a 65 6f 66 28 61 53 74 61 74 69 63 5b 30 5d 29  zeof(aStatic[0])
10a0: 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
10b0: 20 26 61 53 74 61 74 69 63 5b 69 64 2d 32 5d 3b   &aStatic[id-2];
10c0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 64 20  .      pNew->id 
10d0: 3d 20 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61  = id;.      brea
10e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
10f0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
1100: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1110: 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61 20  e deallocates a 
1120: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
1130: 61 74 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 76  ated mutex..*/.v
1140: 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  oid sqlite3_mute
1150: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 6d  x_free(sqlite3_m
1160: 75 74 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65  utex *p){.  asse
1170: 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
1180: 74 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a  t( p->cnt==0 );.
1190: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d    assert( p->id=
11a0: 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  =SQLITE_MUTEX_FA
11b0: 53 54 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c  ST || p->id==SQL
11c0: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
11d0: 49 56 45 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  IVE );.  sqlite3
11e0: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
11f0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** The sqlite3_m
1200: 75 74 65 78 5f 65 6e 74 65 72 28 29 20 61 6e 64  utex_enter() and
1210: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74   sqlite3_mutex_t
1220: 72 79 28 29 20 72 6f 75 74 69 6e 65 73 20 61 74  ry() routines at
1230: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 74 65  tempt.** to ente
1240: 72 20 61 20 6d 75 74 65 78 2e 20 20 49 66 20 61  r a mutex.  If a
1250: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 73  nother thread is
1260: 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
1270: 74 68 65 20 6d 75 74 65 78 2c 0a 2a 2a 20 73 71  the mutex,.** sq
1280: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1290: 72 28 29 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 61  r() will block a
12a0: 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  nd sqlite3_mutex
12b0: 5f 74 72 79 28 29 20 77 69 6c 6c 20 72 65 74 75  _try() will retu
12c0: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  rn.** SQLITE_BUS
12d0: 59 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  Y.  The sqlite3_
12e0: 6d 75 74 65 78 5f 74 72 79 28 29 20 69 6e 74 65  mutex_try() inte
12f0: 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 53 51  rface returns SQ
1300: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 75 70 6f 6e 20  LITE_OK.** upon 
1310: 73 75 63 63 65 73 73 66 75 6c 20 65 6e 74 72 79  successful entry
1320: 2e 20 20 4d 75 74 65 78 65 73 20 63 72 65 61 74  .  Mutexes creat
1330: 65 64 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ed using SQLITE_
1340: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20  MUTEX_RECURSIVE 
1350: 63 61 6e 0a 2a 2a 20 62 65 20 65 6e 74 65 72 65  can.** be entere
1360: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
1370: 20 62 79 20 74 68 65 20 73 61 6d 65 20 74 68 72   by the same thr
1380: 65 61 64 2e 20 20 49 6e 20 73 75 63 68 20 63 61  ead.  In such ca
1390: 73 65 73 20 74 68 65 2c 0a 2a 2a 20 6d 75 74 65  ses the,.** mute
13a0: 78 20 6d 75 73 74 20 62 65 20 65 78 69 74 65 64  x must be exited
13b0: 20 61 6e 20 65 71 75 61 6c 20 6e 75 6d 62 65 72   an equal number
13c0: 20 6f 66 20 74 69 6d 65 73 20 62 65 66 6f 72 65   of times before
13d0: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 0a   another thread.
13e0: 2a 2a 20 63 61 6e 20 65 6e 74 65 72 2e 20 20 49  ** can enter.  I
13f0: 66 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  f the same threa
1400: 64 20 74 72 69 65 73 20 74 6f 20 65 6e 74 65 72  d tries to enter
1410: 20 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64 20   any other kind 
1420: 6f 66 20 6d 75 74 65 78 0a 2a 2a 20 6d 6f 72 65  of mutex.** more
1430: 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68 65 20   than once, the 
1440: 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65  behavior is unde
1450: 66 69 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  fined..*/.void s
1460: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1470: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
1480: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
1490: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p );.  assert( p
14a0: 2d 3e 63 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69  ->cnt==0 || p->i
14b0: 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  d==SQLITE_MUTEX_
14c0: 52 45 43 55 52 53 49 56 45 20 29 3b 0a 20 20 70  RECURSIVE );.  p
14d0: 2d 3e 63 6e 74 2b 2b 3b 0a 7d 0a 69 6e 74 20 73  ->cnt++;.}.int s
14e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79  qlite3_mutex_try
14f0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
1500: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20  p){.  assert( p 
1510: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6e 74 3e  );.  if( p->cnt>
1520: 30 20 26 26 20 70 2d 3e 69 64 21 3d 53 51 4c 49  0 && p->id!=SQLI
1530: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1540: 56 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  VE ){.    return
1550: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1560: 7d 0a 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20  }.  p->cnt++;.  
1570: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1590: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a0: 76 65 28 29 20 72 6f 75 74 69 6e 65 20 65 78 69  ve() routine exi
15b0: 74 73 20 61 20 6d 75 74 65 78 20 74 68 61 74 20  ts a mutex that 
15c0: 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
15d0: 79 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 65  y entered by the
15e0: 20 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 54   same thread.  T
15f0: 68 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20 69  he behavior.** i
1600: 73 20 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74  s undefined if t
1610: 68 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20  he mutex is not 
1620: 63 75 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65  currently entere
1630: 64 20 6f 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  d or.** is not c
1640: 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74  urrently allocat
1650: 65 64 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  ed.  SQLite will
1660: 20 6e 65 76 65 72 20 64 6f 20 65 69 74 68 65 72   never do either
1670: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1680: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
1690: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
16a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 63 6e  .  assert( p->cn
16b0: 74 3e 30 20 29 3b 0a 20 20 70 2d 3e 63 6e 74 2d  t>0 );.  p->cnt-
16c0: 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  -;.}../*.** The 
16d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16e0: 6c 64 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ld() and sqlite3
16f0: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29  _mutex_notheld()
1700: 20 72 6f 75 74 69 6e 65 20 61 72 65 0a 2a 2a 20   routine are.** 
1710: 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65  intended for use
1720: 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29   inside assert()
1730: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
1740: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  int sqlite3_mute
1750: 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d  x_held(sqlite3_m
1760: 75 74 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75  utex *p){.  retu
1770: 72 6e 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 63 6e  rn p==0 || p->cn
1780: 74 3e 30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  t>0;.}.int sqlit
1790: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
17a0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
17b0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d  p){.  return p==
17c0: 30 20 7c 7c 20 70 2d 3e 63 6e 74 3d 3d 30 3b 0a  0 || p->cnt==0;.
17d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
17e0: 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 5f 44 45  TE_MUTEX_NOOP_DE
17f0: 42 55 47 20 2a 2f 0a 0a 0a 0a 23 69 66 64 65 66  BUG */....#ifdef
1800: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 50 54   SQLITE_MUTEX_PT
1810: 48 52 45 41 44 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  HREAD./*********
1820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 74 68 72  *********** Pthr
1830: 65 61 64 20 4d 75 74 65 78 20 49 6d 70 6c 65 6d  ead Mutex Implem
1840: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
1850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1860: 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d  *.** This implem
1870: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 75 74 65  entation of mute
1880: 78 65 73 20 69 73 20 62 75 69 6c 74 20 75 73 69  xes is built usi
1890: 6e 67 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  ng a version of 
18a0: 70 74 68 72 65 61 64 73 20 74 68 61 74 0a 2a 2a  pthreads that.**
18b0: 20 68 61 73 20 6e 61 74 69 76 65 20 73 75 70 70   has native supp
18c0: 6f 72 74 20 66 6f 72 20 72 65 63 75 72 73 69 76  ort for recursiv
18d0: 65 20 6d 75 74 65 78 65 73 2e 0a 2a 2f 0a 23 69  e mutexes..*/.#i
18e0: 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e  nclude <pthread.
18f0: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 72  h>../*.** Each r
1900: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 69  ecursive mutex i
1910: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1920: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1930: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
1940: 75 63 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  uct sqlite3_mute
1950: 78 20 7b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75  x {.  pthread_mu
1960: 74 65 78 5f 74 20 6d 75 74 65 78 3b 20 20 20 20  tex_t mutex;    
1970: 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 74 72 6f   /* Mutex contro
1980: 6c 6c 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 2a  lling the lock *
1990: 2f 0a 20 20 69 6e 74 20 69 64 3b 20 20 20 20 20  /.  int id;     
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19b0: 2a 20 4d 75 74 65 78 20 74 79 70 65 20 2a 2f 0a  * Mutex type */.
19c0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e0: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 61 6e  Number of entran
19f0: 63 65 73 20 2a 2f 0a 20 20 70 74 68 72 65 61 64  ces */.  pthread
1a00: 5f 74 20 6f 77 6e 65 72 3b 20 20 20 20 20 20 20  _t owner;       
1a10: 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20 74 68      /* Thread th
1a20: 61 74 20 69 73 20 77 69 74 68 69 6e 20 74 68 69  at is within thi
1a30: 73 20 6d 75 74 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  s mutex */.};../
1a40: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
1a50: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 72  _mutex_alloc() r
1a60: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
1a70: 20 61 20 6e 65 77 0a 2a 2a 20 6d 75 74 65 78 20   a new.** mutex 
1a80: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
1a90: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 49 66  inter to it.  If
1aa0: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
1ab0: 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74  .** that means t
1ac0: 68 61 74 20 61 20 6d 75 74 65 78 20 63 6f 75 6c  hat a mutex coul
1ad0: 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  d not be allocat
1ae0: 65 64 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 77  ed.  SQLite.** w
1af0: 69 6c 6c 20 75 6e 77 69 6e 64 20 69 74 73 20 73  ill unwind its s
1b00: 74 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  tack and return 
1b10: 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 61  an error.  The a
1b20: 72 67 75 6d 65 6e 74 0a 2a 2a 20 74 6f 20 73 71  rgument.** to sq
1b30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1b40: 63 28 29 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  c() is one of th
1b50: 65 73 65 20 69 6e 74 65 67 65 72 20 63 6f 6e 73  ese integer cons
1b60: 74 61 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c  tants:.**.** <ul
1b70: 3e 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  >.** <li>  SQLIT
1b80: 45 5f 4d 55 54 45 58 5f 46 41 53 54 0a 2a 2a 20  E_MUTEX_FAST.** 
1b90: 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54  <li>  SQLITE_MUT
1ba0: 45 58 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  EX_RECURSIVE.** 
1bb0: 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54  <li>  SQLITE_MUT
1bc0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
1bd0: 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45  .** <li>  SQLITE
1be0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
1bf0: 4d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  M.** <li>  SQLIT
1c00: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1c10: 45 4d 32 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c  EM2.** <li>  SQL
1c20: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1c30: 5f 50 52 4e 47 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a  _PRNG.** </ul>.*
1c40: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1c50: 77 6f 20 63 6f 6e 73 74 61 6e 74 73 20 63 61 75  wo constants cau
1c60: 73 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  se sqlite3_mutex
1c70: 5f 61 6c 6c 6f 63 28 29 20 74 6f 20 63 72 65 61  _alloc() to crea
1c80: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6d 75 74 65  te.** a new mute
1c90: 78 2e 20 20 54 68 65 20 6e 65 77 20 6d 75 74 65  x.  The new mute
1ca0: 78 20 69 73 20 72 65 63 75 72 73 69 76 65 20 77  x is recursive w
1cb0: 68 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  hen SQLITE_MUTEX
1cc0: 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 69 73  _RECURSIVE.** is
1cd0: 20 75 73 65 64 20 62 75 74 20 6e 6f 74 20 6e 65   used but not ne
1ce0: 63 65 73 73 61 72 69 6c 79 20 73 6f 20 77 68 65  cessarily so whe
1cf0: 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  n SQLITE_MUTEX_F
1d00: 41 53 54 20 69 73 20 75 73 65 64 2e 0a 2a 2a 20  AST is used..** 
1d10: 54 68 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  The mutex implem
1d20: 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
1d30: 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61  t need to make a
1d40: 20 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20   distinction.** 
1d50: 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 4d  between SQLITE_M
1d60: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 61  UTEX_RECURSIVE a
1d70: 6e 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  nd SQLITE_MUTEX_
1d80: 46 41 53 54 20 69 66 20 69 74 20 64 6f 65 73 0a  FAST if it does.
1d90: 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 2e 20  ** not want to. 
1da0: 20 42 75 74 20 53 51 4c 69 74 65 20 77 69 6c 6c   But SQLite will
1db0: 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 20 61 20   only request a 
1dc0: 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 20  recursive mutex 
1dd0: 69 6e 0a 2a 2a 20 63 61 73 65 73 20 77 68 65 72  in.** cases wher
1de0: 65 20 69 74 20 72 65 61 6c 6c 79 20 6e 65 65 64  e it really need
1df0: 73 20 6f 6e 65 2e 20 20 49 66 20 61 20 66 61 73  s one.  If a fas
1e00: 74 65 72 20 6e 6f 6e 2d 72 65 63 75 72 73 69 76  ter non-recursiv
1e10: 65 20 6d 75 74 65 78 0a 2a 2a 20 69 6d 70 6c 65  e mutex.** imple
1e20: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 76 61  mentation is ava
1e30: 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f  ilable on the ho
1e40: 73 74 20 70 6c 61 74 66 6f 72 6d 2c 20 74 68 65  st platform, the
1e50: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1e60: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
1e70: 20 73 75 63 68 20 61 20 6d 75 74 65 78 20 69 6e   such a mutex in
1e80: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 53 51 4c   response to SQL
1e90: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 2e 0a  ITE_MUTEX_FAST..
1ea0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 74 68 65 72 20  **.** The other 
1eb0: 61 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65 74 65  allowed paramete
1ec0: 72 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d 75  rs to sqlite3_mu
1ed0: 74 65 78 5f 61 6c 6c 6f 63 28 29 20 65 61 63 68  tex_alloc() each
1ee0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
1ef0: 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 69 63  nter to a static
1f00: 20 70 72 65 65 78 69 73 74 69 6e 67 20 6d 75 74   preexisting mut
1f10: 65 78 2e 20 20 54 68 72 65 65 20 73 74 61 74 69  ex.  Three stati
1f20: 63 20 6d 75 74 65 78 65 73 20 61 72 65 0a 2a 2a  c mutexes are.**
1f30: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 75 72   used by the cur
1f40: 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  rent version of 
1f50: 53 51 4c 69 74 65 2e 20 20 46 75 74 75 72 65 20  SQLite.  Future 
1f60: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
1f70: 74 65 0a 2a 2a 20 6d 61 79 20 61 64 64 20 61 64  te.** may add ad
1f80: 64 69 74 69 6f 6e 61 6c 20 73 74 61 74 69 63 20  ditional static 
1f90: 6d 75 74 65 78 65 73 2e 20 20 53 74 61 74 69 63  mutexes.  Static
1fa0: 20 6d 75 74 65 78 65 73 20 61 72 65 20 66 6f 72   mutexes are for
1fb0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
1fc0: 20 62 79 20 53 51 4c 69 74 65 20 6f 6e 6c 79 2e   by SQLite only.
1fd0: 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 74    Applications t
1fe0: 68 61 74 20 75 73 65 20 53 51 4c 69 74 65 20 6d  hat use SQLite m
1ff0: 75 74 65 78 65 73 20 73 68 6f 75 6c 64 0a 2a 2a  utexes should.**
2000: 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 64 79   use only the dy
2010: 6e 61 6d 69 63 20 6d 75 74 65 78 65 73 20 72 65  namic mutexes re
2020: 74 75 72 6e 65 64 20 62 79 20 53 51 4c 49 54 45  turned by SQLITE
2030: 5f 4d 55 54 45 58 5f 46 41 53 54 20 6f 72 0a 2a  _MUTEX_FAST or.*
2040: 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  * SQLITE_MUTEX_R
2050: 45 43 55 52 53 49 56 45 2e 0a 2a 2a 0a 2a 2a 20  ECURSIVE..**.** 
2060: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 6f 6e 65  Note that if one
2070: 20 6f 66 20 74 68 65 20 64 79 6e 61 6d 69 63 20   of the dynamic 
2080: 6d 75 74 65 78 20 70 61 72 61 6d 65 74 65 72 73  mutex parameters
2090: 20 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46   (SQLITE_MUTEX_F
20a0: 41 53 54 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  AST.** or SQLITE
20b0: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
20c0: 29 20 69 73 20 75 73 65 64 20 74 68 65 6e 20 73  ) is used then s
20d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
20e0: 6f 63 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  oc().** returns 
20f0: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 75 74 65  a different mute
2100: 78 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e  x on every call.
2110: 20 20 42 75 74 20 66 6f 72 20 74 68 65 20 73 74    But for the st
2120: 61 74 69 63 20 0a 2a 2a 20 6d 75 74 65 78 20 74  atic .** mutex t
2130: 79 70 65 73 2c 20 74 68 65 20 73 61 6d 65 20 6d  ypes, the same m
2140: 75 74 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  utex is returned
2150: 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 20 74   on every call t
2160: 68 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 73  hat has.** the s
2170: 61 6d 65 20 74 79 70 65 20 6e 75 6d 62 65 72 2e  ame type number.
2180: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
2190: 78 20 2a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  x *sqlite3_mutex
21a0: 5f 61 6c 6c 6f 63 28 69 6e 74 20 69 54 79 70 65  _alloc(int iType
21b0: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
21c0: 74 65 33 5f 6d 75 74 65 78 20 73 74 61 74 69 63  te3_mutex static
21d0: 4d 75 74 65 78 65 73 5b 5d 20 3d 20 7b 0a 20 20  Mutexes[] = {.  
21e0: 20 20 7b 20 50 54 48 52 45 41 44 5f 4d 55 54 45    { PTHREAD_MUTE
21f0: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 20 7d  X_INITIALIZER, }
2200: 2c 0a 20 20 20 20 7b 20 50 54 48 52 45 41 44 5f  ,.    { PTHREAD_
2210: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
2220: 52 2c 20 7d 2c 0a 20 20 20 20 7b 20 50 54 48 52  R, },.    { PTHR
2230: 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  EAD_MUTEX_INITIA
2240: 4c 49 5a 45 52 2c 20 7d 2c 0a 20 20 20 20 7b 20  LIZER, },.    { 
2250: 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
2260: 49 54 49 41 4c 49 5a 45 52 2c 20 7d 2c 0a 20 20  ITIALIZER, },.  
2270: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  };.  sqlite3_mut
2280: 65 78 20 2a 70 3b 0a 20 20 73 77 69 74 63 68 28  ex *p;.  switch(
2290: 20 69 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61   iType ){.    ca
22a0: 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  se SQLITE_MUTEX_
22b0: 52 45 43 55 52 53 49 56 45 3a 20 7b 0a 20 20 20  RECURSIVE: {.   
22c0: 20 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61     static pthrea
22d0: 64 5f 6d 75 74 65 78 5f 74 20 69 6e 69 74 4d 75  d_mutex_t initMu
22e0: 74 65 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55  tex = PTHREAD_MU
22f0: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b  TEX_INITIALIZER;
2300: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e  .      static in
2310: 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  t isInit = 0;.  
2320: 20 20 20 20 73 74 61 74 69 63 20 70 74 68 72 65      static pthre
2330: 61 64 5f 6d 75 74 65 78 61 74 74 72 5f 74 20 72  ad_mutexattr_t r
2340: 65 63 75 72 73 69 76 65 41 74 74 72 3b 0a 20 20  ecursiveAttr;.  
2350: 20 20 20 20 69 66 28 20 21 69 73 49 6e 69 74 20      if( !isInit 
2360: 29 7b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65  ){.        pthre
2370: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 69  ad_mutex_lock(&i
2380: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  nitMutex);.     
2390: 20 20 20 69 66 28 20 21 69 73 49 6e 69 74 20 29     if( !isInit )
23a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 68 72  {.          pthr
23b0: 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f 69 6e  ead_mutexattr_in
23c0: 69 74 28 26 72 65 63 75 72 73 69 76 65 41 74 74  it(&recursiveAtt
23d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 74  r);.          pt
23e0: 68 72 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f  hread_mutexattr_
23f0: 73 65 74 74 79 70 65 28 26 72 65 63 75 72 73 69  settype(&recursi
2400: 76 65 41 74 74 72 2c 20 50 54 48 52 45 41 44 5f  veAttr, PTHREAD_
2410: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
2420: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2430: 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a      isInit = 1;.
2440: 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f          pthread_
2450: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 69 6e  mutex_unlock(&in
2460: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  itMutex);.      
2470: 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69  }.      p = sqli
2480: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
2490: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20  izeof(*p) );.   
24a0: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
24b0: 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70      p->id = iTyp
24c0: 65 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65  e;.        pthre
24d0: 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 70  ad_mutex_init(&p
24e0: 2d 3e 6d 75 74 65 78 2c 20 26 72 65 63 75 72 73  ->mutex, &recurs
24f0: 69 76 65 41 74 74 72 29 3b 0a 20 20 20 20 20 20  iveAttr);.      
2500: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2510: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2520: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 3a  LITE_MUTEX_FAST:
2530: 20 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c   {.      p = sql
2540: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2550: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
2560: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
2570: 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 54 79       p->id = iTy
2580: 70 65 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72  pe;.        pthr
2590: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
25a0: 70 2d 3e 6d 75 74 65 78 2c 20 30 29 3b 0a 20 20  p->mutex, 0);.  
25b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
25c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
25d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
25e0: 73 65 72 74 28 20 69 54 79 70 65 2d 32 20 3e 3d  sert( iType-2 >=
25f0: 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0 );.      asse
2600: 72 74 28 20 69 54 79 70 65 2d 32 20 3c 20 73 69  rt( iType-2 < si
2610: 7a 65 6f 66 28 73 74 61 74 69 63 4d 75 74 65 78  zeof(staticMutex
2620: 65 73 29 2f 73 69 7a 65 6f 66 28 73 74 61 74 69  es)/sizeof(stati
2630: 63 4d 75 74 65 78 65 73 5b 30 5d 29 20 29 3b 0a  cMutexes[0]) );.
2640: 20 20 20 20 20 20 70 20 3d 20 26 73 74 61 74 69        p = &stati
2650: 63 4d 75 74 65 78 65 73 5b 69 54 79 70 65 2d 32  cMutexes[iType-2
2660: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 69 64 20 3d  ];.      p->id =
2670: 20 69 54 79 70 65 3b 0a 20 20 20 20 20 20 62 72   iType;.      br
2680: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2690: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
26a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26b0: 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61 20  e deallocates a 
26c0: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 61 6c  previously.** al
26d0: 6c 6f 63 61 74 65 64 20 6d 75 74 65 78 2e 20 20  located mutex.  
26e0: 53 51 4c 69 74 65 20 69 73 20 63 61 72 65 66 75  SQLite is carefu
26f0: 6c 20 74 6f 20 64 65 61 6c 6c 6f 63 61 74 65 20  l to deallocate 
2700: 65 76 65 72 79 0a 2a 2a 20 6d 75 74 65 78 20 74  every.** mutex t
2710: 68 61 74 20 69 74 20 61 6c 6c 6f 63 61 74 65 73  hat it allocates
2720: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2730: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2740: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
2750: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
2760: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
2770: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2780: 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d   p->id==SQLITE_M
2790: 55 54 45 58 5f 46 41 53 54 20 7c 7c 20 70 2d 3e  UTEX_FAST || p->
27a0: 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58  id==SQLITE_MUTEX
27b0: 5f 52 45 43 55 52 53 49 56 45 20 29 3b 0a 20 20  _RECURSIVE );.  
27c0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 64 65  pthread_mutex_de
27d0: 73 74 72 6f 79 28 26 70 2d 3e 6d 75 74 65 78 29  stroy(&p->mutex)
27e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
27f0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
2800: 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e sqlite3_mutex_
2810: 65 6e 74 65 72 28 29 20 61 6e 64 20 73 71 6c 69  enter() and sqli
2820: 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20  te3_mutex_try() 
2830: 72 6f 75 74 69 6e 65 73 20 61 74 74 65 6d 70 74  routines attempt
2840: 0a 2a 2a 20 74 6f 20 65 6e 74 65 72 20 61 20 6d  .** to enter a m
2850: 75 74 65 78 2e 20 20 49 66 20 61 6e 6f 74 68 65  utex.  If anothe
2860: 72 20 74 68 72 65 61 64 20 69 73 20 61 6c 72 65  r thread is alre
2870: 61 64 79 20 77 69 74 68 69 6e 20 74 68 65 20 6d  ady within the m
2880: 75 74 65 78 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  utex,.** sqlite3
2890: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20 77  _mutex_enter() w
28a0: 69 6c 6c 20 62 6c 6f 63 6b 20 61 6e 64 20 73 71  ill block and sq
28b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
28c0: 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a  ) will return.**
28d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
28e0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  he sqlite3_mutex
28f0: 5f 74 72 79 28 29 20 69 6e 74 65 72 66 61 63 65  _try() interface
2900: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2910: 4f 4b 0a 2a 2a 20 75 70 6f 6e 20 73 75 63 63 65  OK.** upon succe
2920: 73 73 66 75 6c 20 65 6e 74 72 79 2e 20 20 4d 75  ssful entry.  Mu
2930: 74 65 78 65 73 20 63 72 65 61 74 65 64 20 75 73  texes created us
2940: 69 6e 67 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  ing SQLITE_MUTEX
2950: 5f 52 45 43 55 52 53 49 56 45 20 63 61 6e 0a 2a  _RECURSIVE can.*
2960: 2a 20 62 65 20 65 6e 74 65 72 65 64 20 6d 75 6c  * be entered mul
2970: 74 69 70 6c 65 20 74 69 6d 65 73 20 62 79 20 74  tiple times by t
2980: 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e 20  he same thread. 
2990: 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74   In such cases t
29a0: 68 65 2c 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 73  he,.** mutex mus
29b0: 74 20 62 65 20 65 78 69 74 65 64 20 61 6e 20 65  t be exited an e
29c0: 71 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74  qual number of t
29d0: 69 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f 74  imes before anot
29e0: 68 65 72 20 74 68 72 65 61 64 0a 2a 2a 20 63 61  her thread.** ca
29f0: 6e 20 65 6e 74 65 72 2e 20 20 49 66 20 74 68 65  n enter.  If the
2a00: 20 73 61 6d 65 20 74 68 72 65 61 64 20 74 72 69   same thread tri
2a10: 65 73 20 74 6f 20 65 6e 74 65 72 20 61 6e 79 20  es to enter any 
2a20: 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 6d 75  other kind of mu
2a30: 74 65 78 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  tex.** more than
2a40: 20 6f 6e 63 65 2c 20 74 68 65 20 62 65 68 61 76   once, the behav
2a50: 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ior is undefined
2a60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
2a80: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
2a90: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
2aa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d    assert( p->id=
2ab0: 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  =SQLITE_MUTEX_RE
2ac0: 43 55 52 53 49 56 45 20 7c 7c 20 73 71 6c 69 74  CURSIVE || sqlit
2ad0: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
2ae0: 28 70 29 20 29 3b 0a 20 20 70 74 68 72 65 61 64  (p) );.  pthread
2af0: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e  _mutex_lock(&p->
2b00: 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 6f 77 6e  mutex);.  p->own
2b10: 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  er = pthread_sel
2b20: 66 28 29 3b 0a 20 20 70 2d 3e 6e 52 65 66 2b 2b  f();.  p->nRef++
2b30: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
2b40: 6d 75 74 65 78 5f 74 72 79 28 73 71 6c 69 74 65  mutex_try(sqlite
2b50: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 69  3_mutex *p){.  i
2b60: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
2b70: 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
2b80: 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55  p->id==SQLITE_MU
2b90: 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c 7c  TEX_RECURSIVE ||
2ba0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
2bb0: 6f 74 68 65 6c 64 28 70 29 20 29 3b 0a 20 20 69  otheld(p) );.  i
2bc0: 66 28 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  f( pthread_mutex
2bd0: 5f 74 72 79 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74  _trylock(&p->mut
2be0: 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ex)==0 ){.    p-
2bf0: 3e 6f 77 6e 65 72 20 3d 20 70 74 68 72 65 61 64  >owner = pthread
2c00: 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20 70 2d 3e  _self();.    p->
2c10: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 72 63 20 3d  nRef++;.    rc =
2c20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2c30: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
2c40: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
2c50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c60: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
2c70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 29 20 72  _mutex_leave() r
2c80: 6f 75 74 69 6e 65 20 65 78 69 74 73 20 61 20 6d  outine exits a m
2c90: 75 74 65 78 20 74 68 61 74 20 77 61 73 0a 2a 2a  utex that was.**
2ca0: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 6e 74 65   previously ente
2cb0: 72 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  red by the same 
2cc0: 74 68 72 65 61 64 2e 20 20 54 68 65 20 62 65 68  thread.  The beh
2cd0: 61 76 69 6f 72 0a 2a 2a 20 69 73 20 75 6e 64 65  avior.** is unde
2ce0: 66 69 6e 65 64 20 69 66 20 74 68 65 20 6d 75 74  fined if the mut
2cf0: 65 78 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  ex is not curren
2d00: 74 6c 79 20 65 6e 74 65 72 65 64 20 6f 72 0a 2a  tly entered or.*
2d10: 2a 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  * is not current
2d20: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 53  ly allocated.  S
2d30: 51 4c 69 74 65 20 77 69 6c 6c 20 6e 65 76 65 72  QLite will never
2d40: 20 64 6f 20 65 69 74 68 65 72 2e 0a 2a 2f 0a 76   do either..*/.v
2d50: 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  oid sqlite3_mute
2d60: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
2d70: 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  mutex *p){.  ass
2d80: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
2d90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2da0: 78 5f 68 65 6c 64 28 70 29 20 29 3b 0a 20 20 70  x_held(p) );.  p
2db0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 70 74 68 72  ->nRef--;.  pthr
2dc0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
2dd0: 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a  (&p->mutex);.}..
2de0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
2df0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 20 61  3_mutex_held() a
2e00: 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  nd sqlite3_mutex
2e10: 5f 6e 6f 74 68 65 6c 64 28 29 20 72 6f 75 74 69  _notheld() routi
2e20: 6e 65 20 61 72 65 0a 2a 2a 20 69 6e 74 65 6e 64  ne are.** intend
2e30: 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64  ed for use insid
2e40: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
2e50: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
2e60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2e70: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
2e80: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d  p){.  return p==
2e90: 30 20 7c 7c 20 28 70 2d 3e 6e 52 65 66 21 3d 30  0 || (p->nRef!=0
2ea0: 20 26 26 20 70 74 68 72 65 61 64 5f 65 71 75 61   && pthread_equa
2eb0: 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 70 74 68 72  l(p->owner, pthr
2ec0: 65 61 64 5f 73 65 6c 66 28 29 29 29 3b 0a 7d 0a  ead_self()));.}.
2ed0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  int sqlite3_mute
2ee0: 78 5f 6e 6f 74 68 65 6c 64 28 73 71 6c 69 74 65  x_notheld(sqlite
2ef0: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 72  3_mutex *p){.  r
2f00: 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c 20 70 2d  eturn p==0 || p-
2f10: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 74 68 72  >nRef==0 || pthr
2f20: 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e 6f 77 6e  ead_equal(p->own
2f30: 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  er, pthread_self
2f40: 28 29 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  ())==0;.}.#endif
2f50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   /* SQLITE_MUTEX
2f60: 5f 50 54 48 52 45 41 44 20 2a 2f 0a 0a 23 69 66  _PTHREAD */..#if
2f70: 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
2f80: 5f 57 49 4e 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  _WIN./**********
2f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 57 69 6e  ************ Win
2fa0: 64 6f 77 73 20 4d 75 74 65 78 20 49 6d 70 6c 65  dows Mutex Imple
2fb0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
2fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c  .**.** This impl
2fe0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 75  ementation of mu
2ff0: 74 65 78 65 73 20 69 73 20 62 75 69 6c 74 20 75  texes is built u
3000: 73 69 6e 67 20 74 68 65 20 77 69 6e 33 32 20 41  sing the win32 A
3010: 50 49 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 61  PI..*/../*.** Ea
3020: 63 68 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  ch recursive mut
3030: 65 78 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  ex is an instanc
3040: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3050: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
3060: 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  .struct sqlite3_
3070: 6d 75 74 65 78 20 7b 0a 20 20 43 52 49 54 49 43  mutex {.  CRITIC
3080: 41 4c 5f 53 45 43 54 49 4f 4e 20 6d 75 74 65 78  AL_SECTION mutex
3090: 3b 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f  ;    /* Mutex co
30a0: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 65 20 6c 6f  ntrolling the lo
30b0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 64 3b 20  ck */.  int id; 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 79 70 65     /* Mutex type
30e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
3110: 74 65 72 61 6e 63 65 73 20 2a 2f 0a 20 20 44 57  terances */.  DW
3120: 4f 52 44 20 6f 77 6e 65 72 3b 20 20 20 20 20 20  ORD owner;      
3130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65           /* Thre
3140: 61 64 20 68 6f 6c 64 69 6e 67 20 74 68 69 73 20  ad holding this 
3150: 6d 75 74 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  mutex */.};../*.
3160: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** The sqlite3_m
3170: 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 72 6f 75  utex_alloc() rou
3180: 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
3190: 20 6e 65 77 0a 2a 2a 20 6d 75 74 65 78 20 61 6e   new.** mutex an
31a0: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
31b0: 74 65 72 20 74 6f 20 69 74 2e 20 20 49 66 20 69  ter to it.  If i
31c0: 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 0a 2a  t returns NULL.*
31d0: 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  * that means tha
31e0: 74 20 61 20 6d 75 74 65 78 20 63 6f 75 6c 64 20  t a mutex could 
31f0: 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
3200: 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 77 69 6c  .  SQLite.** wil
3210: 6c 20 75 6e 77 69 6e 64 20 69 74 73 20 73 74 61  l unwind its sta
3220: 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ck and return an
3230: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 61 72 67   error.  The arg
3240: 75 6d 65 6e 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ument.** to sqli
3250: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
3260: 29 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  ) is one of thes
3270: 65 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  e integer consta
3280: 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  nts:.**.** <ul>.
3290: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
32a0: 4d 55 54 45 58 5f 46 41 53 54 20 20 20 20 20 20  MUTEX_FAST      
32b0: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 3c 6c           0.** <l
32c0: 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  i>  SQLITE_MUTEX
32d0: 5f 52 45 43 55 52 53 49 56 45 20 20 20 20 20 20  _RECURSIVE      
32e0: 20 20 20 20 31 0a 2a 2a 20 3c 6c 69 3e 20 20 53      1.** <li>  S
32f0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
3300: 49 43 5f 4d 41 53 54 45 52 20 20 20 20 20 20 32  IC_MASTER      2
3310: 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45  .** <li>  SQLITE
3320: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
3330: 4d 20 20 20 20 20 20 20 20 20 33 0a 2a 2a 20 3c  M         3.** <
3340: 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45  li>  SQLITE_MUTE
3350: 58 5f 53 54 41 54 49 43 5f 50 52 4e 47 20 20 20  X_STATIC_PRNG   
3360: 20 20 20 20 20 34 0a 2a 2a 20 3c 2f 75 6c 3e 0a       4.** </ul>.
3370: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
3380: 74 77 6f 20 63 6f 6e 73 74 61 6e 74 73 20 63 61  two constants ca
3390: 75 73 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  use sqlite3_mute
33a0: 78 5f 61 6c 6c 6f 63 28 29 20 74 6f 20 63 72 65  x_alloc() to cre
33b0: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6d 75 74  ate.** a new mut
33c0: 65 78 2e 20 20 54 68 65 20 6e 65 77 20 6d 75 74  ex.  The new mut
33d0: 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65 20  ex is recursive 
33e0: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45  when SQLITE_MUTE
33f0: 58 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 69  X_RECURSIVE.** i
3400: 73 20 75 73 65 64 20 62 75 74 20 6e 6f 74 20 6e  s used but not n
3410: 65 63 65 73 73 61 72 69 6c 79 20 73 6f 20 77 68  ecessarily so wh
3420: 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  en SQLITE_MUTEX_
3430: 46 41 53 54 20 69 73 20 75 73 65 64 2e 0a 2a 2a  FAST is used..**
3440: 20 54 68 65 20 6d 75 74 65 78 20 69 6d 70 6c 65   The mutex imple
3450: 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
3460: 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
3470: 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a  a distinction.**
3480: 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
3490: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20  MUTEX_RECURSIVE 
34a0: 61 6e 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  and SQLITE_MUTEX
34b0: 5f 46 41 53 54 20 69 66 20 69 74 20 64 6f 65 73  _FAST if it does
34c0: 0a 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 2e  .** not want to.
34d0: 20 20 42 75 74 20 53 51 4c 69 74 65 20 77 69 6c    But SQLite wil
34e0: 6c 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 20 61  l only request a
34f0: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
3500: 20 69 6e 0a 2a 2a 20 63 61 73 65 73 20 77 68 65   in.** cases whe
3510: 72 65 20 69 74 20 72 65 61 6c 6c 79 20 6e 65 65  re it really nee
3520: 64 73 20 6f 6e 65 2e 20 20 49 66 20 61 20 66 61  ds one.  If a fa
3530: 73 74 65 72 20 6e 6f 6e 2d 72 65 63 75 72 73 69  ster non-recursi
3540: 76 65 20 6d 75 74 65 78 0a 2a 2a 20 69 6d 70 6c  ve mutex.** impl
3550: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 76  ementation is av
3560: 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68  ailable on the h
3570: 6f 73 74 20 70 6c 61 74 66 6f 72 6d 2c 20 74 68  ost platform, th
3580: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
3590: 6d 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  m.** might retur
35a0: 6e 20 73 75 63 68 20 61 20 6d 75 74 65 78 20 69  n such a mutex i
35b0: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 53 51  n response to SQ
35c0: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 2e  LITE_MUTEX_FAST.
35d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 74 68 65 72  .**.** The other
35e0: 20 61 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65 74   allowed paramet
35f0: 65 72 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d  ers to sqlite3_m
3600: 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 65 61 63  utex_alloc() eac
3610: 68 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  h return.** a po
3620: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 69  inter to a stati
3630: 63 20 70 72 65 65 78 69 73 74 69 6e 67 20 6d 75  c preexisting mu
3640: 74 65 78 2e 20 20 54 68 72 65 65 20 73 74 61 74  tex.  Three stat
3650: 69 63 20 6d 75 74 65 78 65 73 20 61 72 65 0a 2a  ic mutexes are.*
3660: 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 63 75  * used by the cu
3670: 72 72 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66  rrent version of
3680: 20 53 51 4c 69 74 65 2e 20 20 46 75 74 75 72 65   SQLite.  Future
3690: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
36a0: 69 74 65 0a 2a 2a 20 6d 61 79 20 61 64 64 20 61  ite.** may add a
36b0: 64 64 69 74 69 6f 6e 61 6c 20 73 74 61 74 69 63  dditional static
36c0: 20 6d 75 74 65 78 65 73 2e 20 20 53 74 61 74 69   mutexes.  Stati
36d0: 63 20 6d 75 74 65 78 65 73 20 61 72 65 20 66 6f  c mutexes are fo
36e0: 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
36f0: 65 20 62 79 20 53 51 4c 69 74 65 20 6f 6e 6c 79  e by SQLite only
3700: 2e 20 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20  .  Applications 
3710: 74 68 61 74 20 75 73 65 20 53 51 4c 69 74 65 20  that use SQLite 
3720: 6d 75 74 65 78 65 73 20 73 68 6f 75 6c 64 0a 2a  mutexes should.*
3730: 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 64  * use only the d
3740: 79 6e 61 6d 69 63 20 6d 75 74 65 78 65 73 20 72  ynamic mutexes r
3750: 65 74 75 72 6e 65 64 20 62 79 20 53 51 4c 49 54  eturned by SQLIT
3760: 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 6f 72 0a  E_MUTEX_FAST or.
3770: 2a 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ** SQLITE_MUTEX_
3780: 52 45 43 55 52 53 49 56 45 2e 0a 2a 2a 0a 2a 2a  RECURSIVE..**.**
3790: 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 6f 6e   Note that if on
37a0: 65 20 6f 66 20 74 68 65 20 64 79 6e 61 6d 69 63  e of the dynamic
37b0: 20 6d 75 74 65 78 20 70 61 72 61 6d 65 74 65 72   mutex parameter
37c0: 73 20 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  s (SQLITE_MUTEX_
37d0: 46 41 53 54 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  FAST.** or SQLIT
37e0: 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
37f0: 45 29 20 69 73 20 75 73 65 64 20 74 68 65 6e 20  E) is used then 
3800: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
3810: 6c 6f 63 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73  loc().** returns
3820: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 75 74   a different mut
3830: 65 78 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c  ex on every call
3840: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 65 20 73  .  But for the s
3850: 74 61 74 69 63 20 0a 2a 2a 20 6d 75 74 65 78 20  tatic .** mutex 
3860: 74 79 70 65 73 2c 20 74 68 65 20 73 61 6d 65 20  types, the same 
3870: 6d 75 74 65 78 20 69 73 20 72 65 74 75 72 6e 65  mutex is returne
3880: 64 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 20  d on every call 
3890: 74 68 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20  that has.** the 
38a0: 73 61 6d 65 20 74 79 70 65 20 6e 75 6d 62 65 72  same type number
38b0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
38c0: 65 78 20 2a 73 71 6c 69 74 65 33 5f 6d 75 74 65  ex *sqlite3_mute
38d0: 78 5f 61 6c 6c 6f 63 28 69 6e 74 20 69 54 79 70  x_alloc(int iTyp
38e0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e){.  sqlite3_mu
38f0: 74 65 78 20 2a 70 3b 0a 0a 20 20 73 77 69 74 63  tex *p;..  switc
3900: 68 28 20 69 54 79 70 65 20 29 7b 0a 20 20 20 20  h( iType ){.    
3910: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45  case SQLITE_MUTE
3920: 58 5f 46 41 53 54 3a 0a 20 20 20 20 63 61 73 65  X_FAST:.    case
3930: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45   SQLITE_MUTEX_RE
3940: 43 55 52 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CURSIVE: {.     
3950: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
3960: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
3970: 70 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  p) );.      if( 
3980: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  p ){.        p->
3990: 69 64 20 3d 20 69 54 79 70 65 3b 0a 20 20 20 20  id = iType;.    
39a0: 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 43 72      InitializeCr
39b0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70  iticalSection(&p
39c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
39d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
39e0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
39f0: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
3a00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 73   sqlite3_mutex s
3a10: 74 61 74 69 63 4d 75 74 65 78 65 73 5b 34 5d 3b  taticMutexes[4];
3a20: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e  .      static in
3a30: 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  t isInit = 0;.  
3a40: 20 20 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e      while( !isIn
3a50: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  it ){.        st
3a60: 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 63 6b 20 3d  atic long lock =
3a70: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
3a80: 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e 63 72 65  InterlockedIncre
3a90: 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d 31 20 29  ment(&lock)==1 )
3aa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
3ab0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
3ac0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 73  (i=0; i<sizeof(s
3ad0: 74 61 74 69 63 4d 75 74 65 78 65 73 29 2f 73 69  taticMutexes)/si
3ae0: 7a 65 6f 66 28 73 74 61 74 69 63 4d 75 74 65 78  zeof(staticMutex
3af0: 65 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  es[0]); i++){.  
3b00: 20 20 20 20 20 20 20 20 20 20 49 6e 69 74 69 61            Initia
3b10: 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63 74  lizeCriticalSect
3b20: 69 6f 6e 28 26 73 74 61 74 69 63 4d 75 74 65 78  ion(&staticMutex
3b30: 65 73 5b 69 5d 2e 6d 75 74 65 78 29 3b 0a 20 20  es[i].mutex);.  
3b40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3b50: 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a      isInit = 1;.
3b60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3b70: 20 20 20 20 20 20 20 20 20 53 6c 65 65 70 28 31           Sleep(1
3b80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3b90: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
3ba0: 74 28 20 69 54 79 70 65 2d 32 20 3e 3d 20 30 20  t( iType-2 >= 0 
3bb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3bc0: 20 69 54 79 70 65 2d 32 20 3c 20 73 69 7a 65 6f   iType-2 < sizeo
3bd0: 66 28 73 74 61 74 69 63 4d 75 74 65 78 65 73 29  f(staticMutexes)
3be0: 2f 73 69 7a 65 6f 66 28 73 74 61 74 69 63 4d 75  /sizeof(staticMu
3bf0: 74 65 78 65 73 5b 30 5d 29 20 29 3b 0a 20 20 20  texes[0]) );.   
3c00: 20 20 20 70 20 3d 20 26 73 74 61 74 69 63 4d 75     p = &staticMu
3c10: 74 65 78 65 73 5b 69 54 79 70 65 2d 32 5d 3b 0a  texes[iType-2];.
3c20: 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 54        p->id = iT
3c30: 79 70 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ype;.      break
3c40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3c50: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn p;.}.../*.*
3c60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
3c70: 65 61 6c 6c 6f 63 61 74 65 73 20 61 20 70 72 65  eallocates a pre
3c80: 76 69 6f 75 73 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  viously.** alloc
3c90: 61 74 65 64 20 6d 75 74 65 78 2e 20 20 53 51 4c  ated mutex.  SQL
3ca0: 69 74 65 20 69 73 20 63 61 72 65 66 75 6c 20 74  ite is careful t
3cb0: 6f 20 64 65 61 6c 6c 6f 63 61 74 65 20 65 76 65  o deallocate eve
3cc0: 72 79 0a 2a 2a 20 6d 75 74 65 78 20 74 68 61 74  ry.** mutex that
3cd0: 20 69 74 20 61 6c 6c 6f 63 61 74 65 73 2e 0a 2a   it allocates..*
3ce0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d  /.void sqlite3_m
3cf0: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
3d00: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61  3_mutex *p){.  a
3d10: 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
3d20: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 30  sert( p->nRef==0
3d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3d40: 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45  >id==SQLITE_MUTE
3d50: 58 5f 46 41 53 54 20 7c 7c 20 70 2d 3e 69 64 3d  X_FAST || p->id=
3d60: 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  =SQLITE_MUTEX_RE
3d70: 43 55 52 53 49 56 45 20 29 3b 0a 20 20 44 65 6c  CURSIVE );.  Del
3d80: 65 74 65 43 72 69 74 69 63 61 6c 53 65 63 74 69  eteCriticalSecti
3d90: 6f 6e 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  on(&p->mutex);. 
3da0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
3db0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
3dc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
3dd0: 65 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  er() and sqlite3
3de0: 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 72 6f 75  _mutex_try() rou
3df0: 74 69 6e 65 73 20 61 74 74 65 6d 70 74 0a 2a 2a  tines attempt.**
3e00: 20 74 6f 20 65 6e 74 65 72 20 61 20 6d 75 74 65   to enter a mute
3e10: 78 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 74  x.  If another t
3e20: 68 72 65 61 64 20 69 73 20 61 6c 72 65 61 64 79  hread is already
3e30: 20 77 69 74 68 69 6e 20 74 68 65 20 6d 75 74 65   within the mute
3e40: 78 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75  x,.** sqlite3_mu
3e50: 74 65 78 5f 65 6e 74 65 72 28 29 20 77 69 6c 6c  tex_enter() will
3e60: 20 62 6c 6f 63 6b 20 61 6e 64 20 73 71 6c 69 74   block and sqlit
3e70: 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 77  e3_mutex_try() w
3e80: 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ill return.** SQ
3e90: 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 20  LITE_BUSY.  The 
3ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72  sqlite3_mutex_tr
3eb0: 79 28 29 20 69 6e 74 65 72 66 61 63 65 20 72 65  y() interface re
3ec0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a  turns SQLITE_OK.
3ed0: 2a 2a 20 75 70 6f 6e 20 73 75 63 63 65 73 73 66  ** upon successf
3ee0: 75 6c 20 65 6e 74 72 79 2e 20 20 4d 75 74 65 78  ul entry.  Mutex
3ef0: 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  es created using
3f00: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45   SQLITE_MUTEX_RE
3f10: 43 55 52 53 49 56 45 20 63 61 6e 0a 2a 2a 20 62  CURSIVE can.** b
3f20: 65 20 65 6e 74 65 72 65 64 20 6d 75 6c 74 69 70  e entered multip
3f30: 6c 65 20 74 69 6d 65 73 20 62 79 20 74 68 65 20  le times by the 
3f40: 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 49 6e  same thread.  In
3f50: 20 73 75 63 68 20 63 61 73 65 73 20 74 68 65 2c   such cases the,
3f60: 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 62  .** mutex must b
3f70: 65 20 65 78 69 74 65 64 20 61 6e 20 65 71 75 61  e exited an equa
3f80: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  l number of time
3f90: 73 20 62 65 66 6f 72 65 20 61 6e 6f 74 68 65 72  s before another
3fa0: 20 74 68 72 65 61 64 0a 2a 2a 20 63 61 6e 20 65   thread.** can e
3fb0: 6e 74 65 72 2e 20 20 49 66 20 74 68 65 20 73 61  nter.  If the sa
3fc0: 6d 65 20 74 68 72 65 61 64 20 74 72 69 65 73 20  me thread tries 
3fd0: 74 6f 20 65 6e 74 65 72 20 61 6e 79 20 6f 74 68  to enter any oth
3fe0: 65 72 20 6b 69 6e 64 20 6f 66 20 6d 75 74 65 78  er kind of mutex
3ff0: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
4000: 63 65 2c 20 74 68 65 20 62 65 68 61 76 69 6f 72  ce, the behavior
4010: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
4020: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d  /.void sqlite3_m
4030: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
4040: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
4050: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
4060: 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51  ssert( p->id==SQ
4070: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
4080: 53 49 56 45 20 7c 7c 20 73 71 6c 69 74 65 33 5f  SIVE || sqlite3_
4090: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 29  mutex_notheld(p)
40a0: 20 29 3b 0a 20 20 45 6e 74 65 72 43 72 69 74 69   );.  EnterCriti
40b0: 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 2d 3e 6d  calSection(&p->m
40c0: 75 74 65 78 29 3b 0a 20 20 70 2d 3e 6f 77 6e 65  utex);.  p->owne
40d0: 72 20 3d 20 47 65 74 43 75 72 72 65 6e 74 54 68  r = GetCurrentTh
40e0: 72 65 61 64 49 64 28 29 3b 20 0a 20 20 70 2d 3e  readId(); .  p->
40f0: 6e 52 65 66 2b 2b 3b 0a 7d 0a 69 6e 74 20 73 71  nRef++;.}.int sq
4100: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
4110: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
4120: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
4130: 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
4140: 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c  sert( p->id==SQL
4150: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
4160: 49 56 45 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  IVE || sqlite3_m
4170: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 29 20  utex_notheld(p) 
4180: 29 3b 0a 20 20 69 66 28 20 54 72 79 45 6e 74 65  );.  if( TryEnte
4190: 72 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e  rCriticalSection
41a0: 28 26 70 2d 3e 6d 75 74 65 78 29 20 29 7b 0a 20  (&p->mutex) ){. 
41b0: 20 20 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 47 65     p->owner = Ge
41c0: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64  tCurrentThreadId
41d0: 28 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b  ();.    p->nRef+
41e0: 2b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  +;.    rc = SQLI
41f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
4200: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4210: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
4220: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4230: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  The sqlite3_mute
4240: 78 5f 6c 65 61 76 65 28 29 20 72 6f 75 74 69 6e  x_leave() routin
4250: 65 20 65 78 69 74 73 20 61 20 6d 75 74 65 78 20  e exits a mutex 
4260: 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72 65 76  that was.** prev
4270: 69 6f 75 73 6c 79 20 65 6e 74 65 72 65 64 20 62  iously entered b
4280: 79 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61  y the same threa
4290: 64 2e 20 20 54 68 65 20 62 65 68 61 76 69 6f 72  d.  The behavior
42a0: 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64  .** is undefined
42b0: 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 69 73   if the mutex is
42c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 65   not currently e
42d0: 6e 74 65 72 65 64 20 6f 72 0a 2a 2a 20 69 73 20  ntered or.** is 
42e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 6c  not currently al
42f0: 6c 6f 63 61 74 65 64 2e 20 20 53 51 4c 69 74 65  located.  SQLite
4300: 20 77 69 6c 6c 20 6e 65 76 65 72 20 64 6f 20 65   will never do e
4310: 69 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ither..*/.void s
4320: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
4330: 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ve(sqlite3_mutex
4340: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4350: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  p->nRef>0 );.  a
4360: 73 73 65 72 74 28 20 70 2d 3e 6f 77 6e 65 72 3d  ssert( p->owner=
4370: 3d 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  =GetCurrentThrea
4380: 64 49 64 28 29 20 29 3b 0a 20 20 70 2d 3e 6e 52  dId() );.  p->nR
4390: 65 66 2d 2d 3b 0a 20 20 4c 65 61 76 65 43 72 69  ef--;.  LeaveCri
43a0: 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 2d  ticalSection(&p-
43b0: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mutex);.}../*.*
43c0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75  * The sqlite3_mu
43d0: 74 65 78 5f 68 65 6c 64 28 29 20 61 6e 64 20 73  tex_held() and s
43e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
43f0: 68 65 6c 64 28 29 20 72 6f 75 74 69 6e 65 20 61  held() routine a
4400: 72 65 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 66  re.** intended f
4410: 6f 72 20 75 73 65 20 69 6e 73 69 64 65 20 61 73  or use inside as
4420: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
4430: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
4440: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
4450: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
4460: 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c    return p==0 ||
4470: 20 28 70 2d 3e 6e 52 65 66 21 3d 30 20 26 26 20   (p->nRef!=0 && 
4480: 70 2d 3e 6f 77 6e 65 72 3d 3d 47 65 74 43 75 72  p->owner==GetCur
4490: 72 65 6e 74 54 68 72 65 61 64 49 64 28 29 29 3b  rentThreadId());
44a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  .}.int sqlite3_m
44b0: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 73 71 6c  utex_notheld(sql
44c0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
44d0: 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c    return p==0 ||
44e0: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70   p->nRef==0 || p
44f0: 2d 3e 6f 77 6e 65 72 21 3d 47 65 74 43 75 72 72  ->owner!=GetCurr
4500: 65 6e 74 54 68 72 65 61 64 49 64 28 29 3b 0a 7d  entThreadId();.}
4510: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4520: 45 5f 4d 55 54 45 58 5f 57 49 4e 20 2a 2f 0a 0a  E_MUTEX_WIN */..
4530: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
4540: 65 64 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ed(SQLITE_MUTEX_
4550: 41 50 50 44 45 46 29 20 2a 2f 0a                 APPDEF) */.