/ Hex Artifact Content
Login

Artifact 1fe0e735897be20e09dd6f53c3fb516c6b48c0eb:


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 20 77 69 6e 33 32 0a 2a 2f 0a 23 69   for win32.*/.#i
01c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
01d0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t.h"../*.** The 
01e0: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
01f0: 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  e is only used i
0200: 66 20 77 65 20 61 72 65 20 63 6f 6d 70 69 6c 69  f we are compili
0210: 6e 67 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  ng multithreaded
0220: 0a 2a 2a 20 6f 6e 20 61 20 77 69 6e 33 32 20 73  .** on a win32 s
0230: 79 73 74 65 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  ystem..*/.#ifdef
0240: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 57 33   SQLITE_MUTEX_W3
0250: 32 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 72 65  2../*.** Each re
0260: 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 73  cursive mutex is
0270: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0280: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0290: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
02a0: 63 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ct sqlite3_mutex
02b0: 20 7b 0a 20 20 43 52 49 54 49 43 41 4c 5f 53 45   {.  CRITICAL_SE
02c0: 43 54 49 4f 4e 20 6d 75 74 65 78 3b 20 20 20 20  CTION mutex;    
02d0: 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 74 72 6f 6c  /* Mutex control
02e0: 6c 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  ling the lock */
02f0: 0a 20 20 69 6e 74 20 69 64 3b 20 20 20 20 20 20  .  int id;      
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0310: 20 4d 75 74 65 78 20 74 79 70 65 20 2a 2f 0a 23   Mutex type */.#
0320: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
0330: 55 47 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e  UG.  volatile in
0340: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
0350: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
0360: 65 72 61 6e 63 65 73 20 2a 2f 0a 20 20 76 6f 6c  erances */.  vol
0370: 61 74 69 6c 65 20 44 57 4f 52 44 20 6f 77 6e 65  atile DWORD owne
0380: 72 3b 20 20 20 20 20 20 2f 2a 20 54 68 72 65 61  r;      /* Threa
0390: 64 20 68 6f 6c 64 69 6e 67 20 74 68 69 73 20 6d  d holding this m
03a0: 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 74 72  utex */.  int tr
03b0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
03c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
03d0: 74 72 61 63 65 20 63 68 61 6e 67 65 73 20 2a 2f  trace changes */
03e0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 23 64 65 66 69  .#endif.};.#defi
03f0: 6e 65 20 53 51 4c 49 54 45 5f 57 33 32 5f 4d 55  ne SQLITE_W32_MU
0400: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20  TEX_INITIALIZER 
0410: 7b 20 30 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  { 0 }.#ifdef SQL
0420: 49 54 45 5f 44 45 42 55 47 0a 23 64 65 66 69 6e  ITE_DEBUG.#defin
0430: 65 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f  e SQLITE3_MUTEX_
0440: 49 4e 49 54 49 41 4c 49 5a 45 52 20 7b 20 53 51  INITIALIZER { SQ
0450: 4c 49 54 45 5f 57 33 32 5f 4d 55 54 45 58 5f 49  LITE_W32_MUTEX_I
0460: 4e 49 54 49 41 4c 49 5a 45 52 2c 20 30 2c 20 30  NITIALIZER, 0, 0
0470: 4c 2c 20 28 44 57 4f 52 44 29 30 2c 20 30 20 7d  L, (DWORD)0, 0 }
0480: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 53  .#else.#define S
0490: 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49  QLITE3_MUTEX_INI
04a0: 54 49 41 4c 49 5a 45 52 20 7b 20 53 51 4c 49 54  TIALIZER { SQLIT
04b0: 45 5f 57 33 32 5f 4d 55 54 45 58 5f 49 4e 49 54  E_W32_MUTEX_INIT
04c0: 49 41 4c 49 5a 45 52 2c 20 30 20 7d 0a 23 65 6e  IALIZER, 0 }.#en
04d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
04e0: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
04f0: 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  ) if we are runn
0500: 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c  ing under WinNT,
0510: 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a   Win2K, WinXP,.*
0520: 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74  * or WinCE.  Ret
0530: 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29  urn false (zero)
0540: 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39   for Win95, Win9
0550: 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a  8, or WinME..**.
0560: 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e  ** Here is an in
0570: 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76  teresting observ
0580: 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57  ation:  Win95, W
0590: 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20  in98, and WinME 
05a0: 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  lack.** the Lock
05b0: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42  FileEx() API.  B
05c0: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
05d0: 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20  statically link 
05e0: 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20  against that.** 
05f0: 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  API as long as w
0600: 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20  e don't call it 
0610: 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39  win running Win9
0620: 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c  5/98/ME.  A call
0630: 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
0640: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
0650: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
0660: 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38  host is Win95/98
0670: 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f  /ME or.** WinNT/
0680: 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65  2K/XP so that we
0690: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68   will know wheth
06a0: 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e  er or not we can
06b0: 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20   safely call.** 
06c0: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
06d0: 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65   API..**.** mute
06e0: 78 49 73 4e 54 28 29 20 69 73 20 6f 6e 6c 79 20  xIsNT() is only 
06f0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 54 72 79  used for the Try
0700: 45 6e 74 65 72 43 72 69 74 69 63 61 6c 53 65 63  EnterCriticalSec
0710: 74 69 6f 6e 28 29 20 41 50 49 20 63 61 6c 6c 2c  tion() API call,
0720: 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 6f 6e 6c  .** which is onl
0730: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20 79  y available if y
0740: 6f 75 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  our application 
0750: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0760: 68 20 0a 2a 2a 20 5f 57 49 4e 33 32 5f 57 49 4e  h .** _WIN32_WIN
0770: 4e 54 20 64 65 66 69 6e 65 64 20 74 6f 20 61 20  NT defined to a 
0780: 76 61 6c 75 65 20 3e 3d 20 30 78 30 34 30 30 2e  value >= 0x0400.
0790: 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65    Currently, the
07a0: 20 6f 6e 6c 79 0a 2a 2a 20 63 61 6c 6c 20 74 6f   only.** call to
07b0: 20 54 72 79 45 6e 74 65 72 43 72 69 74 69 63 61   TryEnterCritica
07c0: 6c 53 65 63 74 69 6f 6e 28 29 20 69 73 20 23 69  lSection() is #i
07d0: 66 64 65 66 27 65 64 20 6f 75 74 2c 20 73 6f 20  fdef'ed out, so 
07e0: 23 69 66 64 65 66 20 0a 2a 2a 20 74 68 69 73 20  #ifdef .** this 
07f0: 6f 75 74 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  out as well..*/.
0800: 23 69 66 20 30 0a 23 69 66 20 53 51 4c 49 54 45  #if 0.#if SQLITE
0810: 5f 4f 53 5f 57 49 4e 43 45 0a 23 20 64 65 66 69  _OS_WINCE.# defi
0820: 6e 65 20 6d 75 74 65 78 49 73 4e 54 28 29 20 20  ne mutexIsNT()  
0830: 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74  (1).#else.  stat
0840: 69 63 20 69 6e 74 20 6d 75 74 65 78 49 73 4e 54  ic int mutexIsNT
0850: 28 76 6f 69 64 29 7b 0a 20 20 20 20 73 74 61 74  (void){.    stat
0860: 69 63 20 69 6e 74 20 6f 73 54 79 70 65 20 3d 20  ic int osType = 
0870: 30 3b 0a 20 20 20 20 69 66 28 20 6f 73 54 79 70  0;.    if( osTyp
0880: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53  e==0 ){.      OS
0890: 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66  VERSIONINFO sInf
08a0: 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64  o;.      sInfo.d
08b0: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
08c0: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
08d0: 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72  o);.      GetVer
08e0: 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a  sionEx(&sInfo);.
08f0: 20 20 20 20 20 20 6f 73 54 79 70 65 20 3d 20 73        osType = s
0900: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
0910: 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f  d==VER_PLATFORM_
0920: 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31  WIN32_NT ? 2 : 1
0930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
0940: 72 6e 20 6f 73 54 79 70 65 3d 3d 32 3b 0a 20 20  rn osType==2;.  
0950: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
0960: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 23  TE_OS_WINCE */.#
0970: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
0980: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
0990: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74   The sqlite3_mut
09a0: 65 78 5f 68 65 6c 64 28 29 20 61 6e 64 20 73 71  ex_held() and sq
09b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
09c0: 65 6c 64 28 29 20 72 6f 75 74 69 6e 65 20 61 72  eld() routine ar
09d0: 65 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 66 6f  e.** intended fo
09e0: 72 20 75 73 65 20 6f 6e 6c 79 20 69 6e 73 69 64  r use only insid
09f0: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
0a00: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
0a10: 20 69 6e 74 20 77 69 6e 4d 75 74 65 78 48 65 6c   int winMutexHel
0a20: 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  d(sqlite3_mutex 
0a30: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
0a40: 3e 6e 52 65 66 21 3d 30 20 26 26 20 70 2d 3e 6f  >nRef!=0 && p->o
0a50: 77 6e 65 72 3d 3d 47 65 74 43 75 72 72 65 6e 74  wner==GetCurrent
0a60: 54 68 72 65 61 64 49 64 28 29 3b 0a 7d 0a 73 74  ThreadId();.}.st
0a70: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 75 74 65  atic int winMute
0a80: 78 4e 6f 74 68 65 6c 64 32 28 73 71 6c 69 74 65  xNotheld2(sqlite
0a90: 33 5f 6d 75 74 65 78 20 2a 70 2c 20 44 57 4f 52  3_mutex *p, DWOR
0aa0: 44 20 74 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  D tid){.  return
0ab0: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70   p->nRef==0 || p
0ac0: 2d 3e 6f 77 6e 65 72 21 3d 74 69 64 3b 0a 7d 0a  ->owner!=tid;.}.
0ad0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 75  static int winMu
0ae0: 74 65 78 4e 6f 74 68 65 6c 64 28 73 71 6c 69 74  texNotheld(sqlit
0af0: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
0b00: 44 57 4f 52 44 20 74 69 64 20 3d 20 47 65 74 43  DWORD tid = GetC
0b10: 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29  urrentThreadId()
0b20: 3b 20 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d  ; .  return winM
0b30: 75 74 65 78 4e 6f 74 68 65 6c 64 32 28 70 2c 20  utexNotheld2(p, 
0b40: 74 69 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tid);.}.#endif..
0b50: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0b60: 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
0b70: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
0b80: 73 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  system..*/.stati
0b90: 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  c sqlite3_mutex 
0ba0: 77 69 6e 4d 75 74 65 78 5f 73 74 61 74 69 63 4d  winMutex_staticM
0bb0: 75 74 65 78 65 73 5b 36 5d 20 3d 20 7b 0a 20 20  utexes[6] = {.  
0bc0: 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e  SQLITE3_MUTEX_IN
0bd0: 49 54 49 41 4c 49 5a 45 52 2c 0a 20 20 53 51 4c  ITIALIZER,.  SQL
0be0: 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49  ITE3_MUTEX_INITI
0bf0: 41 4c 49 5a 45 52 2c 0a 20 20 53 51 4c 49 54 45  ALIZER,.  SQLITE
0c00: 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49  3_MUTEX_INITIALI
0c10: 5a 45 52 2c 0a 20 20 53 51 4c 49 54 45 33 5f 4d  ZER,.  SQLITE3_M
0c20: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
0c30: 2c 0a 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45  ,.  SQLITE3_MUTE
0c40: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0a 20  X_INITIALIZER,. 
0c50: 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49   SQLITE3_MUTEX_I
0c60: 4e 49 54 49 41 4c 49 5a 45 52 0a 7d 3b 0a 73 74  NITIALIZER.};.st
0c70: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 75 74 65  atic int winMute
0c80: 78 5f 69 73 49 6e 69 74 20 3d 20 30 3b 0a 2f 2a  x_isInit = 0;./*
0c90: 20 41 73 20 77 69 6e 4d 75 74 65 78 49 6e 69 74   As winMutexInit
0ca0: 28 29 20 61 6e 64 20 77 69 6e 4d 75 74 65 78 45  () and winMutexE
0cb0: 6e 64 28 29 20 61 72 65 20 63 61 6c 6c 65 64 20  nd() are called 
0cc0: 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  as part.** of th
0cd0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  e sqlite3_initia
0ce0: 6c 69 7a 65 20 61 6e 64 20 73 71 6c 69 74 65 33  lize and sqlite3
0cf0: 5f 73 68 75 74 64 6f 77 6e 28 29 0a 2a 2a 20 70  _shutdown().** p
0d00: 72 6f 63 65 73 73 69 6e 67 2c 20 74 68 65 20 22  rocessing, the "
0d10: 69 6e 74 65 72 6c 6f 63 6b 65 64 22 20 6d 61 67  interlocked" mag
0d20: 69 63 20 69 73 20 70 72 6f 62 61 62 6c 79 20 6e  ic is probably n
0d30: 6f 74 0a 2a 2a 20 73 74 72 69 63 74 6c 79 20 6e  ot.** strictly n
0d40: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
0d50: 74 69 63 20 6c 6f 6e 67 20 77 69 6e 4d 75 74 65  tic long winMute
0d60: 78 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 73 74 61  x_lock = 0;..sta
0d70: 74 69 63 20 69 6e 74 20 77 69 6e 4d 75 74 65 78  tic int winMutex
0d80: 49 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 2f  Init(void){ .  /
0d90: 2a 20 54 68 65 20 66 69 72 73 74 20 74 6f 20 69  * The first to i
0da0: 6e 63 72 65 6d 65 6e 74 20 74 6f 20 31 20 64 6f  ncrement to 1 do
0db0: 65 73 20 61 63 74 75 61 6c 20 69 6e 69 74 69 61  es actual initia
0dc0: 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  lization */.  if
0dd0: 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  ( InterlockedCom
0de0: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 77 69  pareExchange(&wi
0df0: 6e 4d 75 74 65 78 5f 6c 6f 63 6b 2c 20 31 2c 20  nMutex_lock, 1, 
0e00: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  0)==0 ){.    int
0e10: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
0e20: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 77 69 6e   i<ArraySize(win
0e30: 4d 75 74 65 78 5f 73 74 61 74 69 63 4d 75 74 65  Mutex_staticMute
0e40: 78 65 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xes); i++){.    
0e50: 20 20 49 6e 69 74 69 61 6c 69 7a 65 43 72 69 74    InitializeCrit
0e60: 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 77 69 6e  icalSection(&win
0e70: 4d 75 74 65 78 5f 73 74 61 74 69 63 4d 75 74 65  Mutex_staticMute
0e80: 78 65 73 5b 69 5d 2e 6d 75 74 65 78 29 3b 0a 20  xes[i].mutex);. 
0e90: 20 20 20 7d 0a 20 20 20 20 77 69 6e 4d 75 74 65     }.    winMute
0ea0: 78 5f 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  x_isInit = 1;.  
0eb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 6f  }else{.    /* So
0ec0: 6d 65 6f 6e 65 20 65 6c 73 65 20 69 73 20 69 6e  meone else is in
0ed0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
0ee0: 69 6e 69 74 69 6e 67 20 74 68 65 20 73 74 61 74  initing the stat
0ef0: 69 63 20 6d 75 74 65 78 65 73 20 2a 2f 0a 20 20  ic mutexes */.  
0f00: 20 20 77 68 69 6c 65 28 20 21 77 69 6e 4d 75 74    while( !winMut
0f10: 65 78 5f 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  ex_isInit ){.   
0f20: 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20     Sleep(1);.   
0f30: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
0f40: 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 73  SQLITE_OK; .}..s
0f50: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 75 74  tatic int winMut
0f60: 65 78 45 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  exEnd(void){ .  
0f70: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 74 6f 20  /* The first to 
0f80: 64 65 63 72 65 6d 65 6e 74 20 74 6f 20 30 20 64  decrement to 0 d
0f90: 6f 65 73 20 61 63 74 75 61 6c 20 73 68 75 74 64  oes actual shutd
0fa0: 6f 77 6e 20 0a 20 20 2a 2a 20 28 77 68 69 63 68  own .  ** (which
0fb0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6c   should be the l
0fc0: 61 73 74 20 74 6f 20 73 68 75 74 64 6f 77 6e 2e  ast to shutdown.
0fd0: 29 20 2a 2f 0a 20 20 69 66 28 20 49 6e 74 65 72  ) */.  if( Inter
0fe0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
0ff0: 68 61 6e 67 65 28 26 77 69 6e 4d 75 74 65 78 5f  hange(&winMutex_
1000: 6c 6f 63 6b 2c 20 30 2c 20 31 29 3d 3d 31 20 29  lock, 0, 1)==1 )
1010: 7b 0a 20 20 20 20 69 66 28 20 77 69 6e 4d 75 74  {.    if( winMut
1020: 65 78 5f 69 73 49 6e 69 74 3d 3d 31 20 29 7b 0a  ex_isInit==1 ){.
1030: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1040: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1050: 72 61 79 53 69 7a 65 28 77 69 6e 4d 75 74 65 78  raySize(winMutex
1060: 5f 73 74 61 74 69 63 4d 75 74 65 78 65 73 29 3b  _staticMutexes);
1070: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 44   i++){.        D
1080: 65 6c 65 74 65 43 72 69 74 69 63 61 6c 53 65 63  eleteCriticalSec
1090: 74 69 6f 6e 28 26 77 69 6e 4d 75 74 65 78 5f 73  tion(&winMutex_s
10a0: 74 61 74 69 63 4d 75 74 65 78 65 73 5b 69 5d 2e  taticMutexes[i].
10b0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  mutex);.      }.
10c0: 20 20 20 20 20 20 77 69 6e 4d 75 74 65 78 5f 69        winMutex_i
10d0: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  sInit = 0;.    }
10e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10f0: 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
1100: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** The sqlite3_m
1110: 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 72 6f 75  utex_alloc() rou
1120: 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
1130: 20 6e 65 77 0a 2a 2a 20 6d 75 74 65 78 20 61 6e   new.** mutex an
1140: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
1150: 74 65 72 20 74 6f 20 69 74 2e 20 20 49 66 20 69  ter to it.  If i
1160: 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 0a 2a  t returns NULL.*
1170: 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  * that means tha
1180: 74 20 61 20 6d 75 74 65 78 20 63 6f 75 6c 64 20  t a mutex could 
1190: 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
11a0: 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 77 69 6c  .  SQLite.** wil
11b0: 6c 20 75 6e 77 69 6e 64 20 69 74 73 20 73 74 61  l unwind its sta
11c0: 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ck and return an
11d0: 20 65 72 72 6f 72 2e 20 20 54 68 65 20 61 72 67   error.  The arg
11e0: 75 6d 65 6e 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ument.** to sqli
11f0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1200: 29 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  ) is one of thes
1210: 65 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  e integer consta
1220: 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a  nts:.**.** <ul>.
1230: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
1240: 4d 55 54 45 58 5f 46 41 53 54 0a 2a 2a 20 3c 6c  MUTEX_FAST.** <l
1250: 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  i>  SQLITE_MUTEX
1260: 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 3c 6c  _RECURSIVE.** <l
1270: 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  i>  SQLITE_MUTEX
1280: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 0a 2a  _STATIC_MASTER.*
1290: 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d  * <li>  SQLITE_M
12a0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 0a  UTEX_STATIC_MEM.
12b0: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
12c0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
12d0: 32 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  2.** <li>  SQLIT
12e0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 50  E_MUTEX_STATIC_P
12f0: 52 4e 47 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c  RNG.** <li>  SQL
1300: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1310: 5f 4c 52 55 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51  _LRU.** <li>  SQ
1320: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1330: 43 5f 4c 52 55 32 0a 2a 2a 20 3c 2f 75 6c 3e 0a  C_LRU2.** </ul>.
1340: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1350: 74 77 6f 20 63 6f 6e 73 74 61 6e 74 73 20 63 61  two constants ca
1360: 75 73 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  use sqlite3_mute
1370: 78 5f 61 6c 6c 6f 63 28 29 20 74 6f 20 63 72 65  x_alloc() to cre
1380: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6d 75 74  ate.** a new mut
1390: 65 78 2e 20 20 54 68 65 20 6e 65 77 20 6d 75 74  ex.  The new mut
13a0: 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65 20  ex is recursive 
13b0: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45  when SQLITE_MUTE
13c0: 58 5f 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 69  X_RECURSIVE.** i
13d0: 73 20 75 73 65 64 20 62 75 74 20 6e 6f 74 20 6e  s used but not n
13e0: 65 63 65 73 73 61 72 69 6c 79 20 73 6f 20 77 68  ecessarily so wh
13f0: 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  en SQLITE_MUTEX_
1400: 46 41 53 54 20 69 73 20 75 73 65 64 2e 0a 2a 2a  FAST is used..**
1410: 20 54 68 65 20 6d 75 74 65 78 20 69 6d 70 6c 65   The mutex imple
1420: 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
1430: 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  ot need to make 
1440: 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a  a distinction.**
1450: 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f   between SQLITE_
1460: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20  MUTEX_RECURSIVE 
1470: 61 6e 64 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  and SQLITE_MUTEX
1480: 5f 46 41 53 54 20 69 66 20 69 74 20 64 6f 65 73  _FAST if it does
1490: 0a 2a 2a 20 6e 6f 74 20 77 61 6e 74 20 74 6f 2e  .** not want to.
14a0: 20 20 42 75 74 20 53 51 4c 69 74 65 20 77 69 6c    But SQLite wil
14b0: 6c 20 6f 6e 6c 79 20 72 65 71 75 65 73 74 20 61  l only request a
14c0: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
14d0: 20 69 6e 0a 2a 2a 20 63 61 73 65 73 20 77 68 65   in.** cases whe
14e0: 72 65 20 69 74 20 72 65 61 6c 6c 79 20 6e 65 65  re it really nee
14f0: 64 73 20 6f 6e 65 2e 20 20 49 66 20 61 20 66 61  ds one.  If a fa
1500: 73 74 65 72 20 6e 6f 6e 2d 72 65 63 75 72 73 69  ster non-recursi
1510: 76 65 20 6d 75 74 65 78 0a 2a 2a 20 69 6d 70 6c  ve mutex.** impl
1520: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 76  ementation is av
1530: 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68  ailable on the h
1540: 6f 73 74 20 70 6c 61 74 66 6f 72 6d 2c 20 74 68  ost platform, th
1550: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
1560: 6d 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  m.** might retur
1570: 6e 20 73 75 63 68 20 61 20 6d 75 74 65 78 20 69  n such a mutex i
1580: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 53 51  n response to SQ
1590: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 2e  LITE_MUTEX_FAST.
15a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 74 68 65 72  .**.** The other
15b0: 20 61 6c 6c 6f 77 65 64 20 70 61 72 61 6d 65 74   allowed paramet
15c0: 65 72 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 6d  ers to sqlite3_m
15d0: 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 65 61 63  utex_alloc() eac
15e0: 68 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  h return.** a po
15f0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 69  inter to a stati
1600: 63 20 70 72 65 65 78 69 73 74 69 6e 67 20 6d 75  c preexisting mu
1610: 74 65 78 2e 20 20 53 69 78 20 73 74 61 74 69 63  tex.  Six static
1620: 20 6d 75 74 65 78 65 73 20 61 72 65 0a 2a 2a 20   mutexes are.** 
1630: 75 73 65 64 20 62 79 20 74 68 65 20 63 75 72 72  used by the curr
1640: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  ent version of S
1650: 51 4c 69 74 65 2e 20 20 46 75 74 75 72 65 20 76  QLite.  Future v
1660: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
1670: 65 0a 2a 2a 20 6d 61 79 20 61 64 64 20 61 64 64  e.** may add add
1680: 69 74 69 6f 6e 61 6c 20 73 74 61 74 69 63 20 6d  itional static m
1690: 75 74 65 78 65 73 2e 20 20 53 74 61 74 69 63 20  utexes.  Static 
16a0: 6d 75 74 65 78 65 73 20 61 72 65 20 66 6f 72 20  mutexes are for 
16b0: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 20  internal.** use 
16c0: 62 79 20 53 51 4c 69 74 65 20 6f 6e 6c 79 2e 20  by SQLite only. 
16d0: 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68   Applications th
16e0: 61 74 20 75 73 65 20 53 51 4c 69 74 65 20 6d 75  at use SQLite mu
16f0: 74 65 78 65 73 20 73 68 6f 75 6c 64 0a 2a 2a 20  texes should.** 
1700: 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 64 79 6e  use only the dyn
1710: 61 6d 69 63 20 6d 75 74 65 78 65 73 20 72 65 74  amic mutexes ret
1720: 75 72 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f  urned by SQLITE_
1730: 4d 55 54 45 58 5f 46 41 53 54 20 6f 72 0a 2a 2a  MUTEX_FAST or.**
1740: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45   SQLITE_MUTEX_RE
1750: 43 55 52 53 49 56 45 2e 0a 2a 2a 0a 2a 2a 20 4e  CURSIVE..**.** N
1760: 6f 74 65 20 74 68 61 74 20 69 66 20 6f 6e 65 20  ote that if one 
1770: 6f 66 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6d  of the dynamic m
1780: 75 74 65 78 20 70 61 72 61 6d 65 74 65 72 73 20  utex parameters 
1790: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
17a0: 53 54 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ST.** or SQLITE_
17b0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
17c0: 20 69 73 20 75 73 65 64 20 74 68 65 6e 20 73 71   is used then sq
17d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
17e0: 63 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  c().** returns a
17f0: 20 64 69 66 66 65 72 65 6e 74 20 6d 75 74 65 78   different mutex
1800: 20 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e 20   on every call. 
1810: 20 42 75 74 20 66 6f 72 20 74 68 65 20 73 74 61   But for the sta
1820: 74 69 63 20 0a 2a 2a 20 6d 75 74 65 78 20 74 79  tic .** mutex ty
1830: 70 65 73 2c 20 74 68 65 20 73 61 6d 65 20 6d 75  pes, the same mu
1840: 74 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 20  tex is returned 
1850: 6f 6e 20 65 76 65 72 79 20 63 61 6c 6c 20 74 68  on every call th
1860: 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 73 61  at has.** the sa
1870: 6d 65 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 0a  me type number..
1880: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1890: 33 5f 6d 75 74 65 78 20 2a 77 69 6e 4d 75 74 65  3_mutex *winMute
18a0: 78 41 6c 6c 6f 63 28 69 6e 74 20 69 54 79 70 65  xAlloc(int iType
18b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
18c0: 65 78 20 2a 70 3b 0a 0a 20 20 73 77 69 74 63 68  ex *p;..  switch
18d0: 28 20 69 54 79 70 65 20 29 7b 0a 20 20 20 20 63  ( iType ){.    c
18e0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  ase SQLITE_MUTEX
18f0: 5f 46 41 53 54 3a 0a 20 20 20 20 63 61 73 65 20  _FAST:.    case 
1900: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
1910: 55 52 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20  URSIVE: {.      
1920: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
1930: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
1940: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1950: 20 29 7b 20 20 0a 23 69 66 64 65 66 20 53 51 4c   ){  .#ifdef SQL
1960: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
1970: 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70 65 3b    p->id = iType;
1980: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1990: 49 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63  InitializeCritic
19a0: 61 6c 53 65 63 74 69 6f 6e 28 26 70 2d 3e 6d 75  alSection(&p->mu
19b0: 74 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tex);.      }.  
19c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
19e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69        assert( wi
19f0: 6e 4d 75 74 65 78 5f 69 73 49 6e 69 74 3d 3d 31  nMutex_isInit==1
1a00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a10: 28 20 69 54 79 70 65 2d 32 20 3e 3d 20 30 20 29  ( iType-2 >= 0 )
1a20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a30: 69 54 79 70 65 2d 32 20 3c 20 41 72 72 61 79 53  iType-2 < ArrayS
1a40: 69 7a 65 28 77 69 6e 4d 75 74 65 78 5f 73 74 61  ize(winMutex_sta
1a50: 74 69 63 4d 75 74 65 78 65 73 29 20 29 3b 0a 20  ticMutexes) );. 
1a60: 20 20 20 20 20 70 20 3d 20 26 77 69 6e 4d 75 74       p = &winMut
1a70: 65 78 5f 73 74 61 74 69 63 4d 75 74 65 78 65 73  ex_staticMutexes
1a80: 5b 69 54 79 70 65 2d 32 5d 3b 0a 23 69 66 64 65  [iType-2];.#ifde
1a90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1aa0: 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 54 79       p->id = iTy
1ab0: 70 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  pe;.#endif.     
1ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ad0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1ae0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1af0: 74 69 6e 65 20 64 65 61 6c 6c 6f 63 61 74 65 73  tine deallocates
1b00: 20 61 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a   a previously.**
1b10: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 75 74 65 78   allocated mutex
1b20: 2e 20 20 53 51 4c 69 74 65 20 69 73 20 63 61 72  .  SQLite is car
1b30: 65 66 75 6c 20 74 6f 20 64 65 61 6c 6c 6f 63 61  eful to dealloca
1b40: 74 65 20 65 76 65 72 79 0a 2a 2a 20 6d 75 74 65  te every.** mute
1b50: 78 20 74 68 61 74 20 69 74 20 61 6c 6c 6f 63 61  x that it alloca
1b60: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
1b70: 6f 69 64 20 77 69 6e 4d 75 74 65 78 46 72 65 65  oid winMutexFree
1b80: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
1b90: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20  p){.  assert( p 
1ba0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1bb0: 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nRef==0 );.  ass
1bc0: 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49  ert( p->id==SQLI
1bd0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 7c 7c  TE_MUTEX_FAST ||
1be0: 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d   p->id==SQLITE_M
1bf0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 29  UTEX_RECURSIVE )
1c00: 3b 0a 20 20 44 65 6c 65 74 65 43 72 69 74 69 63  ;.  DeleteCritic
1c10: 61 6c 53 65 63 74 69 6f 6e 28 26 70 2d 3e 6d 75  alSection(&p->mu
1c20: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tex);.  sqlite3_
1c30: 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(p);.}../*.*
1c40: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75  * The sqlite3_mu
1c50: 74 65 78 5f 65 6e 74 65 72 28 29 20 61 6e 64 20  tex_enter() and 
1c60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72  sqlite3_mutex_tr
1c70: 79 28 29 20 72 6f 75 74 69 6e 65 73 20 61 74 74  y() routines att
1c80: 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 74 65 72  empt.** to enter
1c90: 20 61 20 6d 75 74 65 78 2e 20 20 49 66 20 61 6e   a mutex.  If an
1ca0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 73 20  other thread is 
1cb0: 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 74  already within t
1cc0: 68 65 20 6d 75 74 65 78 2c 0a 2a 2a 20 73 71 6c  he mutex,.** sql
1cd0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1ce0: 28 29 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 61 6e  () will block an
1cf0: 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  d sqlite3_mutex_
1d00: 74 72 79 28 29 20 77 69 6c 6c 20 72 65 74 75 72  try() will retur
1d10: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  n.** SQLITE_BUSY
1d20: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  .  The sqlite3_m
1d30: 75 74 65 78 5f 74 72 79 28 29 20 69 6e 74 65 72  utex_try() inter
1d40: 66 61 63 65 20 72 65 74 75 72 6e 73 20 53 51 4c  face returns SQL
1d50: 49 54 45 5f 4f 4b 0a 2a 2a 20 75 70 6f 6e 20 73  ITE_OK.** upon s
1d60: 75 63 63 65 73 73 66 75 6c 20 65 6e 74 72 79 2e  uccessful entry.
1d70: 20 20 4d 75 74 65 78 65 73 20 63 72 65 61 74 65    Mutexes create
1d80: 64 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 4d  d using SQLITE_M
1d90: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 63  UTEX_RECURSIVE c
1da0: 61 6e 0a 2a 2a 20 62 65 20 65 6e 74 65 72 65 64  an.** be entered
1db0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
1dc0: 62 79 20 74 68 65 20 73 61 6d 65 20 74 68 72 65  by the same thre
1dd0: 61 64 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73  ad.  In such cas
1de0: 65 73 20 74 68 65 2c 0a 2a 2a 20 6d 75 74 65 78  es the,.** mutex
1df0: 20 6d 75 73 74 20 62 65 20 65 78 69 74 65 64 20   must be exited 
1e00: 61 6e 20 65 71 75 61 6c 20 6e 75 6d 62 65 72 20  an equal number 
1e10: 6f 66 20 74 69 6d 65 73 20 62 65 66 6f 72 65 20  of times before 
1e20: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 0a 2a  another thread.*
1e30: 2a 20 63 61 6e 20 65 6e 74 65 72 2e 20 20 49 66  * can enter.  If
1e40: 20 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64   the same thread
1e50: 20 74 72 69 65 73 20 74 6f 20 65 6e 74 65 72 20   tries to enter 
1e60: 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f  any other kind o
1e70: 66 20 6d 75 74 65 78 0a 2a 2a 20 6d 6f 72 65 20  f mutex.** more 
1e80: 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68 65 20 62  than once, the b
1e90: 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65 66  ehavior is undef
1ea0: 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
1eb0: 76 6f 69 64 20 77 69 6e 4d 75 74 65 78 45 6e 74  void winMutexEnt
1ec0: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
1ed0: 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
1ee0: 49 54 45 5f 44 45 42 55 47 0a 20 20 44 57 4f 52  ITE_DEBUG.  DWOR
1ef0: 44 20 74 69 64 20 3d 20 47 65 74 43 75 72 72 65  D tid = GetCurre
1f00: 6e 74 54 68 72 65 61 64 49 64 28 29 3b 20 0a 20  ntThreadId(); . 
1f10: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d   assert( p->id==
1f20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
1f30: 55 52 53 49 56 45 20 7c 7c 20 77 69 6e 4d 75 74  URSIVE || winMut
1f40: 65 78 4e 6f 74 68 65 6c 64 32 28 70 2c 20 74 69  exNotheld2(p, ti
1f50: 64 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 45  d) );.#endif.  E
1f60: 6e 74 65 72 43 72 69 74 69 63 61 6c 53 65 63 74  nterCriticalSect
1f70: 69 6f 6e 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a  ion(&p->mutex);.
1f80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1f90: 42 55 47 0a 20 20 70 2d 3e 6f 77 6e 65 72 20 3d  BUG.  p->owner =
1fa0: 20 74 69 64 3b 20 0a 20 20 70 2d 3e 6e 52 65 66   tid; .  p->nRef
1fb0: 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 74 72 61  ++;.  if( p->tra
1fc0: 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
1fd0: 28 22 65 6e 74 65 72 20 6d 75 74 65 78 20 25 70  ("enter mutex %p
1fe0: 20 28 25 64 29 20 77 69 74 68 20 6e 52 65 66 3d   (%d) with nRef=
1ff0: 25 64 5c 6e 22 2c 20 70 2c 20 70 2d 3e 74 72 61  %d\n", p, p->tra
2000: 63 65 2c 20 70 2d 3e 6e 52 65 66 29 3b 0a 20 20  ce, p->nRef);.  
2010: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69  }.#endif.}.stati
2020: 63 20 69 6e 74 20 77 69 6e 4d 75 74 65 78 54 72  c int winMutexTr
2030: 79 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  y(sqlite3_mutex 
2040: 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  *p){.#ifndef NDE
2050: 42 55 47 0a 20 20 44 57 4f 52 44 20 74 69 64 20  BUG.  DWORD tid 
2060: 3d 20 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  = GetCurrentThre
2070: 61 64 49 64 28 29 3b 20 0a 23 65 6e 64 69 66 0a  adId(); .#endif.
2080: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2090: 45 5f 42 55 53 59 3b 0a 20 20 61 73 73 65 72 74  E_BUSY;.  assert
20a0: 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f  ( p->id==SQLITE_
20b0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20  MUTEX_RECURSIVE 
20c0: 7c 7c 20 77 69 6e 4d 75 74 65 78 4e 6f 74 68 65  || winMutexNothe
20d0: 6c 64 32 28 70 2c 20 74 69 64 29 20 29 3b 0a 20  ld2(p, tid) );. 
20e0: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 73 71 6c   /*.  ** The sql
20f0: 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29  ite3_mutex_try()
2100: 20 72 6f 75 74 69 6e 65 20 69 73 20 76 65 72 79   routine is very
2110: 20 72 61 72 65 6c 79 20 75 73 65 64 2c 20 61 6e   rarely used, an
2120: 64 20 77 68 65 6e 20 69 74 0a 20 20 2a 2a 20 69  d when it.  ** i
2130: 73 20 75 73 65 64 20 69 74 20 69 73 20 6d 65 72  s used it is mer
2140: 65 6c 79 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  ely an optimizat
2150: 69 6f 6e 2e 20 20 53 6f 20 69 74 20 69 73 20 4f  ion.  So it is O
2160: 4b 20 66 6f 72 20 69 74 20 74 6f 20 61 6c 77 61  K for it to alwa
2170: 79 73 0a 20 20 2a 2a 20 66 61 69 6c 2e 20 20 0a  ys.  ** fail.  .
2180: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 54 72    **.  ** The Tr
2190: 79 45 6e 74 65 72 43 72 69 74 69 63 61 6c 53 65  yEnterCriticalSe
21a0: 63 74 69 6f 6e 28 29 20 69 6e 74 65 72 66 61 63  ction() interfac
21b0: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
21c0: 62 6c 65 20 6f 6e 20 57 69 6e 4e 54 2e 0a 20 20  ble on WinNT..  
21d0: 2a 2a 20 41 6e 64 20 73 6f 6d 65 20 77 69 6e 64  ** And some wind
21e0: 6f 77 73 20 63 6f 6d 70 69 6c 65 72 73 20 63 6f  ows compilers co
21f0: 6d 70 6c 61 69 6e 20 69 66 20 79 6f 75 20 74 72  mplain if you tr
2200: 79 20 74 6f 20 75 73 65 20 69 74 20 77 69 74 68  y to use it with
2210: 6f 75 74 0a 20 20 2a 2a 20 66 69 72 73 74 20 64  out.  ** first d
2220: 6f 69 6e 67 20 73 6f 6d 65 20 23 64 65 66 69 6e  oing some #defin
2230: 65 73 20 74 68 61 74 20 70 72 65 76 65 6e 74 20  es that prevent 
2240: 53 51 4c 69 74 65 20 66 72 6f 6d 20 62 75 69 6c  SQLite from buil
2250: 64 69 6e 67 20 6f 6e 20 57 69 6e 39 38 2e 0a 20  ding on Win98.. 
2260: 20 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61   ** For that rea
2270: 73 6f 6e 2c 20 77 65 20 77 69 6c 6c 20 6f 6d 69  son, we will omi
2280: 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
2290: 69 6f 6e 20 66 6f 72 20 6e 6f 77 2e 20 20 53 65  ion for now.  Se
22a0: 65 0a 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 32  e.  ** ticket #2
22b0: 36 38 35 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a  685..  */.#if 0.
22c0: 20 20 69 66 28 20 6d 75 74 65 78 49 73 4e 54 28    if( mutexIsNT(
22d0: 29 20 26 26 20 54 72 79 45 6e 74 65 72 43 72 69  ) && TryEnterCri
22e0: 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 2d  ticalSection(&p-
22f0: 3e 6d 75 74 65 78 29 20 29 7b 0a 20 20 20 20 70  >mutex) ){.    p
2300: 2d 3e 6f 77 6e 65 72 20 3d 20 74 69 64 3b 0a 20  ->owner = tid;. 
2310: 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20     p->nRef++;.  
2320: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2330: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  ;.  }.#else.  UN
2340: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2350: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
2360: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2370: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2380: 4b 20 26 26 20 70 2d 3e 74 72 61 63 65 20 29 7b  K && p->trace ){
2390: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 65 6e 74  .    printf("ent
23a0: 65 72 20 6d 75 74 65 78 20 25 70 20 28 25 64 29  er mutex %p (%d)
23b0: 20 77 69 74 68 20 6e 52 65 66 3d 25 64 5c 6e 22   with nRef=%d\n"
23c0: 2c 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c 20 70  , p, p->trace, p
23d0: 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 23 65 6e  ->nRef);.  }.#en
23e0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
23f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
2400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2410: 65 28 29 20 72 6f 75 74 69 6e 65 20 65 78 69 74  e() routine exit
2420: 73 20 61 20 6d 75 74 65 78 20 74 68 61 74 20 77  s a mutex that w
2430: 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  as.** previously
2440: 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20   entered by the 
2450: 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 54 68  same thread.  Th
2460: 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20 69 73  e behavior.** is
2470: 20 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74 68   undefined if th
2480: 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 63  e mutex is not c
2490: 75 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 64  urrently entered
24a0: 20 6f 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 75   or.** is not cu
24b0: 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65  rrently allocate
24c0: 64 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  d.  SQLite will 
24d0: 6e 65 76 65 72 20 64 6f 20 65 69 74 68 65 72 2e  never do either.
24e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24f0: 77 69 6e 4d 75 74 65 78 4c 65 61 76 65 28 73 71  winMutexLeave(sq
2500: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
2510: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2520: 20 20 44 57 4f 52 44 20 74 69 64 20 3d 20 47 65    DWORD tid = Ge
2530: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64  tCurrentThreadId
2540: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ();.  assert( p-
2550: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
2560: 65 72 74 28 20 70 2d 3e 6f 77 6e 65 72 3d 3d 74  ert( p->owner==t
2570: 69 64 20 29 3b 0a 20 20 70 2d 3e 6e 52 65 66 2d  id );.  p->nRef-
2580: 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  -;.  assert( p->
2590: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 2d 3e 69 64  nRef==0 || p->id
25a0: 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  ==SQLITE_MUTEX_R
25b0: 45 43 55 52 53 49 56 45 20 29 3b 0a 23 65 6e 64  ECURSIVE );.#end
25c0: 69 66 0a 20 20 4c 65 61 76 65 43 72 69 74 69 63  if.  LeaveCritic
25d0: 61 6c 53 65 63 74 69 6f 6e 28 26 70 2d 3e 6d 75  alSection(&p->mu
25e0: 74 65 78 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tex);.#ifdef SQL
25f0: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
2600: 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20  p->trace ){.    
2610: 70 72 69 6e 74 66 28 22 6c 65 61 76 65 20 6d 75  printf("leave mu
2620: 74 65 78 20 25 70 20 28 25 64 29 20 77 69 74 68  tex %p (%d) with
2630: 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 70 2c 20   nRef=%d\n", p, 
2640: 70 2d 3e 74 72 61 63 65 2c 20 70 2d 3e 6e 52 65  p->trace, p->nRe
2650: 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  f);.  }.#endif.}
2660: 0a 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ..sqlite3_mutex_
2670: 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 73  methods const *s
2680: 71 6c 69 74 65 33 44 65 66 61 75 6c 74 4d 75 74  qlite3DefaultMut
2690: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ex(void){.  stat
26a0: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
26b0: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 73  _mutex_methods s
26c0: 4d 75 74 65 78 20 3d 20 7b 0a 20 20 20 20 77 69  Mutex = {.    wi
26d0: 6e 4d 75 74 65 78 49 6e 69 74 2c 0a 20 20 20 20  nMutexInit,.    
26e0: 77 69 6e 4d 75 74 65 78 45 6e 64 2c 0a 20 20 20  winMutexEnd,.   
26f0: 20 77 69 6e 4d 75 74 65 78 41 6c 6c 6f 63 2c 0a   winMutexAlloc,.
2700: 20 20 20 20 77 69 6e 4d 75 74 65 78 46 72 65 65      winMutexFree
2710: 2c 0a 20 20 20 20 77 69 6e 4d 75 74 65 78 45 6e  ,.    winMutexEn
2720: 74 65 72 2c 0a 20 20 20 20 77 69 6e 4d 75 74 65  ter,.    winMute
2730: 78 54 72 79 2c 0a 20 20 20 20 77 69 6e 4d 75 74  xTry,.    winMut
2740: 65 78 4c 65 61 76 65 2c 0a 23 69 66 64 65 66 20  exLeave,.#ifdef 
2750: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2760: 20 77 69 6e 4d 75 74 65 78 48 65 6c 64 2c 0a 20   winMutexHeld,. 
2770: 20 20 20 77 69 6e 4d 75 74 65 78 4e 6f 74 68 65     winMutexNothe
2780: 6c 64 0a 23 65 6c 73 65 0a 20 20 20 20 30 2c 0a  ld.#else.    0,.
2790: 20 20 20 20 30 0a 23 65 6e 64 69 66 0a 20 20 7d      0.#endif.  }
27a0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 26 73 4d 75  ;..  return &sMu
27b0: 74 65 78 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  tex;.}.#endif /*
27c0: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 57 33   SQLITE_MUTEX_W3
27d0: 32 20 2a 2f 0a                                   2 */.