/ Hex Artifact Content
Login

Artifact 9cf641f556a4119ef90ed41b82f2d5647f81686e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 14.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20   contains the C 
0190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
01a0: 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 65 78 65 73  mplement mutexes
01b0: 20 66 6f 72 0a 2a 2a 20 75 73 65 20 62 79 20 74   for.** use by t
01c0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a  he SQLite core..
01d0: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 75 74 65 78  **.** $Id: mutex
01e0: 2e 63 2c 76 20 31 2e 38 20 32 30 30 37 2f 30 38  .c,v 1.8 2007/08
01f0: 2f 32 32 20 30 32 3a 35 36 3a 34 34 20 64 72 68  /22 02:56:44 drh
0200: 20 45 78 70 20 24 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   Exp $.*/./*.** 
0210: 49 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  If SQLITE_MUTEX_
0220: 41 50 50 44 45 46 20 69 73 20 64 65 66 69 6e 65  APPDEF is define
0230: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 77 68 6f  d, then this who
0240: 6c 65 20 6d 6f 64 75 6c 65 20 69 73 0a 2a 2a 20  le module is.** 
0250: 6f 6d 69 74 74 65 64 20 61 6e 64 20 65 71 75 69  omitted and equi
0260: 76 61 6c 65 6e 74 20 66 75 6e 63 74 69 6f 6e 61  valent functiona
0270: 6c 69 74 79 20 6d 75 73 74 20 62 65 20 70 72 6f  lity must be pro
0280: 76 69 64 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  vided by the.** 
0290: 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 68 61 74  application that
02a0: 20 6c 69 6e 6b 73 20 61 67 61 69 6e 73 74 20 74   links against t
02b0: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
02c0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
02d0: 4c 49 54 45 5f 4d 55 54 45 58 5f 41 50 50 44 45  LITE_MUTEX_APPDE
02e0: 46 0a 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74  F.../* This is t
02f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
0300: 72 65 61 6c 20 63 6f 64 65 0a 2a 2f 0a 23 69 6e  real code.*/.#in
0310: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0320: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 46 69 67 75 72  .h"../*.** Figur
0330: 65 20 6f 75 74 20 77 68 61 74 20 76 65 72 73 69  e out what versi
0340: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  on of the code t
0350: 6f 20 75 73 65 0a 2a 2f 0a 23 64 65 66 69 6e 65  o use.*/.#define
0360: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
0370: 4f 50 20 31 20 20 20 2f 2a 20 54 68 65 20 64 65  OP 1   /* The de
0380: 66 61 75 6c 74 20 2a 2f 0a 23 69 66 20 64 65 66  fault */.#if def
0390: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
03a0: 47 29 20 26 26 20 21 53 51 4c 49 54 45 5f 54 48  G) && !SQLITE_TH
03b0: 52 45 41 44 53 41 46 45 0a 23 20 75 6e 64 65 66  READSAFE.# undef
03c0: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
03d0: 4f 50 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  OP.# define SQLI
03e0: 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 5f 44 45  TE_MUTEX_NOOP_DE
03f0: 42 55 47 0a 23 65 6e 64 69 66 0a 23 69 66 20 30  BUG.#endif.#if 0
0400: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0410: 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 29 20  ITE_MUTEX_NOOP) 
0420: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
0430: 53 41 46 45 20 26 26 20 4f 53 5f 55 4e 49 58 0a  SAFE && OS_UNIX.
0440: 23 20 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  # undef SQLITE_M
0450: 55 54 45 58 5f 4e 4f 4f 50 0a 23 20 64 65 66 69  UTEX_NOOP.# defi
0460: 6e 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ne SQLITE_MUTEX_
0470: 50 54 48 52 45 41 44 0a 23 65 6e 64 69 66 0a 23  PTHREAD.#endif.#
0480: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0490: 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 29 20 26 26  E_MUTEX_NOOP) &&
04a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
04b0: 46 45 20 26 26 20 4f 53 5f 57 49 4e 0a 23 20 75  FE && OS_WIN.# u
04c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45  ndef SQLITE_MUTE
04d0: 58 5f 4e 4f 4f 50 0a 23 20 64 65 66 69 6e 65 20  X_NOOP.# define 
04e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 57 49 4e  SQLITE_MUTEX_WIN
04f0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
0500: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0510: 4d 55 54 45 58 5f 4e 4f 4f 50 0a 2f 2a 2a 2a 2a  MUTEX_NOOP./****
0520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0530: 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4d 75 74 65 78  **** No-op Mutex
0540: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
0550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0560: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
0570: 73 20 66 69 72 73 74 20 69 6d 70 6c 65 6d 65 6e  s first implemen
0580: 74 61 74 69 6f 6e 20 6f 66 20 6d 75 74 65 78 65  tation of mutexe
0590: 73 20 69 73 20 72 65 61 6c 6c 79 20 61 20 6e 6f  s is really a no
05a0: 2d 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  -op.  In other w
05b0: 6f 72 64 73 2c 0a 2a 2a 20 6e 6f 20 72 65 61 6c  ords,.** no real
05c0: 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 2e   locking occurs.
05d0: 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74    This implement
05e0: 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
05f0: 69 61 74 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20  iate for use.** 
0600: 69 6e 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64  in single thread
0610: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ed applications 
0620: 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 77 61 6e  which do not wan
0630: 74 20 74 68 65 20 65 78 74 72 61 20 6f 76 65 72  t the extra over
0640: 68 65 61 64 0a 2a 2a 20 6f 66 20 74 68 72 65 61  head.** of threa
0650: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  d locking primit
0660: 69 76 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ives..*/../*.** 
0670: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  The sqlite3_mute
0680: 78 5f 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e  x_alloc() routin
0690: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  e allocates a ne
06a0: 77 0a 2a 2a 20 6d 75 74 65 78 20 61 6e 64 20 72  w.** mutex and r
06b0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
06c0: 20 74 6f 20 69 74 2e 20 20 49 66 20 69 74 20 72   to it.  If it r
06d0: 65 74 75 72 6e 73 20 4e 55 4c 4c 0a 2a 2a 20 74  eturns NULL.** t
06e0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
06f0: 20 6d 75 74 65 78 20 63 6f 75 6c 64 20 6e 6f 74   mutex could not
0700: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a   be allocated. .
0710: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
0720: 20 2a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f   *sqlite3_mutex_
0730: 61 6c 6c 6f 63 28 69 6e 74 20 69 64 4e 6f 74 55  alloc(int idNotU
0740: 73 65 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  sed){.  return (
0750: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 2a 29 38  sqlite3_mutex*)8
0760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0770: 72 6f 75 74 69 6e 65 20 64 65 61 6c 6c 6f 63 61  routine dealloca
0780: 74 65 73 20 61 20 70 72 65 76 69 6f 75 73 6c 79  tes a previously
0790: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 75 74 65 78   allocated mutex
07a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
07b0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
07c0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4e 6f 74  ite3_mutex *pNot
07d0: 55 73 65 64 29 7b 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Used){}../*.** T
07e0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  he sqlite3_mutex
07f0: 5f 65 6e 74 65 72 28 29 20 61 6e 64 20 73 71 6c  _enter() and sql
0800: 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29  ite3_mutex_try()
0810: 20 72 6f 75 74 69 6e 65 73 20 61 74 74 65 6d 70   routines attemp
0820: 74 0a 2a 2a 20 74 6f 20 65 6e 74 65 72 20 61 20  t.** to enter a 
0830: 6d 75 74 65 78 2e 20 20 49 66 20 61 6e 6f 74 68  mutex.  If anoth
0840: 65 72 20 74 68 72 65 61 64 20 69 73 20 61 6c 72  er thread is alr
0850: 65 61 64 79 20 77 69 74 68 69 6e 20 74 68 65 20  eady within the 
0860: 6d 75 74 65 78 2c 0a 2a 2a 20 73 71 6c 69 74 65  mutex,.** sqlite
0870: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20  3_mutex_enter() 
0880: 77 69 6c 6c 20 62 6c 6f 63 6b 20 61 6e 64 20 73  will block and s
0890: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79  qlite3_mutex_try
08a0: 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  () will return.*
08b0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  * SQLITE_BUSY.  
08c0: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  The sqlite3_mute
08d0: 78 5f 74 72 79 28 29 20 69 6e 74 65 72 66 61 63  x_try() interfac
08e0: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
08f0: 5f 4f 4b 0a 2a 2a 20 75 70 6f 6e 20 73 75 63 63  _OK.** upon succ
0900: 65 73 73 66 75 6c 20 65 6e 74 72 79 2e 20 20 4d  essful entry.  M
0910: 75 74 65 78 65 73 20 63 72 65 61 74 65 64 20 75  utexes created u
0920: 73 69 6e 67 20 53 51 4c 49 54 45 5f 4d 55 54 45  sing SQLITE_MUTE
0930: 58 5f 52 45 43 55 52 53 49 56 45 20 63 61 6e 0a  X_RECURSIVE can.
0940: 2a 2a 20 62 65 20 65 6e 74 65 72 65 64 20 6d 75  ** be entered mu
0950: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 62 79 20  ltiple times by 
0960: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e  the same thread.
0970: 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20    In such cases 
0980: 74 68 65 2c 0a 2a 2a 20 6d 75 74 65 78 20 6d 75  the,.** mutex mu
0990: 73 74 20 62 65 20 65 78 69 74 65 64 20 61 6e 20  st be exited an 
09a0: 65 71 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  equal number of 
09b0: 74 69 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f  times before ano
09c0: 74 68 65 72 20 74 68 72 65 61 64 0a 2a 2a 20 63  ther thread.** c
09d0: 61 6e 20 65 6e 74 65 72 2e 20 20 49 66 20 74 68  an enter.  If th
09e0: 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 74 72  e same thread tr
09f0: 69 65 73 20 74 6f 20 65 6e 74 65 72 20 61 6e 79  ies to enter any
0a00: 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 6d   other kind of m
0a10: 75 74 65 78 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  utex.** more tha
0a20: 6e 20 6f 6e 63 65 2c 20 74 68 65 20 62 65 68 61  n once, the beha
0a30: 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65  vior is undefine
0a40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0a50: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
0a60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4e  qlite3_mutex *pN
0a70: 6f 74 55 73 65 64 29 7b 7d 0a 69 6e 74 20 73 71  otUsed){}.int sq
0a80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
0a90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0aa0: 4e 6f 74 55 73 65 64 29 7b 20 72 65 74 75 72 6e  NotUsed){ return
0ab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 0a 2f   SQLITE_OK; }../
0ac0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
0ad0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 29 20 72  _mutex_leave() r
0ae0: 6f 75 74 69 6e 65 20 65 78 69 74 73 20 61 20 6d  outine exits a m
0af0: 75 74 65 78 20 74 68 61 74 20 77 61 73 0a 2a 2a  utex that was.**
0b00: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 6e 74 65   previously ente
0b10: 72 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  red by the same 
0b20: 74 68 72 65 61 64 2e 20 20 54 68 65 20 62 65 68  thread.  The beh
0b30: 61 76 69 6f 72 0a 2a 2a 20 69 73 20 75 6e 64 65  avior.** is unde
0b40: 66 69 6e 65 64 20 69 66 20 74 68 65 20 6d 75 74  fined if the mut
0b50: 65 78 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  ex is not curren
0b60: 74 6c 79 20 65 6e 74 65 72 65 64 20 6f 72 0a 2a  tly entered or.*
0b70: 2a 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  * is not current
0b80: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 53  ly allocated.  S
0b90: 51 4c 69 74 65 20 77 69 6c 6c 20 6e 65 76 65 72  QLite will never
0ba0: 20 64 6f 20 65 69 74 68 65 72 2e 0a 2a 2f 0a 76   do either..*/.v
0bb0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  oid sqlite3_mute
0bc0: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
0bd0: 6d 75 74 65 78 20 2a 70 4e 6f 74 55 73 65 64 29  mutex *pNotUsed)
0be0: 7b 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  {}../*.** The sq
0bf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
0c00: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d  () and sqlite3_m
0c10: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20 72  utex_notheld() r
0c20: 6f 75 74 69 6e 65 20 61 72 65 0a 2a 2a 20 69 6e  outine are.** in
0c30: 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69  tended for use i
0c40: 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 20 73  nside assert() s
0c50: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
0c60: 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  t sqlite3_mutex_
0c70: 68 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74  held(sqlite3_mut
0c80: 65 78 20 2a 70 4e 6f 74 55 73 65 64 29 7b 0a 20  ex *pNotUsed){. 
0c90: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 69 6e 74   return 1;.}.int
0ca0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
0cb0: 6f 74 68 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d  otheld(sqlite3_m
0cc0: 75 74 65 78 20 2a 70 4e 6f 74 55 73 65 64 29 7b  utex *pNotUsed){
0cd0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
0ce0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0cf0: 4d 55 54 45 58 5f 4e 4f 4f 50 20 2a 2f 0a 0a 23  MUTEX_NOOP */..#
0d00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54  ifdef SQLITE_MUT
0d10: 45 58 5f 4e 4f 4f 50 5f 44 45 42 55 47 0a 2f 2a  EX_NOOP_DEBUG./*
0d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
0d30: 72 72 6f 72 2d 63 68 65 63 6b 69 6e 67 20 4e 6f  rror-checking No
0d40: 2d 6f 70 20 4d 75 74 65 78 20 49 6d 70 6c 65 6d  -op Mutex Implem
0d50: 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
0d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0d70: 2a 2a 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65  ** In this imple
0d80: 6d 65 6e 74 61 74 69 6f 6e 2c 20 6d 75 74 65 78  mentation, mutex
0d90: 65 73 20 64 6f 20 6e 6f 74 20 70 72 6f 76 69 64  es do not provid
0da0: 65 20 61 6e 79 20 6d 75 74 75 61 6c 20 65 78 63  e any mutual exc
0db0: 6c 75 73 69 6f 6e 2e 0a 2a 2a 20 42 75 74 20 74  lusion..** But t
0dc0: 68 65 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  he error checkin
0dd0: 67 20 69 73 20 70 72 6f 76 69 64 65 64 2e 20 20  g is provided.  
0de0: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  This implementat
0df0: 69 6f 6e 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  ion is useful.**
0e00: 20 66 6f 72 20 74 65 73 74 20 70 75 72 70 6f 73   for test purpos
0e10: 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  es..*/../*.** Th
0e20: 65 20 6d 75 74 65 78 20 6f 62 6a 65 63 74 0a 2a  e mutex object.*
0e30: 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  /.struct sqlite3
0e40: 5f 6d 75 74 65 78 20 7b 0a 20 20 69 6e 74 20 69  _mutex {.  int i
0e50: 64 3b 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 7d 3b  d;.  int cnt;.};
0e60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ../*.** The sqli
0e70: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
0e80: 29 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  ) routine alloca
0e90: 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6d 75 74  tes a new.** mut
0ea0: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ex and returns a
0eb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
0ec0: 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 4e   If it returns N
0ed0: 55 4c 4c 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  ULL.** that mean
0ee0: 73 20 74 68 61 74 20 61 20 6d 75 74 65 78 20 63  s that a mutex c
0ef0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
0f00: 63 61 74 65 64 2e 20 0a 2a 2f 0a 73 71 6c 69 74  cated. .*/.sqlit
0f10: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
0f20: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 69 6e  3_mutex_alloc(in
0f30: 74 20 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  t id){.  static 
0f40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 61 53  sqlite3_mutex aS
0f50: 74 61 74 69 63 5b 34 5d 3b 0a 20 20 73 71 6c 69  tatic[4];.  sqli
0f60: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4e 65 77 20  te3_mutex *pNew 
0f70: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 69  = 0;.  switch( i
0f80: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  d ){.    case SQ
0f90: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 3a  LITE_MUTEX_FAST:
0fa0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0fb0: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
0fc0: 3a 20 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  : {.      pNew =
0fd0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
0fe0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
0ff0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
1000: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1010: 69 64 20 3d 20 69 64 3b 0a 20 20 20 20 20 20 20  id = id;.       
1020: 20 70 4e 65 77 2d 3e 63 6e 74 20 3d 20 30 3b 0a   pNew->cnt = 0;.
1030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1040: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
1050: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1060: 61 73 73 65 72 74 28 20 69 64 2d 32 20 3e 3d 20  assert( id-2 >= 
1070: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1080: 74 28 20 69 64 2d 32 20 3c 20 73 69 7a 65 6f 66  t( id-2 < sizeof
1090: 28 61 53 74 61 74 69 63 29 2f 73 69 7a 65 6f 66  (aStatic)/sizeof
10a0: 28 61 53 74 61 74 69 63 5b 30 5d 29 20 29 3b 0a  (aStatic[0]) );.
10b0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 61 53        pNew = &aS
10c0: 74 61 74 69 63 5b 69 64 2d 32 5d 3b 0a 20 20 20  tatic[id-2];.   
10d0: 20 20 20 70 4e 65 77 2d 3e 69 64 20 3d 20 69 64     pNew->id = id
10e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1100: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
1110: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
1120: 61 6c 6c 6f 63 61 74 65 73 20 61 20 70 72 65 76  allocates a prev
1130: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
1140: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   mutex..*/.void 
1150: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
1160: 65 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ee(sqlite3_mutex
1170: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
1180: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p );.  assert( p
1190: 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  ->cnt==0 );.  as
11a0: 73 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c  sert( p->id==SQL
11b0: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20 7c  ITE_MUTEX_FAST |
11c0: 7c 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f  | p->id==SQLITE_
11d0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20  MUTEX_RECURSIVE 
11e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
11f0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(p);.}../*.** T
1200: 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  he sqlite3_mutex
1210: 5f 65 6e 74 65 72 28 29 20 61 6e 64 20 73 71 6c  _enter() and sql
1220: 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 29  ite3_mutex_try()
1230: 20 72 6f 75 74 69 6e 65 73 20 61 74 74 65 6d 70   routines attemp
1240: 74 0a 2a 2a 20 74 6f 20 65 6e 74 65 72 20 61 20  t.** to enter a 
1250: 6d 75 74 65 78 2e 20 20 49 66 20 61 6e 6f 74 68  mutex.  If anoth
1260: 65 72 20 74 68 72 65 61 64 20 69 73 20 61 6c 72  er thread is alr
1270: 65 61 64 79 20 77 69 74 68 69 6e 20 74 68 65 20  eady within the 
1280: 6d 75 74 65 78 2c 0a 2a 2a 20 73 71 6c 69 74 65  mutex,.** sqlite
1290: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20  3_mutex_enter() 
12a0: 77 69 6c 6c 20 62 6c 6f 63 6b 20 61 6e 64 20 73  will block and s
12b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79  qlite3_mutex_try
12c0: 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  () will return.*
12d0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  * SQLITE_BUSY.  
12e0: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  The sqlite3_mute
12f0: 78 5f 74 72 79 28 29 20 69 6e 74 65 72 66 61 63  x_try() interfac
1300: 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
1310: 5f 4f 4b 0a 2a 2a 20 75 70 6f 6e 20 73 75 63 63  _OK.** upon succ
1320: 65 73 73 66 75 6c 20 65 6e 74 72 79 2e 20 20 4d  essful entry.  M
1330: 75 74 65 78 65 73 20 63 72 65 61 74 65 64 20 75  utexes created u
1340: 73 69 6e 67 20 53 51 4c 49 54 45 5f 4d 55 54 45  sing SQLITE_MUTE
1350: 58 5f 52 45 43 55 52 53 49 56 45 20 63 61 6e 0a  X_RECURSIVE can.
1360: 2a 2a 20 62 65 20 65 6e 74 65 72 65 64 20 6d 75  ** be entered mu
1370: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 62 79 20  ltiple times by 
1380: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 2e  the same thread.
1390: 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20    In such cases 
13a0: 74 68 65 2c 0a 2a 2a 20 6d 75 74 65 78 20 6d 75  the,.** mutex mu
13b0: 73 74 20 62 65 20 65 78 69 74 65 64 20 61 6e 20  st be exited an 
13c0: 65 71 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  equal number of 
13d0: 74 69 6d 65 73 20 62 65 66 6f 72 65 20 61 6e 6f  times before ano
13e0: 74 68 65 72 20 74 68 72 65 61 64 0a 2a 2a 20 63  ther thread.** c
13f0: 61 6e 20 65 6e 74 65 72 2e 20 20 49 66 20 74 68  an enter.  If th
1400: 65 20 73 61 6d 65 20 74 68 72 65 61 64 20 74 72  e same thread tr
1410: 69 65 73 20 74 6f 20 65 6e 74 65 72 20 61 6e 79  ies to enter any
1420: 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20 6d   other kind of m
1430: 75 74 65 78 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  utex.** more tha
1440: 6e 20 6f 6e 63 65 2c 20 74 68 65 20 62 65 68 61  n once, the beha
1450: 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65  vior is undefine
1460: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1470: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29  qlite3_mutex *p)
1490: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  {.  assert( p );
14a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 63 6e  .  assert( p->cn
14b0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53  t==0 || p->id==S
14c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
14d0: 52 53 49 56 45 20 29 3b 0a 20 20 70 2d 3e 63 6e  RSIVE );.  p->cn
14e0: 74 2b 2b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  t++;.}.int sqlit
14f0: 65 33 5f 6d 75 74 65 78 5f 74 72 79 28 73 71 6c  e3_mutex_try(sql
1500: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
1510: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
1520: 20 69 66 28 20 70 2d 3e 63 6e 74 3e 30 20 26 26   if( p->cnt>0 &&
1530: 20 70 2d 3e 69 64 21 3d 53 51 4c 49 54 45 5f 4d   p->id!=SQLITE_M
1540: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 29  UTEX_RECURSIVE )
1550: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1560: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
1570: 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 72 65 74 75  p->cnt++;.  retu
1580: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1590: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
15a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 29  e3_mutex_leave()
15b0: 20 72 6f 75 74 69 6e 65 20 65 78 69 74 73 20 61   routine exits a
15c0: 20 6d 75 74 65 78 20 74 68 61 74 20 77 61 73 0a   mutex that was.
15d0: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65 6e  ** previously en
15e0: 74 65 72 65 64 20 62 79 20 74 68 65 20 73 61 6d  tered by the sam
15f0: 65 20 74 68 72 65 61 64 2e 20 20 54 68 65 20 62  e thread.  The b
1600: 65 68 61 76 69 6f 72 0a 2a 2a 20 69 73 20 75 6e  ehavior.** is un
1610: 64 65 66 69 6e 65 64 20 69 66 20 74 68 65 20 6d  defined if the m
1620: 75 74 65 78 20 69 73 20 6e 6f 74 20 63 75 72 72  utex is not curr
1630: 65 6e 74 6c 79 20 65 6e 74 65 72 65 64 20 6f 72  ently entered or
1640: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 75 72 72 65  .** is not curre
1650: 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20  ntly allocated. 
1660: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 65 76   SQLite will nev
1670: 65 72 20 64 6f 20 65 69 74 68 65 72 2e 0a 2a 2f  er do either..*/
1680: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 75  .void sqlite3_mu
1690: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
16a0: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61  3_mutex *p){.  a
16b0: 73 73 65 72 74 28 20 70 2d 3e 63 6e 74 3e 30 20  ssert( p->cnt>0 
16c0: 29 3b 0a 20 20 70 2d 3e 63 6e 74 2d 2d 3b 0a 7d  );.  p->cnt--;.}
16d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ../*.** The sqli
16e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
16f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74   and sqlite3_mut
1700: 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20 72 6f 75  ex_notheld() rou
1710: 74 69 6e 65 20 61 72 65 0a 2a 2a 20 69 6e 74 65  tine are.** inte
1720: 6e 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73  nded for use ins
1730: 69 64 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ide assert() sta
1740: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1750: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1760: 6c 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ld(sqlite3_mutex
1770: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
1780: 3d 3d 30 20 7c 7c 20 70 2d 3e 63 6e 74 3e 30 3b  ==0 || p->cnt>0;
1790: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  .}.int sqlite3_m
17a0: 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 73 71 6c  utex_notheld(sql
17b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
17c0: 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c    return p==0 ||
17d0: 20 70 2d 3e 63 6e 74 3d 3d 30 3b 0a 7d 0a 23 65   p->cnt==0;.}.#e
17e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
17f0: 55 54 45 58 5f 4e 4f 4f 50 5f 44 45 42 55 47 20  UTEX_NOOP_DEBUG 
1800: 2a 2f 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  */....#ifdef SQL
1810: 49 54 45 5f 4d 55 54 45 58 5f 50 54 48 52 45 41  ITE_MUTEX_PTHREA
1820: 44 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  D./*************
1830: 2a 2a 2a 20 4e 6f 6e 2d 72 65 63 75 72 73 69 76  *** Non-recursiv
1840: 65 20 50 74 68 72 65 61 64 20 4d 75 74 65 78 20  e Pthread Mutex 
1850: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  Implementation *
1860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1870: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c  .**.** This impl
1880: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 75  ementation of mu
1890: 74 65 78 65 73 20 69 73 20 62 75 69 6c 74 20 75  texes is built u
18a0: 73 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20 6f  sing a version o
18b0: 66 20 70 74 68 72 65 61 64 73 20 74 68 61 74 0a  f pthreads that.
18c0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
18d0: 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20   native support 
18e0: 66 6f 72 20 72 65 63 75 72 73 69 76 65 20 6d 75  for recursive mu
18f0: 74 65 78 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  texes..*/../*.**
1900: 20 45 61 63 68 20 72 65 63 75 72 73 69 76 65 20   Each recursive 
1910: 6d 75 74 65 78 20 69 73 20 61 6e 20 69 6e 73 74  mutex is an inst
1920: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1930: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1940: 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74  .*/.struct sqlit
1950: 65 33 5f 6d 75 74 65 78 20 7b 0a 20 20 70 74 68  e3_mutex {.  pth
1960: 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 61 69  read_mutex_t mai
1970: 6e 4d 75 74 65 78 3b 20 20 2f 2a 20 4d 75 74 65  nMutex;  /* Mute
1980: 78 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  x controlling th
1990: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 70 74 68 72  e lock */.  pthr
19a0: 65 61 64 5f 6d 75 74 65 78 5f 74 20 61 75 78 4d  ead_mutex_t auxM
19b0: 75 74 65 78 3b 20 20 20 2f 2a 20 4d 75 74 65 78  utex;   /* Mutex
19c0: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 61 63 63   controlling acc
19d0: 65 73 73 20 74 6f 20 6e 52 65 66 20 61 6e 64 20  ess to nRef and 
19e0: 6f 77 6e 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  owner */.  int i
19f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1a00: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20         /* Mutex 
1a10: 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  type */.  int nR
1a20: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1a30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a40: 6f 66 20 65 6e 74 72 61 6e 63 65 73 20 2a 2f 0a  of entrances */.
1a50: 20 20 70 74 68 72 65 61 64 5f 74 20 6f 77 6e 65    pthread_t owne
1a60: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
1a70: 20 54 68 72 65 61 64 20 74 68 61 74 20 69 73 20   Thread that is 
1a80: 77 69 74 68 69 6e 20 74 68 69 73 20 6d 75 74 65  within this mute
1a90: 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  x */.};../*.** T
1aa0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  he sqlite3_mutex
1ab0: 5f 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65  _alloc() routine
1ac0: 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77   allocates a new
1ad0: 0a 2a 2a 20 6d 75 74 65 78 20 61 6e 64 20 72 65  .** mutex and re
1ae0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
1af0: 74 6f 20 69 74 2e 20 20 49 66 20 69 74 20 72 65  to it.  If it re
1b00: 74 75 72 6e 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  turns NULL.** th
1b10: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
1b20: 6d 75 74 65 78 20 63 6f 75 6c 64 20 6e 6f 74 20  mutex could not 
1b30: 62 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 53  be allocated.  S
1b40: 51 4c 69 74 65 0a 2a 2a 20 77 69 6c 6c 20 75 6e  QLite.** will un
1b50: 77 69 6e 64 20 69 74 73 20 73 74 61 63 6b 20 61  wind its stack a
1b60: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
1b70: 6f 72 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  or.  The argumen
1b80: 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f  t.** to sqlite3_
1b90: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 29 20 69 73  mutex_alloc() is
1ba0: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 69 6e   one of these in
1bb0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73 3a  teger constants:
1bc0: 0a 2a 2a 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c  .**.** <ul>.** <
1bd0: 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54 45  li>  SQLITE_MUTE
1be0: 58 5f 46 41 53 54 20 20 20 20 20 20 20 20 20 20  X_FAST          
1bf0: 20 20 20 20 20 30 0a 2a 2a 20 3c 6c 69 3e 20 20       0.** <li>  
1c00: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
1c10: 55 52 53 49 56 45 20 20 20 20 20 20 20 20 20 20  URSIVE          
1c20: 31 0a 2a 2a 20 3c 6c 69 3e 20 20 53 51 4c 49 54  1.** <li>  SQLIT
1c30: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1c40: 41 53 54 45 52 20 20 20 20 20 20 32 0a 2a 2a 20  ASTER      2.** 
1c50: 3c 6c 69 3e 20 20 53 51 4c 49 54 45 5f 4d 55 54  <li>  SQLITE_MUT
1c60: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 20 20 20  EX_STATIC_MEM   
1c70: 20 20 20 20 20 20 33 0a 2a 2a 20 3c 6c 69 3e 20        3.** <li> 
1c80: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54   SQLITE_MUTEX_ST
1c90: 41 54 49 43 5f 50 52 4e 47 20 20 20 20 20 20 20  ATIC_PRNG       
1ca0: 20 34 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a   4.** </ul>.**.*
1cb0: 2a 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  * The first two 
1cc0: 63 6f 6e 73 74 61 6e 74 73 20 63 61 75 73 65 20  constants cause 
1cd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1ce0: 6c 6f 63 28 29 20 74 6f 20 63 72 65 61 74 65 0a  loc() to create.
1cf0: 2a 2a 20 61 20 6e 65 77 20 6d 75 74 65 78 2e 20  ** a new mutex. 
1d00: 20 54 68 65 20 6e 65 77 20 6d 75 74 65 78 20 69   The new mutex i
1d10: 73 20 72 65 63 75 72 73 69 76 65 20 77 68 65 6e  s recursive when
1d20: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45   SQLITE_MUTEX_RE
1d30: 43 55 52 53 49 56 45 0a 2a 2a 20 69 73 20 75 73  CURSIVE.** is us
1d40: 65 64 20 62 75 74 20 6e 6f 74 20 6e 65 63 65 73  ed but not neces
1d50: 73 61 72 69 6c 79 20 73 6f 20 77 68 65 6e 20 53  sarily so when S
1d60: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1d70: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 20 54 68 65   is used..** The
1d80: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
1d90: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ation does not n
1da0: 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 64 69  eed to make a di
1db0: 73 74 69 6e 63 74 69 6f 6e 0a 2a 2a 20 62 65 74  stinction.** bet
1dc0: 77 65 65 6e 20 53 51 4c 49 54 45 5f 4d 55 54 45  ween SQLITE_MUTE
1dd0: 58 5f 52 45 43 55 52 53 49 56 45 20 61 6e 64 20  X_RECURSIVE and 
1de0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
1df0: 54 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  T if it does.** 
1e00: 6e 6f 74 20 77 61 6e 74 20 74 6f 2e 20 20 42 75  not want to.  Bu
1e10: 74 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6f 6e  t SQLite will on
1e20: 6c 79 20 72 65 71 75 65 73 74 20 61 20 72 65 63  ly request a rec
1e30: 75 72 73 69 76 65 20 6d 75 74 65 78 20 69 6e 0a  ursive mutex in.
1e40: 2a 2a 20 63 61 73 65 73 20 77 68 65 72 65 20 69  ** cases where i
1e50: 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 6f  t really needs o
1e60: 6e 65 2e 20 20 49 66 20 61 20 66 61 73 74 65 72  ne.  If a faster
1e70: 20 6e 6f 6e 2d 72 65 63 75 72 73 69 76 65 20 6d   non-recursive m
1e80: 75 74 65 78 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  utex.** implemen
1e90: 74 61 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  tation is availa
1ea0: 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 20  ble on the host 
1eb0: 70 6c 61 74 66 6f 72 6d 2c 20 74 68 65 20 6d 75  platform, the mu
1ec0: 74 65 78 20 73 75 62 73 79 73 74 65 6d 0a 2a 2a  tex subsystem.**
1ed0: 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 73 75   might return su
1ee0: 63 68 20 61 20 6d 75 74 65 78 20 69 6e 20 72 65  ch a mutex in re
1ef0: 73 70 6f 6e 73 65 20 74 6f 20 53 51 4c 49 54 45  sponse to SQLITE
1f00: 5f 4d 55 54 45 58 5f 46 41 53 54 2e 0a 2a 2a 0a  _MUTEX_FAST..**.
1f10: 2a 2a 20 54 68 65 20 6f 74 68 65 72 20 61 6c 6c  ** The other all
1f20: 6f 77 65 64 20 70 61 72 61 6d 65 74 65 72 73 20  owed parameters 
1f30: 74 6f 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  to sqlite3_mutex
1f40: 5f 61 6c 6c 6f 63 28 29 20 65 61 63 68 20 72 65  _alloc() each re
1f50: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
1f60: 72 20 74 6f 20 61 20 73 74 61 74 69 63 20 70 72  r to a static pr
1f70: 65 65 78 69 73 74 69 6e 67 20 6d 75 74 65 78 2e  eexisting mutex.
1f80: 20 20 54 68 72 65 65 20 73 74 61 74 69 63 20 6d    Three static m
1f90: 75 74 65 78 65 73 20 61 72 65 0a 2a 2a 20 75 73  utexes are.** us
1fa0: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
1fb0: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  t version of SQL
1fc0: 69 74 65 2e 20 20 46 75 74 75 72 65 20 76 65 72  ite.  Future ver
1fd0: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 0a  sions of SQLite.
1fe0: 2a 2a 20 6d 61 79 20 61 64 64 20 61 64 64 69 74  ** may add addit
1ff0: 69 6f 6e 61 6c 20 73 74 61 74 69 63 20 6d 75 74  ional static mut
2000: 65 78 65 73 2e 20 20 53 74 61 74 69 63 20 6d 75  exes.  Static mu
2010: 74 65 78 65 73 20 61 72 65 20 66 6f 72 20 69 6e  texes are for in
2020: 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 20 62 79  ternal.** use by
2030: 20 53 51 4c 69 74 65 20 6f 6e 6c 79 2e 20 20 41   SQLite only.  A
2040: 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74  pplications that
2050: 20 75 73 65 20 53 51 4c 69 74 65 20 6d 75 74 65   use SQLite mute
2060: 78 65 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 75 73  xes should.** us
2070: 65 20 6f 6e 6c 79 20 74 68 65 20 64 79 6e 61 6d  e only the dynam
2080: 69 63 20 6d 75 74 65 78 65 73 20 72 65 74 75 72  ic mutexes retur
2090: 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55  ned by SQLITE_MU
20a0: 54 45 58 5f 46 41 53 54 20 6f 72 0a 2a 2a 20 53  TEX_FAST or.** S
20b0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
20c0: 52 53 49 56 45 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  RSIVE..**.** Not
20d0: 65 20 74 68 61 74 20 69 66 20 6f 6e 65 20 6f 66  e that if one of
20e0: 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6d 75 74   the dynamic mut
20f0: 65 78 20 70 61 72 61 6d 65 74 65 72 73 20 28 53  ex parameters (S
2100: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
2110: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4d 55  .** or SQLITE_MU
2120: 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 20 69  TEX_RECURSIVE) i
2130: 73 20 75 73 65 64 20 74 68 65 6e 20 73 71 6c 69  s used then sqli
2140: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
2150: 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 64  ).** returns a d
2160: 69 66 66 65 72 65 6e 74 20 6d 75 74 65 78 20 6f  ifferent mutex o
2170: 6e 20 65 76 65 72 79 20 63 61 6c 6c 2e 20 20 42  n every call.  B
2180: 75 74 20 66 6f 72 20 74 68 65 20 73 74 61 74 69  ut for the stati
2190: 63 20 0a 2a 2a 20 6d 75 74 65 78 20 74 79 70 65  c .** mutex type
21a0: 73 2c 20 74 68 65 20 73 61 6d 65 20 6d 75 74 65  s, the same mute
21b0: 78 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  x is returned on
21c0: 20 65 76 65 72 79 20 63 61 6c 6c 20 74 68 61 74   every call that
21d0: 20 68 61 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65   has.** the same
21e0: 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f   type number..*/
21f0: 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  .sqlite3_mutex *
2200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
2210: 6c 6f 63 28 69 6e 74 20 69 54 79 70 65 29 7b 0a  loc(int iType){.
2220: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
2230: 5f 6d 75 74 65 78 20 73 74 61 74 69 63 4d 75 74  _mutex staticMut
2240: 65 78 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  exes[] = {.    {
2250: 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49   PTHREAD_MUTEX_I
2260: 4e 49 54 49 41 4c 49 5a 45 52 2c 20 7d 2c 0a 20  NITIALIZER, },. 
2270: 20 20 20 7b 20 50 54 48 52 45 41 44 5f 4d 55 54     { PTHREAD_MUT
2280: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 2c 20  EX_INITIALIZER, 
2290: 7d 2c 0a 20 20 20 20 7b 20 50 54 48 52 45 41 44  },.    { PTHREAD
22a0: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
22b0: 45 52 2c 20 7d 2c 0a 20 20 20 20 7b 20 50 54 48  ER, },.    { PTH
22c0: 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
22d0: 41 4c 49 5a 45 52 2c 20 7d 2c 0a 20 20 7d 3b 0a  ALIZER, },.  };.
22e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
22f0: 2a 70 3b 0a 20 20 73 77 69 74 63 68 28 20 69 54  *p;.  switch( iT
2300: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
2310: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
2320: 54 3a 20 7b 0a 20 20 20 20 20 20 70 20 3d 20 73  T: {.      p = s
2330: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2340: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
2350: 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20        if( p ){. 
2360: 20 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69         p->id = i
2370: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 74  Type;.        pt
2380: 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
2390: 28 26 70 78 2d 3e 6d 61 69 6e 4d 75 74 65 78 2c  (&px->mainMutex,
23a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
23b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23d0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 3a  MUTEX_RECURSIVE:
23e0: 20 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c   {.      p = sql
23f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
2400: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 20  eof(*p) );.     
2410: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
2420: 20 20 70 78 2d 3e 69 64 20 3d 20 69 54 79 70 65    px->id = iType
2430: 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61  ;.        pthrea
2440: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 70 78  d_mutex_init(&px
2450: 2d 3e 61 75 78 4d 75 74 65 78 2c 20 30 29 3b 0a  ->auxMutex, 0);.
2460: 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f          pthread_
2470: 6d 75 74 65 78 5f 69 6e 69 74 28 26 70 78 2d 3e  mutex_init(&px->
2480: 6d 61 69 6e 4d 75 74 65 78 2c 20 30 29 3b 0a 20  mainMutex, 0);. 
2490: 20 20 20 20 20 20 20 70 78 2d 3e 6e 52 65 66 20         px->nRef 
24a0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
24b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
24d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 79       assert( iTy
24e0: 70 65 2d 32 20 3e 3d 20 30 20 29 3b 0a 20 20 20  pe-2 >= 0 );.   
24f0: 20 20 20 61 73 73 65 72 74 28 20 69 54 79 70 65     assert( iType
2500: 2d 32 20 3c 20 63 6f 75 6e 74 28 73 74 61 74 69  -2 < count(stati
2510: 63 4d 75 74 65 78 65 73 29 20 29 3b 0a 20 20 20  cMutexes) );.   
2520: 20 20 20 70 20 3d 20 26 73 74 61 74 69 63 4d 75     p = &staticMu
2530: 74 65 78 65 73 5b 69 54 79 70 65 2d 32 5d 3b 0a  texes[iType-2];.
2540: 20 20 20 20 20 20 70 2d 3e 69 64 20 3d 20 69 54        p->id = iT
2550: 79 70 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ype;.      break
2560: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2570: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn p;.}.../*.*
2580: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2590: 65 61 6c 6c 6f 63 61 74 65 73 20 61 20 70 72 65  eallocates a pre
25a0: 76 69 6f 75 73 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  viously.** alloc
25b0: 61 74 65 64 20 6d 75 74 65 78 2e 20 20 53 51 4c  ated mutex.  SQL
25c0: 69 74 65 20 69 73 20 63 61 72 65 66 75 6c 20 74  ite is careful t
25d0: 6f 20 64 65 61 6c 6c 6f 63 61 74 65 20 65 76 65  o deallocate eve
25e0: 72 79 0a 2a 2a 20 6d 75 74 65 78 20 74 68 61 74  ry.** mutex that
25f0: 20 69 74 20 61 6c 6c 6f 63 61 74 65 73 2e 0a 2a   it allocates..*
2600: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d  /.void sqlite3_m
2610: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2620: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61  3_mutex *p){.  a
2630: 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
2640: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 30  sert( p->nRef==0
2650: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 64 3d   );.  if( p->id=
2660: 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  =SQLITE_MUTEX_FA
2670: 53 54 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61  ST ){.    pthrea
2680: 64 5f 6d 75 74 65 78 5f 64 65 73 74 72 6f 79 28  d_mutex_destroy(
2690: 26 70 2d 3e 6d 61 69 6e 4d 75 74 65 78 29 3b 0a  &p->mainMutex);.
26a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
26b0: 65 72 74 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49  ert( p->id==SQLI
26c0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
26d0: 56 45 20 29 3b 0a 20 20 20 20 70 74 68 72 65 61  VE );.    pthrea
26e0: 64 5f 6d 75 74 65 78 5f 64 65 73 74 72 6f 79 28  d_mutex_destroy(
26f0: 26 70 2d 3e 61 75 78 4d 75 74 65 78 29 3b 0a 20  &p->auxMutex);. 
2700: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
2710: 5f 64 65 73 74 72 6f 79 28 26 70 2d 3e 6d 61 69  _destroy(&p->mai
2720: 6e 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 73  nMutex);.  }.  s
2730: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
2740: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  }../*.** The sql
2750: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2760: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d  () and sqlite3_m
2770: 75 74 65 78 5f 74 72 79 28 29 20 72 6f 75 74 69  utex_try() routi
2780: 6e 65 73 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  nes attempt.** t
2790: 6f 20 65 6e 74 65 72 20 61 20 6d 75 74 65 78 2e  o enter a mutex.
27a0: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 74 68 72    If another thr
27b0: 65 61 64 20 69 73 20 61 6c 72 65 61 64 79 20 77  ead is already w
27c0: 69 74 68 69 6e 20 74 68 65 20 6d 75 74 65 78 2c  ithin the mutex,
27d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  .** sqlite3_mute
27e0: 78 5f 65 6e 74 65 72 28 29 20 77 69 6c 6c 20 62  x_enter() will b
27f0: 6c 6f 63 6b 20 61 6e 64 20 73 71 6c 69 74 65 33  lock and sqlite3
2800: 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 77 69 6c  _mutex_try() wil
2810: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  l return.** SQLI
2820: 54 45 5f 42 55 53 59 2e 20 20 54 68 65 20 73 71  TE_BUSY.  The sq
2830: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
2840: 29 20 69 6e 74 65 72 66 61 63 65 20 72 65 74 75  ) interface retu
2850: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  rns SQLITE_OK.**
2860: 20 75 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c   upon successful
2870: 20 65 6e 74 72 79 2e 20 20 4d 75 74 65 78 65 73   entry.  Mutexes
2880: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 53   created using S
2890: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
28a0: 52 53 49 56 45 20 63 61 6e 0a 2a 2a 20 62 65 20  RSIVE can.** be 
28b0: 65 6e 74 65 72 65 64 20 6d 75 6c 74 69 70 6c 65  entered multiple
28c0: 20 74 69 6d 65 73 20 62 79 20 74 68 65 20 73 61   times by the sa
28d0: 6d 65 20 74 68 72 65 61 64 2e 20 20 49 6e 20 73  me thread.  In s
28e0: 75 63 68 20 63 61 73 65 73 20 74 68 65 2c 0a 2a  uch cases the,.*
28f0: 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  * mutex must be 
2900: 65 78 69 74 65 64 20 61 6e 20 65 71 75 61 6c 20  exited an equal 
2910: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
2920: 62 65 66 6f 72 65 20 61 6e 6f 74 68 65 72 20 74  before another t
2930: 68 72 65 61 64 0a 2a 2a 20 63 61 6e 20 65 6e 74  hread.** can ent
2940: 65 72 2e 20 20 49 66 20 74 68 65 20 73 61 6d 65  er.  If the same
2950: 20 74 68 72 65 61 64 20 74 72 69 65 73 20 74 6f   thread tries to
2960: 20 65 6e 74 65 72 20 61 6e 79 20 6f 74 68 65 72   enter any other
2970: 20 6b 69 6e 64 20 6f 66 20 6d 75 74 65 78 0a 2a   kind of mutex.*
2980: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
2990: 2c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 69  , the behavior i
29a0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
29b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 75 74  void sqlite3_mut
29c0: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
29d0: 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 69 66  _mutex *p){.  if
29e0: 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f  ( p->id==SQLITE_
29f0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20  MUTEX_RECURSIVE 
2a00: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  ){.    while(1){
2a10: 0a 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d  .      pthread_m
2a20: 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e 61 75  utex_lock(&p->au
2a30: 78 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 69  xMutex);.      i
2a40: 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  f( p->nRef==0 ){
2a50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 52 65 66  .        p->nRef
2a60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f  ++;.        p->o
2a70: 77 6e 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73  wner = pthread_s
2a80: 65 6c 66 28 29 3b 0a 20 20 20 20 20 20 20 20 70  elf();.        p
2a90: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
2aa0: 6b 28 26 70 2d 3e 6d 61 69 6e 4d 75 74 65 78 29  k(&p->mainMutex)
2ab0: 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61  ;.        pthrea
2ac0: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
2ad0: 70 2d 3e 61 75 78 4d 75 74 65 78 29 3b 0a 20 20  p->auxMutex);.  
2ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2af0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 74 68     }else if( pth
2b00: 72 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e 6f 77  read_equal(p->ow
2b10: 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c  ner, pthread_sel
2b20: 66 28 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f()) ){.        
2b30: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  p->nRef++;.     
2b40: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
2b50: 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 61 75 78 4d  _unlock(&p->auxM
2b60: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 62  utex);.        b
2b70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
2b80: 65 7b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65  e{.        pthre
2b90: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
2ba0: 26 70 2d 3e 61 75 78 4d 75 74 65 78 29 3b 0a 20  &p->auxMutex);. 
2bb0: 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
2bc0: 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e 6d 61  utex_lock(&p->ma
2bd0: 69 6e 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  inMutex);.      
2be0: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
2bf0: 75 6e 6c 6f 63 6b 28 26 70 2d 3e 6d 61 69 6e 4d  unlock(&p->mainM
2c00: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  utex);.      }. 
2c10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
2c30: 66 3d 3d 30 20 7c 7c 20 70 74 68 72 65 61 64 5f  f==0 || pthread_
2c40: 65 71 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20  equal(p->owner, 
2c50: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 3d  pthread_self())=
2c60: 3d 30 20 29 3b 0a 20 20 20 20 70 74 68 72 65 61  =0 );.    pthrea
2c70: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d  d_mutex_lock(&p-
2c80: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 61 73 73  >mutex);.    ass
2c90: 65 72 74 28 20 28 70 2d 3e 6e 52 65 66 20 3d 20  ert( (p->nRef = 
2ca0: 31 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  1)!=0 );.    ass
2cb0: 65 72 74 28 20 28 70 2d 3e 6f 77 6e 65 72 20 3d  ert( (p->owner =
2cc0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29   pthread_self())
2cd0: 3d 3d 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  ==pthread_self()
2ce0: 20 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71   );.  }.}.int sq
2cf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
2d00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
2d10: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 64 3d 3d  ){.  if( p->id==
2d20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
2d30: 55 52 53 49 56 45 20 29 7b 0a 20 20 20 20 70 74  URSIVE ){.    pt
2d40: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
2d50: 28 26 70 2d 3e 61 75 78 4d 75 74 65 78 29 3b 0a  (&p->auxMutex);.
2d60: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
2d70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
2d80: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Ref++;.      p->
2d90: 6f 77 6e 65 72 20 3d 20 70 74 68 72 65 61 64 5f  owner = pthread_
2da0: 73 65 6c 66 28 29 3b 0a 20 20 20 20 20 20 70 74  self();.      pt
2db0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
2dc0: 28 26 70 2d 3e 6d 61 69 6e 4d 75 74 65 78 29 3b  (&p->mainMutex);
2dd0: 0a 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d  .      pthread_m
2de0: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e  utex_unlock(&p->
2df0: 61 75 78 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d  auxMutex);.    }
2e00: 65 6c 73 65 20 69 66 28 20 70 74 68 72 65 61 64  else if( pthread
2e10: 5f 65 71 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c  _equal(p->owner,
2e20: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29   pthread_self())
2e30: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65   ){.      p->nRe
2e40: 66 2b 2b 3b 0a 20 20 20 20 20 20 70 74 68 72 65  f++;.      pthre
2e50: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
2e60: 26 70 2d 3e 61 75 78 4d 75 74 65 78 29 3b 0a 20  &p->auxMutex);. 
2e70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e80: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
2e90: 6c 6f 63 6b 28 26 70 2d 3e 61 75 78 4d 75 74 65  lock(&p->auxMute
2ea0: 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  x);.      return
2eb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2ec0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2ed0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
2ee0: 3d 3d 30 20 7c 7c 20 70 74 68 72 65 61 64 5f 65  ==0 || pthread_e
2ef0: 71 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 70  qual(p->owner, p
2f00: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 3d 3d  thread_self())==
2f10: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 74 68  0 );.    if( pth
2f20: 72 65 61 64 5f 6d 75 74 65 78 5f 74 72 79 6c 6f  read_mutex_trylo
2f30: 63 6b 28 26 70 2d 3e 6d 75 74 65 78 29 20 29 7b  ck(&p->mutex) ){
2f40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f50: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
2f60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2f70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2f80: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 75  * The sqlite3_mu
2f90: 74 65 78 5f 6c 65 61 76 65 28 29 20 72 6f 75 74  tex_leave() rout
2fa0: 69 6e 65 20 65 78 69 74 73 20 61 20 6d 75 74 65  ine exits a mute
2fb0: 78 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72  x that was.** pr
2fc0: 65 76 69 6f 75 73 6c 79 20 65 6e 74 65 72 65 64  eviously entered
2fd0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 74 68 72   by the same thr
2fe0: 65 61 64 2e 20 20 54 68 65 20 62 65 68 61 76 69  ead.  The behavi
2ff0: 6f 72 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e  or.** is undefin
3000: 65 64 20 69 66 20 74 68 65 20 6d 75 74 65 78 20  ed if the mutex 
3010: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
3020: 20 65 6e 74 65 72 65 64 20 6f 72 0a 2a 2a 20 69   entered or.** i
3030: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3040: 61 6c 6c 6f 63 61 74 65 64 2e 20 20 53 51 4c 69  allocated.  SQLi
3050: 74 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 64 6f  te will never do
3060: 20 65 69 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64   either..*/.void
3070: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
3080: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
3090: 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a 20 20 69  ex *pMutex){.  i
30a0: 66 28 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45  f( p->id==SQLITE
30b0: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
30c0: 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   ){.    pthread_
30d0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e 61  mutex_lock(&p->a
30e0: 75 78 4d 75 74 65 78 29 3b 0a 20 20 20 20 61 73  uxMutex);.    as
30f0: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
3100: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
3110: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 2d 3e  thread_equal(p->
3120: 6f 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73  owner, pthread_s
3130: 65 6c 66 28 29 29 20 29 3b 0a 20 20 20 20 70 2d  elf()) );.    p-
3140: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
3150: 20 70 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20   p->nRef<=0 ){. 
3160: 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74       pthread_mut
3170: 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 6d 61  ex_unlock(&p->ma
3180: 69 6e 4d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  inMutex);.    }.
3190: 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
31a0: 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 61 75 78  x_unlock(&p->aux
31b0: 4d 75 74 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  Mutex);.  }else{
31c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
31d0: 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 20 20 61  nRef==1 );.    a
31e0: 73 73 65 72 74 28 20 70 74 68 72 65 61 64 5f 65  ssert( pthread_e
31f0: 71 75 61 6c 28 70 2d 3e 6f 77 6e 65 72 2c 20 70  qual(p->owner, p
3200: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 20 29  thread_self()) )
3210: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
3220: 30 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d  0;.    pthread_m
3230: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e  utex_unlock(&p->
3240: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mutex);.  }.}../
3250: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
3260: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 20 61 6e  _mutex_held() an
3270: 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  d sqlite3_mutex_
3280: 6e 6f 74 68 65 6c 64 28 29 20 72 6f 75 74 69 6e  notheld() routin
3290: 65 20 61 72 65 0a 2a 2a 20 69 6e 74 65 6e 64 65  e are.** intende
32a0: 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 65  d for use inside
32b0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
32c0: 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
32d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
32e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
32f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  ){.  assert( p )
3300: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20  ;.  return p==0 
3310: 7c 7c 20 28 70 2d 3e 6e 52 65 66 21 3d 30 20 26  || (p->nRef!=0 &
3320: 26 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  & pthread_equal(
3330: 70 2d 3e 6f 77 6e 65 72 2c 20 70 74 68 72 65 61  p->owner, pthrea
3340: 64 5f 73 65 6c 66 28 29 29 29 3b 0a 7d 0a 69 6e  d_self()));.}.in
3350: 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  t sqlite3_mutex_
3360: 6e 6f 74 68 65 6c 64 28 73 71 6c 69 74 65 33 5f  notheld(sqlite3_
3370: 6d 75 74 65 78 20 2a 70 4e 6f 74 55 73 65 64 29  mutex *pNotUsed)
3380: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  {.  assert( p );
3390: 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c  .  return p==0 |
33a0: 7c 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  | p->nRef==0 || 
33b0: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 2d  pthread_equal(p-
33c0: 3e 6f 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f  >owner, pthread_
33d0: 73 65 6c 66 28 29 29 3d 3d 30 3b 0a 7d 0a 23 65  self())==0;.}.#e
33e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
33f0: 55 54 45 58 5f 50 54 48 52 45 41 44 20 2a 2f 0a  UTEX_PTHREAD */.
3400: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
3410: 6e 65 64 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  ned(SQLITE_MUTEX
3420: 5f 41 50 50 44 45 46 29 20 2a 2f 0a              _APPDEF) */.