/ Hex Artifact Content
Login

Artifact 3b1c895a044d45812ea1eae9019daeff8cfb27ce:


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 35 20 32 30 30  nix.c,v 1.15 200
01e0: 38 2f 31 31 2f 31 37 20 31 39 3a 31 38 3a 35 35  8/11/17 19:18:55
01f0: 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70   danielk1977 Exp
0200: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0210: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0220: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 6e 20  .** The code in 
0230: 74 68 69 73 20 66 69 6c 65 20 69 73 20 6f 6e 6c  this file is onl
0240: 79 20 75 73 65 64 20 69 66 20 77 65 20 61 72 65  y used if we are
0250: 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 72 65 61   compiling threa
0260: 64 73 61 66 65 0a 2a 2a 20 75 6e 64 65 72 20 75  dsafe.** under u
0270: 6e 69 78 20 77 69 74 68 20 70 74 68 72 65 61 64  nix with pthread
0280: 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  s..**.** Note th
0290: 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  at this implemen
02a0: 74 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  tation requires 
02b0: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 74 68  a version of pth
02c0: 72 65 61 64 73 20 74 68 61 74 0a 2a 2a 20 73 75  reads that.** su
02d0: 70 70 6f 72 74 73 20 72 65 63 75 72 73 69 76 65  pports recursive
02e0: 20 6d 75 74 65 78 65 73 2e 0a 2a 2f 0a 23 69 66   mutexes..*/.#if
02f0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
0300: 5f 50 54 48 52 45 41 44 53 0a 0a 23 69 6e 63 6c  _PTHREADS..#incl
0310: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
0320: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 72 65 63  ../*.** Each rec
0330: 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 73 20  ursive mutex is 
0340: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0350: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0360: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
0370: 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  t sqlite3_mutex 
0380: 7b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  {.  pthread_mute
0390: 78 5f 74 20 6d 75 74 65 78 3b 20 20 20 20 20 2f  x_t mutex;     /
03a0: 2a 20 4d 75 74 65 78 20 63 6f 6e 74 72 6f 6c 6c  * Mutex controll
03b0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ing the lock */.
03c0: 20 20 69 6e 74 20 69 64 3b 20 20 20 20 20 20 20    int id;       
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
03e0: 4d 75 74 65 78 20 74 79 70 65 20 2a 2f 0a 20 20  Mutex type */.  
03f0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
0400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0410: 6d 62 65 72 20 6f 66 20 65 6e 74 72 61 6e 63 65  mber of entrance
0420: 73 20 2a 2f 0a 20 20 70 74 68 72 65 61 64 5f 74  s */.  pthread_t
0430: 20 6f 77 6e 65 72 3b 20 20 20 20 20 20 20 20 20   owner;         
0440: 20 20 2f 2a 20 54 68 72 65 61 64 20 74 68 61 74    /* Thread that
0450: 20 69 73 20 77 69 74 68 69 6e 20 74 68 69 73 20   is within this 
0460: 6d 75 74 65 78 20 2a 2f 0a 23 69 66 64 65 66 20  mutex */.#ifdef 
0470: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
0480: 6e 74 20 74 72 61 63 65 3b 20 20 20 20 20 20 20  nt trace;       
0490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
04a0: 65 20 74 6f 20 74 72 61 63 65 20 63 68 61 6e 67  e to trace chang
04b0: 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  es */.#endif.};.
04c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
04d0: 42 55 47 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  BUG.#define SQLI
04e0: 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  TE3_MUTEX_INITIA
04f0: 4c 49 5a 45 52 20 7b 20 50 54 48 52 45 41 44 5f  LIZER { PTHREAD_
0500: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
0510: 52 2c 20 30 2c 20 30 2c 20 28 70 74 68 72 65 61  R, 0, 0, (pthrea
0520: 64 5f 74 29 30 2c 20 30 20 7d 0a 23 65 6c 73 65  d_t)0, 0 }.#else
0530: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 33  .#define SQLITE3
0540: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
0550: 45 52 20 7b 20 50 54 48 52 45 41 44 5f 4d 55 54  ER { PTHREAD_MUT
0560: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 20  EX_INITIALIZER, 
0570: 30 2c 20 30 2c 20 28 70 74 68 72 65 61 64 5f 74  0, 0, (pthread_t
0580: 29 30 20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )0 }.#endif../*.
0590: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** The sqlite3_m
05a0: 75 74 65 78 5f 68 65 6c 64 28 29 20 61 6e 64 20  utex_held() and 
05b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
05c0: 74 68 65 6c 64 28 29 20 72 6f 75 74 69 6e 65 20  theld() routine 
05d0: 61 72 65 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20  are.** intended 
05e0: 66 6f 72 20 75 73 65 20 6f 6e 6c 79 20 69 6e 73  for use only ins
05f0: 69 64 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ide assert() sta
0600: 74 65 6d 65 6e 74 73 2e 20 20 4f 6e 20 73 6f 6d  tements.  On som
0610: 65 20 70 6c 61 74 66 6f 72 6d 73 2c 0a 2a 2a 20  e platforms,.** 
0620: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  there might be r
0630: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  ace conditions t
0640: 68 61 74 20 63 61 6e 20 63 61 75 73 65 20 74 68  hat can cause th
0650: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 74 6f 0a  ese routines to.
0660: 2a 2a 20 64 65 6c 69 76 65 72 20 69 6e 63 6f 72  ** deliver incor
0670: 72 65 63 74 20 72 65 73 75 6c 74 73 2e 20 20 49  rect results.  I
0680: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 66  n particular, if
0690: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 29   pthread_equal()
06a0: 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 6e 20 61 74   is.** not an at
06b0: 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2c 20  omic operation, 
06c0: 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69  then these routi
06d0: 6e 65 73 20 6d 69 67 68 74 20 64 65 6c 69 76 65  nes might delive
06e0: 72 79 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 20  ry.** incorrect 
06f0: 72 65 73 75 6c 74 73 2e 20 20 4f 6e 20 6d 6f 73  results.  On mos
0700: 74 20 70 6c 61 74 66 6f 72 6d 73 2c 20 70 74 68  t platforms, pth
0710: 72 65 61 64 5f 65 71 75 61 6c 28 29 20 69 73 20  read_equal() is 
0720: 61 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  a .** comparison
0730: 20 6f 66 20 74 77 6f 20 69 6e 74 65 67 65 72 73   of two integers
0740: 20 61 6e 64 20 69 73 20 74 68 65 72 65 66 6f 72   and is therefor
0750: 65 20 61 74 6f 6d 69 63 2e 20 20 42 75 74 20 77  e atomic.  But w
0760: 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 20 74 68  e are.** told th
0770: 61 74 20 48 50 55 58 20 69 73 20 6e 6f 74 20 73  at HPUX is not s
0780: 75 63 68 20 61 20 70 6c 61 74 66 6f 72 6d 2e 20  uch a platform. 
0790: 20 49 66 20 73 6f 2c 20 74 68 65 6e 20 74 68 65   If so, then the
07a0: 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 77  se routines.** w
07b0: 69 6c 6c 20 6e 6f 74 20 61 6c 77 61 79 73 20 77  ill not always w
07c0: 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e  ork correctly on
07d0: 20 48 50 55 58 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20   HPUX..**.** On 
07e0: 74 68 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20  those platforms 
07f0: 77 68 65 72 65 20 70 74 68 72 65 61 64 5f 65 71  where pthread_eq
0800: 75 61 6c 28 29 20 69 73 20 6e 6f 74 20 61 74 6f  ual() is not ato
0810: 6d 69 63 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 73  mic, SQLite.** s
0820: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 69 6c 65  hould be compile
0830: 64 20 77 69 74 68 6f 75 74 20 2d 44 53 51 4c 49  d without -DSQLI
0840: 54 45 5f 44 45 42 55 47 20 61 6e 64 20 77 69 74  TE_DEBUG and wit
0850: 68 20 2d 44 4e 44 45 42 55 47 20 74 6f 0a 2a 2a  h -DNDEBUG to.**
0860: 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 61 73   make sure no as
0870: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0880: 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
0890: 61 6e 64 20 68 65 6e 63 65 20 74 68 65 73 65 0a  and hence these.
08a0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ** routines are 
08b0: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 0a 2a 2f  never called..*/
08c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
08d0: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
08e0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
08f0: 74 61 74 69 63 20 69 6e 74 20 70 74 68 72 65 61  tatic int pthrea
0900: 64 4d 75 74 65 78 48 65 6c 64 28 73 71 6c 69 74  dMutexHeld(sqlit
0910: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
0920: 72 65 74 75 72 6e 20 28 70 2d 3e 6e 52 65 66 21  return (p->nRef!
0930: 3d 30 20 26 26 20 70 74 68 72 65 61 64 5f 65 71  =0 && pthread_eq
0940: 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 70 74  ual(p->owner, pt
0950: 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29 3b 0a  hread_self()));.
0960: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 68  }.static int pth
0970: 72 65 61 64 4d 75 74 65 78 4e 6f 74 68 65 6c 64  readMutexNotheld
0980: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
0990: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
09a0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 74 68 72 65  nRef==0 || pthre
09b0: 61 64 5f 65 71 75 61 6c 28 70 2d 3e 6f 77 6e 65  ad_equal(p->owne
09c0: 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  r, pthread_self(
09d0: 29 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ))==0;.}.#endif.
09e0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
09f0: 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
0a00: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
0a10: 73 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  system..*/.stati
0a20: 63 20 69 6e 74 20 70 74 68 72 65 61 64 4d 75 74  c int pthreadMut
0a30: 65 78 49 6e 69 74 28 76 6f 69 64 29 7b 20 72 65  exInit(void){ re
0a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
0a50: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 68  }.static int pth
0a60: 72 65 61 64 4d 75 74 65 78 45 6e 64 28 76 6f 69  readMutexEnd(voi
0a70: 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d){ return SQLIT
0a80: 45 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK; }../*.** T
0a90: 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  he sqlite3_mutex
0aa0: 5f 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65  _alloc() routine
0ab0: 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77   allocates a new
0ac0: 0a 2a 2a 20 6d 75 74 65 78 20 61 6e 64 20 72 65  .** mutex and re
0ad0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
0ae0: 74 6f 20 69 74 2e 20 20 49 66 20 69 74 20 72 65  to it.  If it re
0af0: 74 75 72 6e 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  turns NULL.** th
0b00: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
0b10: 6d 75 74 65 78 20 63 6f 75 6c 64 20 6e 6f 74 20  mutex could not 
0b20: 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 53  be allocated.  S
0b30: 51 4c 69 74 65 0a 2a 2a 20 77 69 6c 6c 20 75 6e  QLite.** will un
0b40: 77 69 6e 64 20 69 74 73 20 73 74 61 63 6b 20 61  wind its stack a
0b50: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
0b60: 6f 72 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  or.  The argumen
0b70: 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f  t.** to sqlite3_
0b80: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 69 73  mutex_alloc() is
0b90: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 69 6e   one of these in
0ba0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 3a  teger constants:
0bb0: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c  .**.** <ul>.** <
0bc0: 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45  li>  SQLITE_MUTE
0bd0: 58 5f 46 41 53 54 0a 2a 2a 20 3c 6c 69 3e 20 20  X_FAST.** <li>  
0be0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
0bf0: 55 52 53 49 56 45 0a 2a 2a 20 3c 6c 69 3e 20 20  URSIVE.** <li>  
0c00: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
0c10: 54 49 43 5f 4d 41 53 54 45 52 0a 2a 2a 20 3c 6c  TIC_MASTER.** <l
0c20: 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  i>  SQLITE_MUTEX
0c30: 5f 53 54 41 54 49 43 5f 4d 45 4d 0a 2a 2a 20 3c  _STATIC_MEM.** <
0c40: 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45  li>  SQLITE_MUTE
0c50: 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 0a 2a 2a  X_STATIC_MEM2.**
0c60: 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55   <li>  SQLITE_MU
0c70: 54 45 58 5f 53 54 41 54 49 43 5f 50 52 4e 47 0a  TEX_STATIC_PRNG.
0c80: 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f  ** <li>  SQLITE_
0c90: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
0ca0: 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20  .** </ul>.**.** 
0cb0: 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f  The first two co
0cc0: 6e 73 74 61 6e 74 73 20 63 61 75 73 65 20 73 71  nstants cause sq
0cd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
0ce0: 63 28 29 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  c() to create.**
0cf0: 20 61 20 6e 65 77 20 6d 75 74 65 78 2e 20 20 54   a new mutex.  T
0d00: 68 65 20 6e 65 77 20 6d 75 74 65 78 20 69 73 20  he new mutex is 
0d10: 72 65 63 75 72 73 69 76 65 20 77 68 65 6e 20 53  recursive when S
0d20: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
0d30: 52 53 49 56 45 0a 2a 2a 20 69 73 20 75 73 65 64  RSIVE.** is used
0d40: 20 62 75 74 20 6e 6f 74 20 6e 65 63 65 73 73 61   but not necessa
0d50: 72 69 6c 79 20 73 6f 20 77 68 65 6e 20 53 51 4c  rily so when SQL
0d60: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 69  ITE_MUTEX_FAST i
0d70: 73 20 75 73 65 64 2e 0a 2a 2a 20 54 68 65 20 6d  s used..** The m
0d80: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
0d90: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
0da0: 64 20 74 6f 20 6d 61 6b 65 20 61 20 64 69 73 74  d to make a dist
0db0: 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  inction.** betwe
0dc0: 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  en SQLITE_MUTEX_
0dd0: 52 45 43 55 52 53 49 56 45 20 61 6e 64 20 53 51  RECURSIVE and SQ
0de0: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20  LITE_MUTEX_FAST 
0df0: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f  if it does.** no
0e00: 74 20 77 61 6e 74 20 74 6f 2e 20 20 42 75 74 20  t want to.  But 
0e10: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6f 6e 6c 79  SQLite will only
0e20: 20 72 65 71 75 65 73 74 20 61 20 72 65 63 75 72   request a recur
0e30: 73 69 76 65 20 6d 75 74 65 78 20 69 6e 0a 2a 2a  sive mutex in.**
0e40: 20 63 61 73 65 73 20 77 68 65 72 65 20 69 74 20   cases where it 
0e50: 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 6f 6e 65  really needs one
0e60: 2e 20 20 49 66 20 61 20 66 61 73 74 65 72 20 6e  .  If a faster n
0e70: 6f 6e 2d 72 65 63 75 72 73 69 76 65 20 6d 75 74  on-recursive mut
0e80: 65 78 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ex.** implementa
0e90: 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
0ea0: 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 20 70 6c  e on the host pl
0eb0: 61 74 66 6f 72 6d 2c 20 74 68 65 20 6d 75 74 65  atform, the mute
0ec0: 78 20 73 75 62 73 79 73 74 65 6d 0a 2a 2a 20 6d  x subsystem.** m
0ed0: 69 67 68 74 20 72 65 74 75 72 6e 20 73 75 63 68  ight return such
0ee0: 20 61 20 6d 75 74 65 78 20 69 6e 20 72 65 73 70   a mutex in resp
0ef0: 6f 6e 73 65 20 74 6f 20 53 51 4c 49 54 45 5f 4d  onse to SQLITE_M
0f00: 55 54 45 58 5f 46 41 53 54 2e 0a 2a 2a 0a 2a 2a  UTEX_FAST..**.**
0f10: 20 54 68 65 20 6f 74 68 65 72 20 61 6c 6c 6f 77   The other allow
0f20: 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  ed parameters to
0f30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
0f40: 6c 6c 6f 63 28 29 20 65 61 63 68 20 72 65 74 75  lloc() each retu
0f50: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
0f60: 74 6f 20 61 20 73 74 61 74 69 63 20 70 72 65 65  to a static pree
0f70: 78 69 73 74 69 6e 67 20 6d 75 74 65 78 2e 20 20  xisting mutex.  
0f80: 54 68 72 65 65 20 73 74 61 74 69 63 20 6d 75 74  Three static mut
0f90: 65 78 65 73 20 61 72 65 0a 2a 2a 20 75 73 65 64  exes are.** used
0fa0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
0fb0: 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74  version of SQLit
0fc0: 65 2e 20 20 46 75 74 75 72 65 20 76 65 72 73 69  e.  Future versi
0fd0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  ons of SQLite.**
0fe0: 20 6d 61 79 20 61 64 64 20 61 64 64 69 74 69 6f   may add additio
0ff0: 6e 61 6c 20 73 74 61 74 69 63 20 6d 75 74 65 78  nal static mutex
1000: 65 73 2e 20 20 53 74 61 74 69 63 20 6d 75 74 65  es.  Static mute
1010: 78 65 73 20 61 72 65 20 66 6f 72 20 69 6e 74 65  xes are for inte
1020: 72 6e 61 6c 0a 2a 2a 20 75 73 65 20 62 79 20 53  rnal.** use by S
1030: 51 4c 69 74 65 20 6f 6e 6c 79 2e 20 20 41 70 70  QLite only.  App
1040: 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74 20 75  lications that u
1050: 73 65 20 53 51 4c 69 74 65 20 6d 75 74 65 78 65  se SQLite mutexe
1060: 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 75 73 65 20  s should.** use 
1070: 6f 6e 6c 79 20 74 68 65 20 64 79 6e 61 6d 69 63  only the dynamic
1080: 20 6d 75 74 65 78 65 73 20 72 65 74 75 72 6e 65   mutexes returne
1090: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
10a0: 58 5f 46 41 53 54 20 6f 72 0a 2a 2a 20 53 51 4c  X_FAST or.** SQL
10b0: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
10c0: 49 56 45 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  IVE..**.** Note 
10d0: 74 68 61 74 20 69 66 20 6f 6e 65 20 6f 66 20 74  that if one of t
10e0: 68 65 20 64 79 6e 61 6d 69 63 20 6d 75 74 65 78  he dynamic mutex
10f0: 20 70 61 72 61 6d 65 74 65 72 73 20 28 53 51 4c   parameters (SQL
1100: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 0a 2a  ITE_MUTEX_FAST.*
1110: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4d 55 54 45  * or SQLITE_MUTE
1120: 58 5f 52 45 43 55 52 53 49 56 45 29 20 69 73 20  X_RECURSIVE) is 
1130: 75 73 65 64 20 74 68 65 6e 20 73 71 6c 69 74 65  used then sqlite
1140: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 0a  3_mutex_alloc().
1150: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 64 69 66  ** returns a dif
1160: 66 65 72 65 6e 74 20 6d 75 74 65 78 20 6f 6e 20  ferent mutex on 
1170: 65 76 65 72 79 20 63 61 6c 6c 2e 20 20 42 75 74  every call.  But
1180: 20 66 6f 72 20 74 68 65 20 73 74 61 74 69 63 20   for the static 
1190: 0a 2a 2a 20 6d 75 74 65 78 20 74 79 70 65 73 2c  .** mutex types,
11a0: 20 74 68 65 20 73 61 6d 65 20 6d 75 74 65 78 20   the same mutex 
11b0: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 65  is returned on e
11c0: 76 65 72 79 20 63 61 6c 6c 20 74 68 61 74 20 68  very call that h
11d0: 61 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 74  as.** the same t
11e0: 79 70 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  ype number..*/.s
11f0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75  tatic sqlite3_mu
1200: 74 65 78 20 2a 70 74 68 72 65 61 64 4d 75 74 65  tex *pthreadMute
1210: 78 41 6c 6c 6f 63 28 69 6e 74 20 69 54 79 70 65  xAlloc(int iType
1220: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
1230: 74 65 33 5f 6d 75 74 65 78 20 73 74 61 74 69 63  te3_mutex static
1240: 4d 75 74 65 78 65 73 5b 5d 20 3d 20 7b 0a 20 20  Mutexes[] = {.  
1250: 20 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f    SQLITE3_MUTEX_
1260: 49 4e 49 54 49 41 4c 49 5a 45 52 2c 0a 20 20 20  INITIALIZER,.   
1270: 20 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49   SQLITE3_MUTEX_I
1280: 4e 49 54 49 41 4c 49 5a 45 52 2c 0a 20 20 20 20  NITIALIZER,.    
1290: 53 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e  SQLITE3_MUTEX_IN
12a0: 49 54 49 41 4c 49 5a 45 52 2c 0a 20 20 20 20 53  ITIALIZER,.    S
12b0: 51 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49  QLITE3_MUTEX_INI
12c0: 54 49 41 4c 49 5a 45 52 2c 0a 20 20 20 20 53 51  TIALIZER,.    SQ
12d0: 4c 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54  LITE3_MUTEX_INIT
12e0: 49 41 4c 49 5a 45 52 2c 0a 20 20 20 20 53 51 4c  IALIZER,.    SQL
12f0: 49 54 45 33 5f 4d 55 54 45 58 5f 49 4e 49 54 49  ITE3_MUTEX_INITI
1300: 41 4c 49 5a 45 52 0a 20 20 7d 3b 0a 20 20 73 71  ALIZER.  };.  sq
1310: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 3b 0a  lite3_mutex *p;.
1320: 20 20 73 77 69 74 63 68 28 20 69 54 79 70 65 20    switch( iType 
1330: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1340: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1350: 56 45 3a 20 7b 0a 20 20 20 20 20 20 70 20 3d 20  VE: {.      p = 
1360: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1370: 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  o( sizeof(*p) );
1380: 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a  .      if( p ){.
1390: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 4f  #ifdef SQLITE_HO
13a0: 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52 53 49 56  MEGROWN_RECURSIV
13b0: 45 5f 4d 55 54 45 58 0a 20 20 20 20 20 20 20 20  E_MUTEX.        
13c0: 2f 2a 20 49 66 20 72 65 63 75 72 73 69 76 65 20  /* If recursive 
13d0: 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20  mutexes are not 
13e0: 61 76 61 69 6c 61 62 6c 65 2c 20 77 65 20 77 69  available, we wi
13f0: 6c 6c 20 68 61 76 65 20 74 6f 0a 20 20 20 20 20  ll have to.     
1400: 20 20 20 2a 2a 20 62 75 69 6c 64 20 6f 75 72 20     ** build our 
1410: 6f 77 6e 2e 20 20 53 65 65 20 62 65 6c 6f 77 2e  own.  See below.
1420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 74 68 72   */.        pthr
1430: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
1440: 70 2d 3e 6d 75 74 65 78 2c 20 30 29 3b 0a 23 65  p->mutex, 0);.#e
1450: 6c 73 65 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  lse.        /* U
1460: 73 65 20 61 20 72 65 63 75 72 73 69 76 65 20 6d  se a recursive m
1470: 75 74 65 78 20 69 66 20 69 74 20 69 73 20 61 76  utex if it is av
1480: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ailable */.     
1490: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
14a0: 61 74 74 72 5f 74 20 72 65 63 75 72 73 69 76 65  attr_t recursive
14b0: 41 74 74 72 3b 0a 20 20 20 20 20 20 20 20 70 74  Attr;.        pt
14c0: 68 72 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f  hread_mutexattr_
14d0: 69 6e 69 74 28 26 72 65 63 75 72 73 69 76 65 41  init(&recursiveA
14e0: 74 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 74  ttr);.        pt
14f0: 68 72 65 61 64 5f 6d 75 74 65 78 61 74 74 72 5f  hread_mutexattr_
1500: 73 65 74 74 79 70 65 28 26 72 65 63 75 72 73 69  settype(&recursi
1510: 76 65 41 74 74 72 2c 20 50 54 48 52 45 41 44 5f  veAttr, PTHREAD_
1520: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
1530: 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61  ;.        pthrea
1540: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 70 2d  d_mutex_init(&p-
1550: 3e 6d 75 74 65 78 2c 20 26 72 65 63 75 72 73 69  >mutex, &recursi
1560: 76 65 41 74 74 72 29 3b 0a 20 20 20 20 20 20 20  veAttr);.       
1570: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 61 74   pthread_mutexat
1580: 74 72 5f 64 65 73 74 72 6f 79 28 26 72 65 63 75  tr_destroy(&recu
1590: 72 73 69 76 65 41 74 74 72 29 3b 0a 23 65 6e 64  rsiveAttr);.#end
15a0: 69 66 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 64  if.        p->id
15b0: 20 3d 20 69 54 79 70 65 3b 0a 20 20 20 20 20 20   = iType;.      
15c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
15d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
15e0: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 3a  LITE_MUTEX_FAST:
15f0: 20 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c   {.      p = sql
1600: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1610: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1620: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
1630: 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 54 79       p->id = iTy
1640: 70 65 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72  pe;.        pthr
1650: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
1660: 70 2d 3e 6d 75 74 65 78 2c 20 30 29 3b 0a 20 20  p->mutex, 0);.  
1670: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1680: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
1690: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
16a0: 73 65 72 74 28 20 69 54 79 70 65 2d 32 20 3e 3d  sert( iType-2 >=
16b0: 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0 );.      asse
16c0: 72 74 28 20 69 54 79 70 65 2d 32 20 3c 20 41 72  rt( iType-2 < Ar
16d0: 72 61 79 53 69 7a 65 28 73 74 61 74 69 63 4d 75  raySize(staticMu
16e0: 74 65 78 65 73 29 20 29 3b 0a 20 20 20 20 20 20  texes) );.      
16f0: 70 20 3d 20 26 73 74 61 74 69 63 4d 75 74 65 78  p = &staticMutex
1700: 65 73 5b 69 54 79 70 65 2d 32 5d 3b 0a 20 20 20  es[iType-2];.   
1710: 20 20 20 70 2d 3e 69 64 20 3d 20 69 54 79 70 65     p->id = iType
1720: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1740: 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n p;.}.../*.** T
1750: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 61 6c  his routine deal
1760: 6c 6f 63 61 74 65 73 20 61 20 70 72 65 76 69 6f  locates a previo
1770: 75 73 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  usly.** allocate
1780: 64 20 6d 75 74 65 78 2e 20 20 53 51 4c 69 74 65  d mutex.  SQLite
1790: 20 69 73 20 63 61 72 65 66 75 6c 20 74 6f 20 64   is careful to d
17a0: 65 61 6c 6c 6f 63 61 74 65 20 65 76 65 72 79 0a  eallocate every.
17b0: 2a 2a 20 6d 75 74 65 78 20 74 68 61 74 20 69 74  ** mutex that it
17c0: 20 61 6c 6c 6f 63 61 74 65 73 2e 0a 2a 2f 0a 73   allocates..*/.s
17d0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 68 72 65  tatic void pthre
17e0: 61 64 4d 75 74 65 78 46 72 65 65 28 73 71 6c 69  adMutexFree(sqli
17f0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20  te3_mutex *p){. 
1800: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
1810: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1820: 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d   p->id==SQLITE_M
1830: 55 54 45 58 5f 46 41 53 54 20 7c 7c 20 70 2d 3e  UTEX_FAST || p->
1840: 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58  id==SQLITE_MUTEX
1850: 5f 52 45 43 55 52 53 49 56 45 20 29 3b 0a 20 20  _RECURSIVE );.  
1860: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 64 65  pthread_mutex_de
1870: 73 74 72 6f 79 28 26 70 2d 3e 6d 75 74 65 78 29  stroy(&p->mutex)
1880: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1890: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
18a0: 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e sqlite3_mutex_
18b0: 65 6e 74 65 72 28 29 20 61 6e 64 20 73 71 6c 69  enter() and sqli
18c0: 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29 20  te3_mutex_try() 
18d0: 72 6f 75 74 69 6e 65 73 20 61 74 74 65 6d 70 74  routines attempt
18e0: 0a 2a 2a 20 74 6f 20 65 6e 74 65 72 20 61 20 6d  .** to enter a m
18f0: 75 74 65 78 2e 20 20 49 66 20 61 6e 6f 74 68 65  utex.  If anothe
1900: 72 20 74 68 72 65 61 64 20 69 73 20 61 6c 72 65  r thread is alre
1910: 61 64 79 20 77 69 74 68 69 6e 20 74 68 65 20 6d  ady within the m
1920: 75 74 65 78 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  utex,.** sqlite3
1930: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20 77  _mutex_enter() w
1940: 69 6c 6c 20 62 6c 6f 63 6b 20 61 6e 64 20 73 71  ill block and sq
1950: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
1960: 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a  ) will return.**
1970: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
1980: 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  he sqlite3_mutex
1990: 5f 74 72 79 28 29 20 69 6e 74 65 72 66 61 63 65  _try() interface
19a0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
19b0: 4f 4b 0a 2a 2a 20 75 70 6f 6e 20 73 75 63 63 65  OK.** upon succe
19c0: 73 73 66 75 6c 20 65 6e 74 72 79 2e 20 20 4d 75  ssful entry.  Mu
19d0: 74 65 78 65 73 20 63 72 65 61 74 65 64 20 75 73  texes created us
19e0: 69 6e 67 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  ing SQLITE_MUTEX
19f0: 5f 52 45 43 55 52 53 49 56 45 20 63 61 6e 0a 2a  _RECURSIVE can.*
1a00: 2a 20 62 65 20 65 6e 74 65 72 65 64 20 6d 75 6c  * be entered mul
1a10: 74 69 70 6c 65 20 74 69 6d 65 73 20 62 79 20 74  tiple times by t
1a20: 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e 20  he same thread. 
1a30: 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74   In such cases t
1a40: 68 65 2c 0a 2a 2a 20 6d 75 74 65 78 20 6d 75 73  he,.** mutex mus
1a50: 74 20 62 65 20 65 78 69 74 65 64 20 61 6e 20 65  t be exited an e
1a60: 71 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74  qual number of t
1a70: 69 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f 74  imes before anot
1a80: 68 65 72 20 74 68 72 65 61 64 0a 2a 2a 20 63 61  her thread.** ca
1a90: 6e 20 65 6e 74 65 72 2e 20 20 49 66 20 74 68 65  n enter.  If the
1aa0: 20 73 61 6d 65 20 74 68 72 65 61 64 20 74 72 69   same thread tri
1ab0: 65 73 20 74 6f 20 65 6e 74 65 72 20 61 6e 79 20  es to enter any 
1ac0: 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 6d 75  other kind of mu
1ad0: 74 65 78 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  tex.** more than
1ae0: 20 6f 6e 63 65 2c 20 74 68 65 20 62 65 68 61 76   once, the behav
1af0: 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ior is undefined
1b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b10: 20 70 74 68 72 65 61 64 4d 75 74 65 78 45 6e 74   pthreadMutexEnt
1b20: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
1b30: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
1b40: 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55  p->id==SQLITE_MU
1b50: 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c 7c  TEX_RECURSIVE ||
1b60: 20 70 74 68 72 65 61 64 4d 75 74 65 78 4e 6f 74   pthreadMutexNot
1b70: 68 65 6c 64 28 70 29 20 29 3b 0a 0a 23 69 66 64  held(p) );..#ifd
1b80: 65 66 20 53 51 4c 49 54 45 5f 48 4f 4d 45 47 52  ef SQLITE_HOMEGR
1b90: 4f 57 4e 5f 52 45 43 55 52 53 49 56 45 5f 4d 55  OWN_RECURSIVE_MU
1ba0: 54 45 58 0a 20 20 2f 2a 20 49 66 20 72 65 63 75  TEX.  /* If recu
1bb0: 72 73 69 76 65 20 6d 75 74 65 78 65 73 20 61 72  rsive mutexes ar
1bc0: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  e not available,
1bd0: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
1be0: 20 67 72 6f 77 0a 20 20 2a 2a 20 6f 75 72 20 6f   grow.  ** our o
1bf0: 77 6e 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  wn.  This implem
1c00: 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  entation assumes
1c10: 20 74 68 61 74 20 70 74 68 72 65 61 64 5f 65 71   that pthread_eq
1c20: 75 61 6c 28 29 0a 20 20 2a 2a 20 69 73 20 61 74  ual().  ** is at
1c30: 6f 6d 69 63 20 2d 20 74 68 61 74 20 69 74 20 63  omic - that it c
1c40: 61 6e 6e 6f 74 20 62 65 20 64 65 63 65 69 76 65  annot be deceive
1c50: 64 20 69 6e 74 6f 20 74 68 69 6e 6b 69 6e 67 20  d into thinking 
1c60: 73 65 6c 66 0a 20 20 2a 2a 20 61 6e 64 20 70 2d  self.  ** and p-
1c70: 3e 6f 77 6e 65 72 20 61 72 65 20 65 71 75 61 6c  >owner are equal
1c80: 20 69 66 20 70 2d 3e 6f 77 6e 65 72 20 63 68 61   if p->owner cha
1c90: 6e 67 65 73 20 62 65 74 77 65 65 6e 20 74 77 6f  nges between two
1ca0: 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 74 68 61   values.  ** tha
1cb0: 74 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20  t are not equal 
1cc0: 74 6f 20 73 65 6c 66 20 77 68 69 6c 65 20 74 68  to self while th
1cd0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1ce0: 74 61 6b 69 6e 67 20 70 6c 61 63 65 2e 0a 20 20  taking place..  
1cf0: 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  ** This implemen
1d00: 74 61 74 69 6f 6e 20 61 6c 73 6f 20 61 73 73 75  tation also assu
1d10: 6d 65 73 20 61 20 63 6f 68 65 72 65 6e 74 20 63  mes a coherent c
1d20: 61 63 68 65 20 2d 20 74 68 61 74 20 0a 20 20 2a  ache - that .  *
1d30: 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
1d40: 73 73 65 73 20 63 61 6e 6e 6f 74 20 72 65 61 64  sses cannot read
1d50: 20 64 69 66 66 65 72 65 6e 74 20 76 61 6c 75 65   different value
1d60: 73 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  s from the same.
1d70: 20 20 2a 2a 20 61 64 64 72 65 73 73 20 61 74 20    ** address at 
1d80: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
1d90: 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
1da0: 73 65 20 74 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  se two condition
1db0: 73 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 6d  s.  ** are not m
1dc0: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6d 75 74  et, then the mut
1dd0: 65 78 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 61  exes will fail a
1de0: 6e 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 6c 6c  nd problems will
1df0: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
1e00: 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 74 20  {.    pthread_t 
1e10: 73 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73  self = pthread_s
1e20: 65 6c 66 28 29 3b 0a 20 20 20 20 69 66 28 20 70  elf();.    if( p
1e30: 2d 3e 6e 52 65 66 3e 30 20 26 26 20 70 74 68 72  ->nRef>0 && pthr
1e40: 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e 6f 77 6e  ead_equal(p->own
1e50: 65 72 2c 20 73 65 6c 66 29 20 29 7b 0a 20 20 20  er, self) ){.   
1e60: 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20     p->nRef++;.  
1e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e80: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
1e90: 6b 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  k(&p->mutex);.  
1ea0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
1eb0: 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
1ec0: 70 2d 3e 6f 77 6e 65 72 20 3d 20 73 65 6c 66 3b  p->owner = self;
1ed0: 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  .      p->nRef =
1ee0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
1ef0: 6c 73 65 0a 20 20 2f 2a 20 55 73 65 20 74 68 65  lse.  /* Use the
1f00: 20 62 75 69 6c 74 2d 69 6e 20 72 65 63 75 72 73   built-in recurs
1f10: 69 76 65 20 6d 75 74 65 78 65 73 20 69 66 20 74  ive mutexes if t
1f20: 68 65 79 20 61 72 65 20 61 76 61 69 6c 61 62 6c  hey are availabl
1f30: 65 2e 0a 20 20 2a 2f 0a 20 20 70 74 68 72 65 61  e..  */.  pthrea
1f40: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d  d_mutex_lock(&p-
1f50: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 6f 77  >mutex);.  p->ow
1f60: 6e 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73 65  ner = pthread_se
1f70: 6c 66 28 29 3b 0a 20 20 70 2d 3e 6e 52 65 66 2b  lf();.  p->nRef+
1f80: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  +;.#endif..#ifde
1f90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1fa0: 20 69 66 28 20 70 2d 3e 74 72 61 63 65 20 29 7b   if( p->trace ){
1fb0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 65 6e 74  .    printf("ent
1fc0: 65 72 20 6d 75 74 65 78 20 25 70 20 28 25 64 29  er mutex %p (%d)
1fd0: 20 77 69 74 68 20 6e 52 65 66 3d 25 64 5c 6e 22   with nRef=%d\n"
1fe0: 2c 20 70 2c 20 70 2d 3e 74 72 61 63 65 2c 20 70  , p, p->trace, p
1ff0: 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 23 65 6e  ->nRef);.  }.#en
2000: 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  dif.}.static int
2010: 20 70 74 68 72 65 61 64 4d 75 74 65 78 54 72 79   pthreadMutexTry
2020: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
2030: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
2040: 61 73 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53  assert( p->id==S
2050: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
2060: 52 53 49 56 45 20 7c 7c 20 70 74 68 72 65 61 64  RSIVE || pthread
2070: 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 29 20  MutexNotheld(p) 
2080: 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
2090: 45 5f 48 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55  E_HOMEGROWN_RECU
20a0: 52 53 49 56 45 5f 4d 55 54 45 58 0a 20 20 2f 2a  RSIVE_MUTEX.  /*
20b0: 20 49 66 20 72 65 63 75 72 73 69 76 65 20 6d 75   If recursive mu
20c0: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 61 76  texes are not av
20d0: 61 69 6c 61 62 6c 65 2c 20 74 68 65 6e 20 77 65  ailable, then we
20e0: 20 68 61 76 65 20 74 6f 20 67 72 6f 77 0a 20 20   have to grow.  
20f0: 2a 2a 20 6f 75 72 20 6f 77 6e 2e 20 20 54 68 69  ** our own.  Thi
2100: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
2110: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 70 74   assumes that pt
2120: 68 72 65 61 64 5f 65 71 75 61 6c 28 29 0a 20 20  hread_equal().  
2130: 2a 2a 20 69 73 20 61 74 6f 6d 69 63 20 2d 20 74  ** is atomic - t
2140: 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
2150: 20 64 65 63 65 69 76 65 64 20 69 6e 74 6f 20 74   deceived into t
2160: 68 69 6e 6b 69 6e 67 20 73 65 6c 66 0a 20 20 2a  hinking self.  *
2170: 2a 20 61 6e 64 20 70 2d 3e 6f 77 6e 65 72 20 61  * and p->owner a
2180: 72 65 20 65 71 75 61 6c 20 69 66 20 70 2d 3e 6f  re equal if p->o
2190: 77 6e 65 72 20 63 68 61 6e 67 65 73 20 62 65 74  wner changes bet
21a0: 77 65 65 6e 20 74 77 6f 20 76 61 6c 75 65 73 0a  ween two values.
21b0: 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f    ** that are no
21c0: 74 20 65 71 75 61 6c 20 74 6f 20 73 65 6c 66 20  t equal to self 
21d0: 77 68 69 6c 65 20 74 68 65 20 63 6f 6d 70 61 72  while the compar
21e0: 69 73 6f 6e 20 69 73 20 74 61 6b 69 6e 67 20 70  ison is taking p
21f0: 6c 61 63 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lace..  ** This 
2200: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
2210: 6c 73 6f 20 61 73 73 75 6d 65 73 20 61 20 63 6f  lso assumes a co
2220: 68 65 72 65 6e 74 20 63 61 63 68 65 20 2d 20 74  herent cache - t
2230: 68 61 74 20 0a 20 20 2a 2a 20 73 65 70 61 72 61  hat .  ** separa
2240: 74 65 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  te processes can
2250: 6e 6f 74 20 72 65 61 64 20 64 69 66 66 65 72 65  not read differe
2260: 6e 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  nt values from t
2270: 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 61 64 64  he same.  ** add
2280: 72 65 73 73 20 61 74 20 74 68 65 20 73 61 6d 65  ress at the same
2290: 20 74 69 6d 65 2e 20 20 49 66 20 65 69 74 68 65   time.  If eithe
22a0: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 63  r of these two c
22b0: 6f 6e 64 69 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  onditions.  ** a
22c0: 72 65 20 6e 6f 74 20 6d 65 74 2c 20 74 68 65 6e  re not met, then
22d0: 20 74 68 65 20 6d 75 74 65 78 65 73 20 77 69 6c   the mutexes wil
22e0: 6c 20 66 61 69 6c 20 61 6e 64 20 70 72 6f 62 6c  l fail and probl
22f0: 65 6d 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ems will result.
2300: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 70 74  .  */.  {.    pt
2310: 68 72 65 61 64 5f 74 20 73 65 6c 66 20 3d 20 70  hread_t self = p
2320: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20  thread_self();. 
2330: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3e 30     if( p->nRef>0
2340: 20 26 26 20 70 74 68 72 65 61 64 5f 65 71 75 61   && pthread_equa
2350: 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 73 65 6c 66  l(p->owner, self
2360: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 52  ) ){.      p->nR
2370: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  ef++;.      rc =
2380: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2390: 7d 65 6c 73 65 20 69 66 28 20 70 74 68 72 65 61  }else if( pthrea
23a0: 64 5f 6d 75 74 65 78 5f 74 72 79 6c 6f 63 6b 28  d_mutex_trylock(
23b0: 26 70 2d 3e 6d 75 74 65 78 29 3d 3d 30 20 29 7b  &p->mutex)==0 ){
23c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23d0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
23e0: 20 20 20 70 2d 3e 6f 77 6e 65 72 20 3d 20 73 65     p->owner = se
23f0: 6c 66 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65  lf;.      p->nRe
2400: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  f = 1;.      rc 
2410: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2430: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
2440: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
2450: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 62 75 69    /* Use the bui
2460: 6c 74 2d 69 6e 20 72 65 63 75 72 73 69 76 65 20  lt-in recursive 
2470: 6d 75 74 65 78 65 73 20 69 66 20 74 68 65 79 20  mutexes if they 
2480: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20  are available.. 
2490: 20 2a 2f 0a 20 20 69 66 28 20 70 74 68 72 65 61   */.  if( pthrea
24a0: 64 5f 6d 75 74 65 78 5f 74 72 79 6c 6f 63 6b 28  d_mutex_trylock(
24b0: 26 70 2d 3e 6d 75 74 65 78 29 3d 3d 30 20 29 7b  &p->mutex)==0 ){
24c0: 0a 20 20 20 20 70 2d 3e 6f 77 6e 65 72 20 3d 20  .    p->owner = 
24d0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a  pthread_self();.
24e0: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
24f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2500: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
2520: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
2530: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2540: 47 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  G.  if( rc==SQLI
2550: 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 74 72 61 63  TE_OK && p->trac
2560: 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
2570: 22 65 6e 74 65 72 20 6d 75 74 65 78 20 25 70 20  "enter mutex %p 
2580: 28 25 64 29 20 77 69 74 68 20 6e 52 65 66 3d 25  (%d) with nRef=%
2590: 64 5c 6e 22 2c 20 70 2c 20 70 2d 3e 74 72 61 63  d\n", p, p->trac
25a0: 65 2c 20 70 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d  e, p->nRef);.  }
25b0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
25c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
25d0: 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e sqlite3_mutex_
25e0: 6c 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65 20  leave() routine 
25f0: 65 78 69 74 73 20 61 20 6d 75 74 65 78 20 74 68  exits a mutex th
2600: 61 74 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  at was.** previo
2610: 75 73 6c 79 20 65 6e 74 65 72 65 64 20 62 79 20  usly entered by 
2620: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e  the same thread.
2630: 20 20 54 68 65 20 62 65 68 61 76 69 6f 72 0a 2a    The behavior.*
2640: 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  * is undefined i
2650: 66 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 6e  f the mutex is n
2660: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 65 6e 74  ot currently ent
2670: 65 72 65 64 20 6f 72 0a 2a 2a 20 69 73 20 6e 6f  ered or.** is no
2680: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f  t currently allo
2690: 63 61 74 65 64 2e 20 20 53 51 4c 69 74 65 20 77  cated.  SQLite w
26a0: 69 6c 6c 20 6e 65 76 65 72 20 64 6f 20 65 69 74  ill never do eit
26b0: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  her..*/.static v
26c0: 6f 69 64 20 70 74 68 72 65 61 64 4d 75 74 65 78  oid pthreadMutex
26d0: 4c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  Leave(sqlite3_mu
26e0: 74 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  tex *p){.  asser
26f0: 74 28 20 70 74 68 72 65 61 64 4d 75 74 65 78 48  t( pthreadMutexH
2700: 65 6c 64 28 70 29 20 29 3b 0a 20 20 70 2d 3e 6e  eld(p) );.  p->n
2710: 52 65 66 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28  Ref--;.  assert(
2720: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70   p->nRef==0 || p
2730: 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54  ->id==SQLITE_MUT
2740: 45 58 5f 52 45 43 55 52 53 49 56 45 20 29 3b 0a  EX_RECURSIVE );.
2750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2760: 4f 4d 45 47 52 4f 57 4e 5f 52 45 43 55 52 53 49  OMEGROWN_RECURSI
2770: 56 45 5f 4d 55 54 45 58 0a 20 20 69 66 28 20 70  VE_MUTEX.  if( p
2780: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2790: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
27a0: 6e 6c 6f 63 6b 28 26 70 2d 3e 6d 75 74 65 78 29  nlock(&p->mutex)
27b0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 74  ;.  }.#else.  pt
27c0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
27d0: 63 6b 28 26 70 2d 3e 6d 75 74 65 78 29 3b 0a 23  ck(&p->mutex);.#
27e0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
27f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
2800: 20 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20 20 20   p->trace ){.   
2810: 20 70 72 69 6e 74 66 28 22 6c 65 61 76 65 20 6d   printf("leave m
2820: 75 74 65 78 20 25 70 20 28 25 64 29 20 77 69 74  utex %p (%d) wit
2830: 68 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 70 2c  h nRef=%d\n", p,
2840: 20 70 2d 3e 74 72 61 63 65 2c 20 70 2d 3e 6e 52   p->trace, p->nR
2850: 65 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ef);.  }.#endif.
2860: 7d 0a 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  }..sqlite3_mutex
2870: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
2880: 33 44 65 66 61 75 6c 74 4d 75 74 65 78 28 76 6f  3DefaultMutex(vo
2890: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
28a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
28b0: 6f 64 73 20 73 4d 75 74 65 78 20 3d 20 7b 0a 20  ods sMutex = {. 
28c0: 20 20 20 70 74 68 72 65 61 64 4d 75 74 65 78 49     pthreadMutexI
28d0: 6e 69 74 2c 0a 20 20 20 20 70 74 68 72 65 61 64  nit,.    pthread
28e0: 4d 75 74 65 78 45 6e 64 2c 0a 20 20 20 20 70 74  MutexEnd,.    pt
28f0: 68 72 65 61 64 4d 75 74 65 78 41 6c 6c 6f 63 2c  hreadMutexAlloc,
2900: 0a 20 20 20 20 70 74 68 72 65 61 64 4d 75 74 65  .    pthreadMute
2910: 78 46 72 65 65 2c 0a 20 20 20 20 70 74 68 72 65  xFree,.    pthre
2920: 61 64 4d 75 74 65 78 45 6e 74 65 72 2c 0a 20 20  adMutexEnter,.  
2930: 20 20 70 74 68 72 65 61 64 4d 75 74 65 78 54 72    pthreadMutexTr
2940: 79 2c 0a 20 20 20 20 70 74 68 72 65 61 64 4d 75  y,.    pthreadMu
2950: 74 65 78 4c 65 61 76 65 2c 0a 23 69 66 64 65 66  texLeave,.#ifdef
2960: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2970: 20 20 70 74 68 72 65 61 64 4d 75 74 65 78 48 65    pthreadMutexHe
2980: 6c 64 2c 0a 20 20 20 20 70 74 68 72 65 61 64 4d  ld,.    pthreadM
2990: 75 74 65 78 4e 6f 74 68 65 6c 64 0a 23 65 6e 64  utexNotheld.#end
29a0: 69 66 0a 20 20 7d 3b 0a 0a 20 20 72 65 74 75 72  if.  };..  retur
29b0: 6e 20 26 73 4d 75 74 65 78 3b 0a 7d 0a 0a 23 65  n &sMutex;.}..#e
29c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
29d0: 55 54 45 58 5f 50 54 48 52 45 41 44 20 2a 2f 0a  UTEX_PTHREAD */.