/ Hex Artifact Content
Login

Artifact c1526811f4b97a7cd9d4d72d2b9623d06abd05ce:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 32 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 28.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20   contains the C 
0190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
01a0: 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 65 78 65 73  mplement mutexes
01b0: 20 66 6f 72 20 70 74 68 72 65 61 64 73 0a 2a 2a   for pthreads.**
01c0: 0a 2a 2a 20 24 49 64 3a 20 6d 75 74 65 78 5f 75  .** $Id: mutex_u
01d0: 6e 69 78 2e 63 2c 76 20 31 2e 31 32 20 32 30 30  nix.c,v 1.12 200
01e0: 38 2f 30 36 2f 31 39 20 31 36 3a 30 37 3a 30 37  8/06/19 16:07:07
01f0: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t.h"../*.** The 
0220: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
0230: 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  e is only used i
0240: 66 20 77 65 20 61 72 65 20 63 6f 6d 70 69 6c 69  f we are compili
0250: 6e 67 20 74 68 72 65 61 64 73 61 66 65 0a 2a 2a  ng threadsafe.**
0260: 20 75 6e 64 65 72 20 75 6e 69 78 20 77 69 74 68   under unix with
0270: 20 70 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a   pthreads..**.**
0280: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
0290: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 72  implementation r
02a0: 65 71 75 69 72 65 73 20 61 20 76 65 72 73 69 6f  equires a versio
02b0: 6e 20 6f 66 20 70 74 68 72 65 61 64 73 20 74 68  n of pthreads th
02c0: 61 74 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 72  at.** supports r
02d0: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 65 73  ecursive mutexes
02e0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
02f0: 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 44  TE_MUTEX_PTHREAD
0300: 53 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68  S..#include <pth
0310: 72 65 61 64 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20  read.h>.../*.** 
0320: 45 61 63 68 20 72 65 63 75 72 73 69 76 65 20 6d  Each recursive m
0330: 75 74 65 78 20 69 73 20 61 6e 20 69 6e 73 74 61  utex is an insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0360: 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65  */.struct sqlite
0370: 33 5f 6d 75 74 65 78 20 7b 0a 20 20 70 74 68 72  3_mutex {.  pthr
0380: 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65  ead_mutex_t mute
0390: 78 3b 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  x;     /* Mutex 
03a0: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 65 20  controlling the 
03b0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 64  lock */.  int id
03c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
03d0: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 79       /* Mutex ty
03e0: 70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  pe */.  int nRef
03f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0400: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0410: 65 6e 74 72 61 6e 63 65 73 20 2a 2f 0a 20 20 70  entrances */.  p
0420: 74 68 72 65 61 64 5f 74 20 6f 77 6e 65 72 3b 20  thread_t owner; 
0430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72            /* Thr
0440: 65 61 64 20 74 68 61 74 20 69 73 20 77 69 74 68  ead that is with
0450: 69 6e 20 74 68 69 73 20 6d 75 74 65 78 20 2a 2f  in this mutex */
0460: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0470: 45 42 55 47 0a 20 20 69 6e 74 20 74 72 61 63 65  EBUG.  int trace
0480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0490: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 74 72 61    /* True to tra
04a0: 63 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 23 65  ce changes */.#e
04b0: 6e 64 69 66 0a 7d 3b 0a 23 69 66 64 65 66 20 53  ndif.};.#ifdef S
04c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 23 64 65 66  QLITE_DEBUG.#def
04d0: 69 6e 65 20 53 51 4c 49 54 45 33 5f 4d 55 54 45  ine SQLITE3_MUTE
04e0: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 7b 20  X_INITIALIZER { 
04f0: 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
0500: 49 54 49 41 4c 49 5a 45 52 2c 20 30 2c 20 30 2c  ITIALIZER, 0, 0,
0510: 20 28 70 74 68 72 65 61 64 5f 74 29 30 2c 20 30   (pthread_t)0, 0
0520: 20 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65   }.#else.#define
0530: 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49   SQLITE3_MUTEX_I
0540: 4e 49 54 49 41 4c 49 5a 45 52 20 7b 20 50 54 48  NITIALIZER { PTH
0550: 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
0560: 41 4c 49 5a 45 52 2c 20 30 2c 20 30 2c 20 28 70  ALIZER, 0, 0, (p
0570: 74 68 72 65 61 64 5f 74 29 30 20 7d 0a 23 65 6e  thread_t)0 }.#en
0580: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  dif../*.** The s
0590: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
05a0: 64 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  d() and sqlite3_
05b0: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20  mutex_notheld() 
05c0: 72 6f 75 74 69 6e 65 20 61 72 65 0a 2a 2a 20 69  routine are.** i
05d0: 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20  ntended for use 
05e0: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 61 73 73 65  only inside asse
05f0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
0600: 20 20 4f 6e 20 73 6f 6d 65 20 70 6c 61 74 66 6f    On some platfo
0610: 72 6d 73 2c 0a 2a 2a 20 74 68 65 72 65 20 6d 69  rms,.** there mi
0620: 67 68 74 20 62 65 20 72 61 63 65 20 63 6f 6e 64  ght be race cond
0630: 69 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20  itions that can 
0640: 63 61 75 73 65 20 74 68 65 73 65 20 72 6f 75 74  cause these rout
0650: 69 6e 65 73 20 74 6f 0a 2a 2a 20 64 65 6c 69 76  ines to.** deliv
0660: 65 72 20 69 6e 63 6f 72 72 65 63 74 20 72 65 73  er incorrect res
0670: 75 6c 74 73 2e 20 20 49 6e 20 70 61 72 74 69 63  ults.  In partic
0680: 75 6c 61 72 2c 20 69 66 20 70 74 68 72 65 61 64  ular, if pthread
0690: 5f 65 71 75 61 6c 28 29 20 69 73 0a 2a 2a 20 6e  _equal() is.** n
06a0: 6f 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65  ot an atomic ope
06b0: 72 61 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  ration, then the
06c0: 73 65 20 72 6f 75 74 69 6e 65 73 20 6d 69 67 68  se routines migh
06d0: 74 20 64 65 6c 69 76 65 72 79 0a 2a 2a 20 69 6e  t delivery.** in
06e0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 2e  correct results.
06f0: 20 20 4f 6e 20 6d 6f 73 74 20 70 6c 61 74 66 6f    On most platfo
0700: 72 6d 73 2c 20 70 74 68 72 65 61 64 5f 65 71 75  rms, pthread_equ
0710: 61 6c 28 29 20 69 73 20 61 20 0a 2a 2a 20 63 6f  al() is a .** co
0720: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
0730: 69 6e 74 65 67 65 72 73 20 61 6e 64 20 69 73 20  integers and is 
0740: 74 68 65 72 65 66 6f 72 65 20 61 74 6f 6d 69 63  therefore atomic
0750: 2e 20 20 42 75 74 20 77 65 20 61 72 65 0a 2a 2a  .  But we are.**
0760: 20 74 6f 6c 64 20 74 68 61 74 20 48 50 55 58 20   told that HPUX 
0770: 69 73 20 6e 6f 74 20 73 75 63 68 20 61 20 70 6c  is not such a pl
0780: 61 74 66 6f 72 6d 2e 20 20 49 66 20 73 6f 2c 20  atform.  If so, 
0790: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
07a0: 6e 65 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nes.** will not 
07b0: 61 6c 77 61 79 73 20 77 6f 72 6b 20 63 6f 72 72  always work corr
07c0: 65 63 74 6c 79 20 6f 6e 20 48 50 55 58 2e 0a 2a  ectly on HPUX..*
07d0: 2a 0a 2a 2a 20 4f 6e 20 74 68 6f 73 65 20 70 6c  *.** On those pl
07e0: 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20 70 74  atforms where pt
07f0: 68 72 65 61 64 5f 65 71 75 61 6c 28 29 20 69 73  hread_equal() is
0800: 20 6e 6f 74 20 61 74 6f 6d 69 63 2c 20 53 51 4c   not atomic, SQL
0810: 69 74 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  ite.** should be
0820: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 6f 75   compiled withou
0830: 74 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  t -DSQLITE_DEBUG
0840: 20 61 6e 64 20 77 69 74 68 20 2d 44 4e 44 45 42   and with -DNDEB
0850: 55 47 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  UG to.** make su
0860: 72 65 20 6e 6f 20 61 73 73 65 72 74 28 29 20 73  re no assert() s
0870: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 65 76  tatements are ev
0880: 61 6c 75 61 74 65 64 20 61 6e 64 20 68 65 6e 63  aluated and henc
0890: 65 20 74 68 65 73 65 0a 2a 2a 20 72 6f 75 74 69  e these.** routi
08a0: 6e 65 73 20 61 72 65 20 6e 65 76 65 72 20 63 61  nes are never ca
08b0: 6c 6c 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  lled..*/.#ifndef
08c0: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
08d0: 6e 74 20 70 74 68 72 65 61 64 4d 75 74 65 78 48  nt pthreadMutexH
08e0: 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  eld(sqlite3_mute
08f0: 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  x *p){.  return 
0900: 28 70 2d 3e 6e 52 65 66 21 3d 30 20 26 26 20 70  (p->nRef!=0 && p
0910: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e  thread_equal(p->
0920: 6f 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73  owner, pthread_s
0930: 65 6c 66 28 29 29 29 3b 0a 7d 0a 73 74 61 74 69  elf()));.}.stati
0940: 63 20 69 6e 74 20 70 74 68 72 65 61 64 4d 75 74  c int pthreadMut
0950: 65 78 4e 6f 74 68 65 6c 64 28 73 71 6c 69 74 65  exNotheld(sqlite
0960: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 72  3_mutex *p){.  r
0970: 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 30  eturn p->nRef==0
0980: 20 7c 7c 20 70 74 68 72 65 61 64 5f 65 71 75 61   || pthread_equa
0990: 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 70 74 68 72  l(p->owner, pthr
09a0: 65 61 64 5f 73 65 6c 66 28 29 29 3d 3d 30 3b 0a  ead_self())==0;.
09b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
09c0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64  Initialize and d
09d0: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  einitialize the 
09e0: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2e  mutex subsystem.
09f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
0a00: 74 68 72 65 61 64 4d 75 74 65 78 49 6e 69 74 28  threadMutexInit(
0a10: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
0a20: 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 73 74 61 74 69  LITE_OK; }.stati
0a30: 63 20 69 6e 74 20 70 74 68 72 65 61 64 4d 75 74  c int pthreadMut
0a40: 65 78 45 6e 64 28 76 6f 69 64 29 7b 20 72 65 74  exEnd(void){ ret
0a50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d  urn SQLITE_OK; }
0a60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ../*.** The sqli
0a70: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
0a80: 29 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  ) routine alloca
0a90: 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6d 75 74  tes a new.** mut
0aa0: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ex and returns a
0ab0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
0ac0: 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 4e   If it returns N
0ad0: 55 4c 4c 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  ULL.** that mean
0ae0: 73 20 74 68 61 74 20 61 20 6d 75 74 65 78 20 63  s that a mutex c
0af0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
0b00: 63 61 74 65 64 2e 20 20 53 51 4c 69 74 65 0a 2a  cated.  SQLite.*
0b10: 2a 20 77 69 6c 6c 20 75 6e 77 69 6e 64 20 69 74  * will unwind it
0b20: 73 20 73 74 61 63 6b 20 61 6e 64 20 72 65 74 75  s stack and retu
0b30: 72 6e 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  rn an error.  Th
0b40: 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 74 6f  e argument.** to
0b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
0b60: 6c 6c 6f 63 28 29 20 69 73 20 6f 6e 65 20 6f 66  lloc() is one of
0b70: 20 74 68 65 73 65 20 69 6e 74 65 67 65 72 20 63   these integer c
0b80: 6f 6e 73 74 61 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  onstants:.**.** 
0b90: 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51  <ul>.** <li>  SQ
0ba0: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 0a  LITE_MUTEX_FAST.
0bb0: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
0bc0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 0a  MUTEX_RECURSIVE.
0bd0: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
0be0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
0bf0: 54 45 52 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c  TER.** <li>  SQL
0c00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
0c10: 5f 4d 45 4d 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51  _MEM.** <li>  SQ
0c20: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0c30: 43 5f 4d 45 4d 32 0a 2a 2a 20 3c 6c 69 3e 20 20  C_MEM2.** <li>  
0c40: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
0c50: 54 49 43 5f 50 52 4e 47 0a 2a 2a 20 3c 6c 69 3e  TIC_PRNG.** <li>
0c60: 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53    SQLITE_MUTEX_S
0c70: 54 41 54 49 43 5f 4c 52 55 0a 2a 2a 20 3c 2f 75  TATIC_LRU.** </u
0c80: 6c 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  l>.**.** The fir
0c90: 73 74 20 74 77 6f 20 63 6f 6e 73 74 61 6e 74 73  st two constants
0ca0: 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 6d   cause sqlite3_m
0cb0: 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 74 6f 20  utex_alloc() to 
0cc0: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
0cd0: 6d 75 74 65 78 2e 20 20 54 68 65 20 6e 65 77 20  mutex.  The new 
0ce0: 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73 69  mutex is recursi
0cf0: 76 65 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d  ve when SQLITE_M
0d00: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 0a 2a  UTEX_RECURSIVE.*
0d10: 2a 20 69 73 20 75 73 65 64 20 62 75 74 20 6e 6f  * is used but no
0d20: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 6f  t necessarily so
0d30: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54   when SQLITE_MUT
0d40: 45 58 5f 46 41 53 54 20 69 73 20 75 73 65 64 2e  EX_FAST is used.
0d50: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 69 6d  .** The mutex im
0d60: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
0d70: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  s not need to ma
0d80: 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e  ke a distinction
0d90: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 53 51 4c 49  .** between SQLI
0da0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
0db0: 56 45 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 55  VE and SQLITE_MU
0dc0: 54 45 58 5f 46 41 53 54 20 69 66 20 69 74 20 64  TEX_FAST if it d
0dd0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 77 61 6e 74 20  oes.** not want 
0de0: 74 6f 2e 20 20 42 75 74 20 53 51 4c 69 74 65 20  to.  But SQLite 
0df0: 77 69 6c 6c 20 6f 6e 6c 79 20 72 65 71 75 65 73  will only reques
0e00: 74 20 61 20 72 65 63 75 72 73 69 76 65 20 6d 75  t a recursive mu
0e10: 74 65 78 20 69 6e 0a 2a 2a 20 63 61 73 65 73 20  tex in.** cases 
0e20: 77 68 65 72 65 20 69 74 20 72 65 61 6c 6c 79 20  where it really 
0e30: 6e 65 65 64 73 20 6f 6e 65 2e 20 20 49 66 20 61  needs one.  If a
0e40: 20 66 61 73 74 65 72 20 6e 6f 6e 2d 72 65 63 75   faster non-recu
0e50: 72 73 69 76 65 20 6d 75 74 65 78 0a 2a 2a 20 69  rsive mutex.** i
0e60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
0e70: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
0e80: 65 20 68 6f 73 74 20 70 6c 61 74 66 6f 72 6d 2c  e host platform,
0e90: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
0ea0: 73 74 65 6d 0a 2a 2a 20 6d 69 67 68 74 20 72 65  stem.** might re
0eb0: 74 75 72 6e 20 73 75 63 68 20 61 20 6d 75 74 65  turn such a mute
0ec0: 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
0ed0: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41   SQLITE_MUTEX_FA
0ee0: 53 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 74  ST..**.** The ot
0ef0: 68 65 72 20 61 6c 6c 6f 77 65 64 20 70 61 72 61  her allowed para
0f00: 6d 65 74 65 72 73 20 74 6f 20 73 71 6c 69 74 65  meters to sqlite
0f10: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20  3_mutex_alloc() 
0f20: 65 61 63 68 20 72 65 74 75 72 6e 0a 2a 2a 20 61  each return.** a
0f30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
0f40: 61 74 69 63 20 70 72 65 65 78 69 73 74 69 6e 67  atic preexisting
0f50: 20 6d 75 74 65 78 2e 20 20 54 68 72 65 65 20 73   mutex.  Three s
0f60: 74 61 74 69 63 20 6d 75 74 65 78 65 73 20 61 72  tatic mutexes ar
0f70: 65 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  e.** used by the
0f80: 20 63 75 72 72 65 6e 74 20 76 65 72 73 69 6f 6e   current version
0f90: 20 6f 66 20 53 51 4c 69 74 65 2e 20 20 46 75 74   of SQLite.  Fut
0fa0: 75 72 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ure versions of 
0fb0: 53 51 4c 69 74 65 0a 2a 2a 20 6d 61 79 20 61 64  SQLite.** may ad
0fc0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 74 61  d additional sta
0fd0: 74 69 63 20 6d 75 74 65 78 65 73 2e 20 20 53 74  tic mutexes.  St
0fe0: 61 74 69 63 20 6d 75 74 65 78 65 73 20 61 72 65  atic mutexes are
0ff0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
1000: 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 20 6f   use by SQLite o
1010: 6e 6c 79 2e 20 20 41 70 70 6c 69 63 61 74 69 6f  nly.  Applicatio
1020: 6e 73 20 74 68 61 74 20 75 73 65 20 53 51 4c 69  ns that use SQLi
1030: 74 65 20 6d 75 74 65 78 65 73 20 73 68 6f 75 6c  te mutexes shoul
1040: 64 0a 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68  d.** use only th
1050: 65 20 64 79 6e 61 6d 69 63 20 6d 75 74 65 78 65  e dynamic mutexe
1060: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 51  s returned by SQ
1070: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20  LITE_MUTEX_FAST 
1080: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 55 54  or.** SQLITE_MUT
1090: 45 58 5f 52 45 43 55 52 53 49 56 45 2e 0a 2a 2a  EX_RECURSIVE..**
10a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
10b0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 79 6e 61   one of the dyna
10c0: 6d 69 63 20 6d 75 74 65 78 20 70 61 72 61 6d 65  mic mutex parame
10d0: 74 65 72 73 20 28 53 51 4c 49 54 45 5f 4d 55 54  ters (SQLITE_MUT
10e0: 45 58 5f 46 41 53 54 0a 2a 2a 20 6f 72 20 53 51  EX_FAST.** or SQ
10f0: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
1100: 53 49 56 45 29 20 69 73 20 75 73 65 64 20 74 68  SIVE) is used th
1110: 65 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  en sqlite3_mutex
1120: 5f 61 6c 6c 6f 63 28 29 0a 2a 2a 20 72 65 74 75  _alloc().** retu
1130: 72 6e 73 20 61 20 64 69 66 66 65 72 65 6e 74 20  rns a different 
1140: 6d 75 74 65 78 20 6f 6e 20 65 76 65 72 79 20 63  mutex on every c
1150: 61 6c 6c 2e 20 20 42 75 74 20 66 6f 72 20 74 68  all.  But for th
1160: 65 20 73 74 61 74 69 63 20 0a 2a 2a 20 6d 75 74  e static .** mut
1170: 65 78 20 74 79 70 65 73 2c 20 74 68 65 20 73 61  ex types, the sa
1180: 6d 65 20 6d 75 74 65 78 20 69 73 20 72 65 74 75  me mutex is retu
1190: 72 6e 65 64 20 6f 6e 20 65 76 65 72 79 20 63 61  rned on every ca
11a0: 6c 6c 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 74  ll that has.** t
11b0: 68 65 20 73 61 6d 65 20 74 79 70 65 20 6e 75 6d  he same type num
11c0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ber..*/.static s
11d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 74  qlite3_mutex *pt
11e0: 68 72 65 61 64 4d 75 74 65 78 41 6c 6c 6f 63 28  hreadMutexAlloc(
11f0: 69 6e 74 20 69 54 79 70 65 29 7b 0a 20 20 73 74  int iType){.  st
1200: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74  atic sqlite3_mut
1210: 65 78 20 73 74 61 74 69 63 4d 75 74 65 78 65 73  ex staticMutexes
1220: 5b 5d 20 3d 20 7b 0a 20 20 20 20 53 51 4c 49 54  [] = {.    SQLIT
1230: 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  E3_MUTEX_INITIAL
1240: 49 5a 45 52 2c 0a 20 20 20 20 53 51 4c 49 54 45  IZER,.    SQLITE
1250: 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49  3_MUTEX_INITIALI
1260: 5a 45 52 2c 0a 20 20 20 20 53 51 4c 49 54 45 33  ZER,.    SQLITE3
1270: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
1280: 45 52 2c 0a 20 20 20 20 53 51 4c 49 54 45 33 5f  ER,.    SQLITE3_
1290: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
12a0: 52 2c 0a 20 20 20 20 53 51 4c 49 54 45 33 5f 4d  R,.    SQLITE3_M
12b0: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
12c0: 2c 0a 20 20 20 20 53 51 4c 49 54 45 33 5f 4d 55  ,.    SQLITE3_MU
12d0: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 0a  TEX_INITIALIZER.
12e0: 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d    };.  sqlite3_m
12f0: 75 74 65 78 20 2a 70 3b 0a 20 20 73 77 69 74 63  utex *p;.  switc
1300: 68 28 20 69 54 79 70 65 20 29 7b 0a 20 20 20 20  h( iType ){.    
1310: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45  case SQLITE_MUTE
1320: 58 5f 52 45 43 55 52 53 49 56 45 3a 20 7b 0a 20  X_RECURSIVE: {. 
1330: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
1340: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1350: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 20 20  of(*p) );.      
1360: 69 66 28 20 70 20 29 7b 0a 23 69 66 64 65 66 20  if( p ){.#ifdef 
1370: 53 51 4c 49 54 45 5f 48 4f 4d 45 47 52 4f 57 4e  SQLITE_HOMEGROWN
1380: 5f 52 45 43 55 52 53 49 56 45 5f 4d 55 54 45 58  _RECURSIVE_MUTEX
1390: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72  .        /* If r
13a0: 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 65 73  ecursive mutexes
13b0: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
13c0: 6c 65 2c 20 77 65 20 77 69 6c 6c 20 68 61 76 65  le, we will have
13d0: 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62   to.        ** b
13e0: 75 69 6c 64 20 6f 75 72 20 6f 77 6e 2e 20 20 53  uild our own.  S
13f0: 65 65 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ee below. */.   
1400: 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74       pthread_mut
1410: 65 78 5f 69 6e 69 74 28 26 70 2d 3e 6d 75 74 65  ex_init(&p->mute
1420: 78 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  x, 0);.#else.   
1430: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 65       /* Use a re
1440: 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 66  cursive mutex if
1450: 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
1460: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 74 68 72   */.        pthr
1470: 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f 74 20  ead_mutexattr_t 
1480: 72 65 63 75 72 73 69 76 65 41 74 74 72 3b 0a 20  recursiveAttr;. 
1490: 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
14a0: 75 74 65 78 61 74 74 72 5f 69 6e 69 74 28 26 72  utexattr_init(&r
14b0: 65 63 75 72 73 69 76 65 41 74 74 72 29 3b 0a 20  ecursiveAttr);. 
14c0: 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
14d0: 75 74 65 78 61 74 74 72 5f 73 65 74 74 79 70 65  utexattr_settype
14e0: 28 26 72 65 63 75 72 73 69 76 65 41 74 74 72 2c  (&recursiveAttr,
14f0: 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 52   PTHREAD_MUTEX_R
1500: 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20  ECURSIVE);.     
1510: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
1520: 5f 69 6e 69 74 28 26 70 2d 3e 6d 75 74 65 78 2c  _init(&p->mutex,
1530: 20 26 72 65 63 75 72 73 69 76 65 41 74 74 72 29   &recursiveAttr)
1540: 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61  ;.        pthrea
1550: 64 5f 6d 75 74 65 78 61 74 74 72 5f 64 65 73 74  d_mutexattr_dest
1560: 72 6f 79 28 26 72 65 63 75 72 73 69 76 65 41 74  roy(&recursiveAt
1570: 74 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  tr);.#endif.    
1580: 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70      p->id = iTyp
1590: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
15a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 55    case SQLITE_MU
15c0: 54 45 58 5f 46 41 53 54 3a 20 7b 0a 20 20 20 20  TEX_FAST: {.    
15d0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
15e0: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
15f0: 2a 70 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  *p) );.      if(
1600: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d   p ){.        p-
1610: 3e 69 64 20 3d 20 69 54 79 70 65 3b 0a 20 20 20  >id = iType;.   
1620: 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74       pthread_mut
1630: 65 78 5f 69 6e 69 74 28 26 70 2d 3e 6d 75 74 65  ex_init(&p->mute
1640: 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  x, 0);.      }. 
1650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1660: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1670: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1680: 54 79 70 65 2d 32 20 3e 3d 20 30 20 29 3b 0a 20  Type-2 >= 0 );. 
1690: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 79       assert( iTy
16a0: 70 65 2d 32 20 3c 20 73 69 7a 65 6f 66 28 73 74  pe-2 < sizeof(st
16b0: 61 74 69 63 4d 75 74 65 78 65 73 29 2f 73 69 7a  aticMutexes)/siz
16c0: 65 6f 66 28 73 74 61 74 69 63 4d 75 74 65 78 65  eof(staticMutexe
16d0: 73 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 70  s[0]) );.      p
16e0: 20 3d 20 26 73 74 61 74 69 63 4d 75 74 65 78 65   = &staticMutexe
16f0: 73 5b 69 54 79 70 65 2d 32 5d 3b 0a 20 20 20 20  s[iType-2];.    
1700: 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70 65 3b    p->id = iType;
1710: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1720: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1730: 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   p;.}.../*.** Th
1740: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 61 6c 6c  is routine deall
1750: 6f 63 61 74 65 73 20 61 20 70 72 65 76 69 6f 75  ocates a previou
1760: 73 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  sly.** allocated
1770: 20 6d 75 74 65 78 2e 20 20 53 51 4c 69 74 65 20   mutex.  SQLite 
1780: 69 73 20 63 61 72 65 66 75 6c 20 74 6f 20 64 65  is careful to de
1790: 61 6c 6c 6f 63 61 74 65 20 65 76 65 72 79 0a 2a  allocate every.*
17a0: 2a 20 6d 75 74 65 78 20 74 68 61 74 20 69 74 20  * mutex that it 
17b0: 61 6c 6c 6f 63 61 74 65 73 2e 0a 2a 2f 0a 73 74  allocates..*/.st
17c0: 61 74 69 63 20 76 6f 69 64 20 70 74 68 72 65 61  atic void pthrea
17d0: 64 4d 75 74 65 78 46 72 65 65 28 73 71 6c 69 74  dMutexFree(sqlit
17e0: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
17f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
1800: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1810: 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55  p->id==SQLITE_MU
1820: 54 45 58 5f 46 41 53 54 20 7c 7c 20 70 2d 3e 69  TEX_FAST || p->i
1830: 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  d==SQLITE_MUTEX_
1840: 52 45 43 55 52 53 49 56 45 20 29 3b 0a 20 20 70  RECURSIVE );.  p
1850: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 64 65 73  thread_mutex_des
1860: 74 72 6f 79 28 26 70 2d 3e 6d 75 74 65 78 29 3b  troy(&p->mutex);
1870: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1880: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
1890: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
18a0: 6e 74 65 72 28 29 20 61 6e 64 20 73 71 6c 69 74  nter() and sqlit
18b0: 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 72  e3_mutex_try() r
18c0: 6f 75 74 69 6e 65 73 20 61 74 74 65 6d 70 74 0a  outines attempt.
18d0: 2a 2a 20 74 6f 20 65 6e 74 65 72 20 61 20 6d 75  ** to enter a mu
18e0: 74 65 78 2e 20 20 49 66 20 61 6e 6f 74 68 65 72  tex.  If another
18f0: 20 74 68 72 65 61 64 20 69 73 20 61 6c 72 65 61   thread is alrea
1900: 64 79 20 77 69 74 68 69 6e 20 74 68 65 20 6d 75  dy within the mu
1910: 74 65 78 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  tex,.** sqlite3_
1920: 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20 77 69  mutex_enter() wi
1930: 6c 6c 20 62 6c 6f 63 6b 20 61 6e 64 20 73 71 6c  ll block and sql
1940: 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29  ite3_mutex_try()
1950: 20 77 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20   will return.** 
1960: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
1970: 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e sqlite3_mutex_
1980: 74 72 79 28 29 20 69 6e 74 65 72 66 61 63 65 20  try() interface 
1990: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
19a0: 4b 0a 2a 2a 20 75 70 6f 6e 20 73 75 63 63 65 73  K.** upon succes
19b0: 73 66 75 6c 20 65 6e 74 72 79 2e 20 20 4d 75 74  sful entry.  Mut
19c0: 65 78 65 73 20 63 72 65 61 74 65 64 20 75 73 69  exes created usi
19d0: 6e 67 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ng SQLITE_MUTEX_
19e0: 52 45 43 55 52 53 49 56 45 20 63 61 6e 0a 2a 2a  RECURSIVE can.**
19f0: 20 62 65 20 65 6e 74 65 72 65 64 20 6d 75 6c 74   be entered mult
1a00: 69 70 6c 65 20 74 69 6d 65 73 20 62 79 20 74 68  iple times by th
1a10: 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20  e same thread.  
1a20: 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68  In such cases th
1a30: 65 2c 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74  e,.** mutex must
1a40: 20 62 65 20 65 78 69 74 65 64 20 61 6e 20 65 71   be exited an eq
1a50: 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  ual number of ti
1a60: 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f 74 68  mes before anoth
1a70: 65 72 20 74 68 72 65 61 64 0a 2a 2a 20 63 61 6e  er thread.** can
1a80: 20 65 6e 74 65 72 2e 20 20 49 66 20 74 68 65 20   enter.  If the 
1a90: 73 61 6d 65 20 74 68 72 65 61 64 20 74 72 69 65  same thread trie
1aa0: 73 20 74 6f 20 65 6e 74 65 72 20 61 6e 79 20 6f  s to enter any o
1ab0: 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 6d 75 74  ther kind of mut
1ac0: 65 78 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ex.** more than 
1ad0: 6f 6e 63 65 2c 20 74 68 65 20 62 65 68 61 76 69  once, the behavi
1ae0: 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  or is undefined.
1af0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b00: 70 74 68 72 65 61 64 4d 75 74 65 78 45 6e 74 65  pthreadMutexEnte
1b10: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  r(sqlite3_mutex 
1b20: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
1b30: 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54  ->id==SQLITE_MUT
1b40: 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c 7c 20  EX_RECURSIVE || 
1b50: 70 74 68 72 65 61 64 4d 75 74 65 78 4e 6f 74 68  pthreadMutexNoth
1b60: 65 6c 64 28 70 29 20 29 3b 0a 0a 23 69 66 64 65  eld(p) );..#ifde
1b70: 66 20 53 51 4c 49 54 45 5f 48 4f 4d 45 47 52 4f  f SQLITE_HOMEGRO
1b80: 57 4e 5f 52 45 43 55 52 53 49 56 45 5f 4d 55 54  WN_RECURSIVE_MUT
1b90: 45 58 0a 20 20 2f 2a 20 49 66 20 72 65 63 75 72  EX.  /* If recur
1ba0: 73 69 76 65 20 6d 75 74 65 78 65 73 20 61 72 65  sive mutexes are
1bb0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
1bc0: 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20  then we have to 
1bd0: 67 72 6f 77 0a 20 20 2a 2a 20 6f 75 72 20 6f 77  grow.  ** our ow
1be0: 6e 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  n.  This impleme
1bf0: 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  ntation assumes 
1c00: 74 68 61 74 20 70 74 68 72 65 61 64 5f 65 71 75  that pthread_equ
1c10: 61 6c 28 29 0a 20 20 2a 2a 20 69 73 20 61 74 6f  al().  ** is ato
1c20: 6d 69 63 20 2d 20 74 68 61 74 20 69 74 20 63 61  mic - that it ca
1c30: 6e 6e 6f 74 20 62 65 20 64 65 63 65 69 76 65 64  nnot be deceived
1c40: 20 69 6e 74 6f 20 74 68 69 6e 6b 69 6e 67 20 73   into thinking s
1c50: 65 6c 66 0a 20 20 2a 2a 20 61 6e 64 20 70 2d 3e  elf.  ** and p->
1c60: 6f 77 6e 65 72 20 61 72 65 20 65 71 75 61 6c 20  owner are equal 
1c70: 69 66 20 70 2d 3e 6f 77 6e 65 72 20 63 68 61 6e  if p->owner chan
1c80: 67 65 73 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ges between two 
1c90: 76 61 6c 75 65 73 0a 20 20 2a 2a 20 74 68 61 74  values.  ** that
1ca0: 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 74   are not equal t
1cb0: 6f 20 73 65 6c 66 20 77 68 69 6c 65 20 74 68 65  o self while the
1cc0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
1cd0: 61 6b 69 6e 67 20 70 6c 61 63 65 2e 0a 20 20 2a  aking place..  *
1ce0: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
1cf0: 61 74 69 6f 6e 20 61 6c 73 6f 20 61 73 73 75 6d  ation also assum
1d00: 65 73 20 61 20 63 6f 68 65 72 65 6e 74 20 63 61  es a coherent ca
1d10: 63 68 65 20 2d 20 74 68 61 74 20 0a 20 20 2a 2a  che - that .  **
1d20: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1d30: 73 65 73 20 63 61 6e 6e 6f 74 20 72 65 61 64 20  ses cannot read 
1d40: 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75 65 73  different values
1d50: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a 20   from the same. 
1d60: 20 2a 2a 20 61 64 64 72 65 73 73 20 61 74 20 74   ** address at t
1d70: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
1d80: 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
1d90: 65 20 74 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73  e two conditions
1da0: 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 6d 65  .  ** are not me
1db0: 74 2c 20 74 68 65 6e 20 74 68 65 20 6d 75 74 65  t, then the mute
1dc0: 78 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  xes will fail an
1dd0: 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 6c 6c 20  d problems will 
1de0: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 7b  result..  */.  {
1df0: 0a 20 20 20 20 70 74 68 72 65 61 64 5f 74 20 73  .    pthread_t s
1e00: 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65  elf = pthread_se
1e10: 6c 66 28 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  lf();.    if( p-
1e20: 3e 6e 52 65 66 3e 30 20 26 26 20 70 74 68 72 65  >nRef>0 && pthre
1e30: 61 64 5f 65 71 75 61 6c 28 70 2d 3e 6f 77 6e 65  ad_equal(p->owne
1e40: 72 2c 20 73 65 6c 66 29 20 29 7b 0a 20 20 20 20  r, self) ){.    
1e50: 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20    p->nRef++;.   
1e60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 74   }else{.      pt
1e70: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
1e80: 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (&p->mutex);.   
1e90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
1ea0: 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ef==0 );.      p
1eb0: 2d 3e 6f 77 6e 65 72 20 3d 20 73 65 6c 66 3b 0a  ->owner = self;.
1ec0: 20 20 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20        p->nRef = 
1ed0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  1;.    }.  }.#el
1ee0: 73 65 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20  se.  /* Use the 
1ef0: 62 75 69 6c 74 2d 69 6e 20 72 65 63 75 72 73 69  built-in recursi
1f00: 76 65 20 6d 75 74 65 78 65 73 20 69 66 20 74 68  ve mutexes if th
1f10: 65 79 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ey are available
1f20: 2e 0a 20 20 2a 2f 0a 20 20 70 74 68 72 65 61 64  ..  */.  pthread
1f30: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e  _mutex_lock(&p->
1f40: 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 6f 77 6e  mutex);.  p->own
1f50: 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  er = pthread_sel
1f60: 66 28 29 3b 0a 20 20 70 2d 3e 6e 52 65 66 2b 2b  f();.  p->nRef++
1f70: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1f80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1f90: 69 66 28 20 70 2d 3e 74 72 61 63 65 20 29 7b 0a  if( p->trace ){.
1fa0: 20 20 20 20 70 72 69 6e 74 66 28 22 65 6e 74 65      printf("ente
1fb0: 72 20 6d 75 74 65 78 20 25 70 20 28 25 64 29 20  r mutex %p (%d) 
1fc0: 77 69 74 68 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  with nRef=%d\n",
1fd0: 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c 20 70 2d   p, p->trace, p-
1fe0: 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 23 65 6e 64  >nRef);.  }.#end
1ff0: 69 66 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  if.}.static int 
2000: 70 74 68 72 65 61 64 4d 75 74 65 78 54 72 79 28  pthreadMutexTry(
2010: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
2020: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
2030: 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51  ssert( p->id==SQ
2040: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
2050: 53 49 56 45 20 7c 7c 20 70 74 68 72 65 61 64 4d  SIVE || pthreadM
2060: 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 29 20 29  utexNotheld(p) )
2070: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
2080: 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52  _HOMEGROWN_RECUR
2090: 53 49 56 45 5f 4d 55 54 45 58 0a 20 20 2f 2a 20  SIVE_MUTEX.  /* 
20a0: 49 66 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  If recursive mut
20b0: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61  exes are not ava
20c0: 69 6c 61 62 6c 65 2c 20 74 68 65 6e 20 77 65 20  ilable, then we 
20d0: 68 61 76 65 20 74 6f 20 67 72 6f 77 0a 20 20 2a  have to grow.  *
20e0: 2a 20 6f 75 72 20 6f 77 6e 2e 20 20 54 68 69 73  * our own.  This
20f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2100: 61 73 73 75 6d 65 73 20 74 68 61 74 20 70 74 68  assumes that pth
2110: 72 65 61 64 5f 65 71 75 61 6c 28 29 0a 20 20 2a  read_equal().  *
2120: 2a 20 69 73 20 61 74 6f 6d 69 63 20 2d 20 74 68  * is atomic - th
2130: 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20  at it cannot be 
2140: 64 65 63 65 69 76 65 64 20 69 6e 74 6f 20 74 68  deceived into th
2150: 69 6e 6b 69 6e 67 20 73 65 6c 66 0a 20 20 2a 2a  inking self.  **
2160: 20 61 6e 64 20 70 2d 3e 6f 77 6e 65 72 20 61 72   and p->owner ar
2170: 65 20 65 71 75 61 6c 20 69 66 20 70 2d 3e 6f 77  e equal if p->ow
2180: 6e 65 72 20 63 68 61 6e 67 65 73 20 62 65 74 77  ner changes betw
2190: 65 65 6e 20 74 77 6f 20 76 61 6c 75 65 73 0a 20  een two values. 
21a0: 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
21b0: 20 65 71 75 61 6c 20 74 6f 20 73 65 6c 66 20 77   equal to self w
21c0: 68 69 6c 65 20 74 68 65 20 63 6f 6d 70 61 72 69  hile the compari
21d0: 73 6f 6e 20 69 73 20 74 61 6b 69 6e 67 20 70 6c  son is taking pl
21e0: 61 63 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  ace..  ** This i
21f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 6c  mplementation al
2200: 73 6f 20 61 73 73 75 6d 65 73 20 61 20 63 6f 68  so assumes a coh
2210: 65 72 65 6e 74 20 63 61 63 68 65 20 2d 20 74 68  erent cache - th
2220: 61 74 20 0a 20 20 2a 2a 20 73 65 70 61 72 61 74  at .  ** separat
2230: 65 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 6e  e processes cann
2240: 6f 74 20 72 65 61 64 20 64 69 66 66 65 72 65 6e  ot read differen
2250: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68  t values from th
2260: 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61 64 64 72  e same.  ** addr
2270: 65 73 73 20 61 74 20 74 68 65 20 73 61 6d 65 20  ess at the same 
2280: 74 69 6d 65 2e 20 20 49 66 20 65 69 74 68 65 72  time.  If either
2290: 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 63 6f   of these two co
22a0: 6e 64 69 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72  nditions.  ** ar
22b0: 65 20 6e 6f 74 20 6d 65 74 2c 20 74 68 65 6e 20  e not met, then 
22c0: 74 68 65 20 6d 75 74 65 78 65 73 20 77 69 6c 6c  the mutexes will
22d0: 20 66 61 69 6c 20 61 6e 64 20 70 72 6f 62 6c 65   fail and proble
22e0: 6d 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  ms will result..
22f0: 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 70 74 68    */.  {.    pth
2300: 72 65 61 64 5f 74 20 73 65 6c 66 20 3d 20 70 74  read_t self = pt
2310: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
2320: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3e 30 20    if( p->nRef>0 
2330: 26 26 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c  && pthread_equal
2340: 28 70 2d 3e 6f 77 6e 65 72 2c 20 73 65 6c 66 29  (p->owner, self)
2350: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65   ){.      p->nRe
2360: 66 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  f++;.      rc = 
2370: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2380: 65 6c 73 65 20 69 66 28 20 70 74 68 72 65 61 64  else if( pthread
2390: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e  _mutex_lock(&p->
23a0: 6d 75 74 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20  mutex)==0 ){.   
23b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
23c0: 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ef==0 );.      p
23d0: 2d 3e 6f 77 6e 65 72 20 3d 20 73 65 6c 66 3b 0a  ->owner = self;.
23e0: 20 20 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20        p->nRef = 
23f0: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  1;.      rc = SQ
2400: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
2410: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2420: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2430: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  }.  }.#else.  /*
2440: 20 55 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   Use the built-i
2450: 6e 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65  n recursive mute
2460: 78 65 73 20 69 66 20 74 68 65 79 20 61 72 65 20  xes if they are 
2470: 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 2a 2f 0a  available..  */.
2480: 20 20 69 66 28 20 70 74 68 72 65 61 64 5f 6d 75    if( pthread_mu
2490: 74 65 78 5f 74 72 79 6c 6f 63 6b 28 26 70 2d 3e  tex_trylock(&p->
24a0: 6d 75 74 65 78 29 3d 3d 30 20 29 7b 0a 20 20 20  mutex)==0 ){.   
24b0: 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 70 74 68 72   p->owner = pthr
24c0: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20  ead_self();.    
24d0: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 72  p->nRef++;.    r
24e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2500: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2510: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
2520: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2530: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2540: 4b 20 26 26 20 70 2d 3e 74 72 61 63 65 20 29 7b  K && p->trace ){
2550: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 65 6e 74  .    printf("ent
2560: 65 72 20 6d 75 74 65 78 20 25 70 20 28 25 64 29  er mutex %p (%d)
2570: 20 77 69 74 68 20 6e 52 65 66 3d 25 64 5c 6e 22   with nRef=%d\n"
2580: 2c 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c 20 70  , p, p->trace, p
2590: 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 23 65 6e  ->nRef);.  }.#en
25a0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
25c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
25d0: 65 28 29 20 72 6f 75 74 69 6e 65 20 65 78 69 74  e() routine exit
25e0: 73 20 61 20 6d 75 74 65 78 20 74 68 61 74 20 77  s a mutex that w
25f0: 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  as.** previously
2600: 20 65 6e 74 65 72 65 64 20 62 79 20 74 68 65 20   entered by the 
2610: 73 61 6d 65 20 74 68 72 65 61 64 2e 20 20 54 68  same thread.  Th
2620: 65 20 62 65 68 61 76 69 6f 72 0a 2a 2a 20 69 73  e behavior.** is
2630: 20 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74 68   undefined if th
2640: 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 63  e mutex is not c
2650: 75 72 72 65 6e 74 6c 79 20 65 6e 74 65 72 65 64  urrently entered
2660: 20 6f 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 75   or.** is not cu
2670: 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65  rrently allocate
2680: 64 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  d.  SQLite will 
2690: 6e 65 76 65 72 20 64 6f 20 65 69 74 68 65 72 2e  never do either.
26a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26b0: 70 74 68 72 65 61 64 4d 75 74 65 78 4c 65 61 76  pthreadMutexLeav
26c0: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  e(sqlite3_mutex 
26d0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
26e0: 74 68 72 65 61 64 4d 75 74 65 78 48 65 6c 64 28  threadMutexHeld(
26f0: 70 29 20 29 3b 0a 20 20 70 2d 3e 6e 52 65 66 2d  p) );.  p->nRef-
2700: 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  -;.  assert( p->
2710: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 2d 3e 69 64  nRef==0 || p->id
2720: 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  ==SQLITE_MUTEX_R
2730: 45 43 55 52 53 49 56 45 20 29 3b 0a 0a 23 69 66  ECURSIVE );..#if
2740: 64 65 66 20 53 51 4c 49 54 45 5f 48 4f 4d 45 47  def SQLITE_HOMEG
2750: 52 4f 57 4e 5f 52 45 43 55 52 53 49 56 45 5f 4d  ROWN_RECURSIVE_M
2760: 55 54 45 58 0a 20 20 69 66 28 20 70 2d 3e 6e 52  UTEX.  if( p->nR
2770: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 74 68  ef==0 ){.    pth
2780: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
2790: 6b 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  k(&p->mutex);.  
27a0: 7d 0a 23 65 6c 73 65 0a 20 20 70 74 68 72 65 61  }.#else.  pthrea
27b0: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
27c0: 70 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  p->mutex);.#endi
27d0: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
27e0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
27f0: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  trace ){.    pri
2800: 6e 74 66 28 22 6c 65 61 76 65 20 6d 75 74 65 78  ntf("leave mutex
2810: 20 25 70 20 28 25 64 29 20 77 69 74 68 20 6e 52   %p (%d) with nR
2820: 65 66 3d 25 64 5c 6e 22 2c 20 70 2c 20 70 2d 3e  ef=%d\n", p, p->
2830: 74 72 61 63 65 2c 20 70 2d 3e 6e 52 65 66 29 3b  trace, p->nRef);
2840: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73  .  }.#endif.}..s
2850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
2860: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 44 65 66  hods *sqlite3Def
2870: 61 75 6c 74 4d 75 74 65 78 28 76 6f 69 64 29 7b  aultMutex(void){
2880: 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2890: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20  3_mutex_methods 
28a0: 73 4d 75 74 65 78 20 3d 20 7b 0a 20 20 20 20 70  sMutex = {.    p
28b0: 74 68 72 65 61 64 4d 75 74 65 78 49 6e 69 74 2c  threadMutexInit,
28c0: 0a 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65  .    pthreadMute
28d0: 78 45 6e 64 2c 0a 20 20 20 20 70 74 68 72 65 61  xEnd,.    pthrea
28e0: 64 4d 75 74 65 78 41 6c 6c 6f 63 2c 0a 20 20 20  dMutexAlloc,.   
28f0: 20 70 74 68 72 65 61 64 4d 75 74 65 78 46 72 65   pthreadMutexFre
2900: 65 2c 0a 20 20 20 20 70 74 68 72 65 61 64 4d 75  e,.    pthreadMu
2910: 74 65 78 45 6e 74 65 72 2c 0a 20 20 20 20 70 74  texEnter,.    pt
2920: 68 72 65 61 64 4d 75 74 65 78 54 72 79 2c 0a 20  hreadMutexTry,. 
2930: 20 20 20 70 74 68 72 65 61 64 4d 75 74 65 78 4c     pthreadMutexL
2940: 65 61 76 65 2c 0a 23 69 66 64 65 66 20 53 51 4c  eave,.#ifdef SQL
2950: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 74  ITE_DEBUG.    pt
2960: 68 72 65 61 64 4d 75 74 65 78 48 65 6c 64 2c 0a  hreadMutexHeld,.
2970: 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65 78      pthreadMutex
2980: 4e 6f 74 68 65 6c 64 0a 23 65 6e 64 69 66 0a 20  Notheld.#endif. 
2990: 20 7d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 26 73   };..  return &s
29a0: 4d 75 74 65 78 3b 0a 7d 0a 0a 23 65 6e 64 69 66  Mutex;.}..#endif
29b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   /* SQLITE_MUTEX
29c0: 5f 50 54 48 52 45 41 44 20 2a 2f 0a              _PTHREAD */.