/ Hex Artifact Content
Login

Artifact 40e5ba09d56863895882a0204d93832e9960ea78:


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: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
01c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
01d0: 69 73 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  is file does not
01e0: 20 70 72 6f 76 69 64 65 20 61 6e 79 20 6d 75 74   provide any mut
01f0: 75 61 6c 0a 2a 2a 20 65 78 63 6c 75 73 69 6f 6e  ual.** exclusion
0200: 20 61 6e 64 20 69 73 20 74 68 75 73 20 73 75 69   and is thus sui
0210: 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 6f 6e  table for use on
0220: 6c 79 20 69 6e 20 61 70 70 6c 69 63 61 74 69 6f  ly in applicatio
0230: 6e 73 0a 2a 2a 20 74 68 61 74 20 75 73 65 20 53  ns.** that use S
0240: 51 4c 69 74 65 20 69 6e 20 61 20 73 69 6e 67 6c  QLite in a singl
0250: 65 20 74 68 72 65 61 64 2e 20 20 42 75 74 20 74  e thread.  But t
0260: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0270: 6f 6e 0a 2a 2a 20 64 6f 65 73 20 64 6f 20 61 20  on.** does do a 
0280: 6c 6f 74 20 6f 66 20 65 72 72 6f 72 20 63 68 65  lot of error che
0290: 63 6b 69 6e 67 20 6f 6e 20 6d 75 74 65 78 65 73  cking on mutexes
02a0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
02b0: 65 79 0a 2a 2a 20 61 72 65 20 63 61 6c 6c 65 64  ey.** are called
02c0: 20 63 6f 72 72 65 63 74 6c 79 20 61 6e 64 20 61   correctly and a
02d0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69  t appropriate ti
02e0: 6d 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  mes.  Hence, thi
02f0: 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  s.** implementat
0300: 69 6f 6e 20 69 73 20 73 75 69 74 61 62 6c 65 20  ion is suitable 
0310: 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 20  for testing..** 
0320: 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
0330: 65 73 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 75  es.**.** $Id: mu
0340: 74 65 78 2e 63 2c 76 20 31 2e 31 35 20 32 30 30  tex.c,v 1.15 200
0350: 37 2f 30 38 2f 32 38 20 31 36 3a 33 34 3a 34 33  7/08/28 16:34:43
0360: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0370: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0380: 74 2e 68 22 0a 0a 23 69 66 64 65 66 20 53 51 4c  t.h"..#ifdef SQL
0390: 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 5f 44  ITE_MUTEX_NOOP_D
03a0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  EBUG./*.** In th
03b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
03c0: 6e 2c 20 6d 75 74 65 78 65 73 20 64 6f 20 6e 6f  n, mutexes do no
03d0: 74 20 70 72 6f 76 69 64 65 20 61 6e 79 20 6d 75  t provide any mu
03e0: 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 2e 0a  tual exclusion..
03f0: 2a 2a 20 42 75 74 20 74 68 65 20 65 72 72 6f 72  ** But the error
0400: 20 63 68 65 63 6b 69 6e 67 20 69 73 20 70 72 6f   checking is pro
0410: 76 69 64 65 64 2e 20 20 54 68 69 73 20 69 6d 70  vided.  This imp
0420: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 75  lementation is u
0430: 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
0440: 74 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 0a  t purposes..*/..
0450: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  /*.** The mutex 
0460: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 72 75 63 74  object.*/.struct
0470: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 7b   sqlite3_mutex {
0480: 0a 20 20 69 6e 74 20 69 64 3b 20 20 20 20 20 2f  .  int id;     /
0490: 2a 20 54 68 65 20 6d 75 74 65 78 20 74 79 70 65  * The mutex type
04a0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
04b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
04c0: 6e 74 72 69 65 73 20 77 69 74 68 6f 75 74 20 61  ntries without a
04d0: 20 6d 61 74 63 68 69 6e 67 20 6c 65 61 76 65 20   matching leave 
04e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
04f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
0500: 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65 20 61  lloc() routine a
0510: 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a  llocates a new.*
0520: 2a 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75  * mutex and retu
0530: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
0540: 20 69 74 2e 20 20 49 66 20 69 74 20 72 65 74 75   it.  If it retu
0550: 72 6e 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 61 74  rns NULL.** that
0560: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 75   means that a mu
0570: 74 65 78 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  tex could not be
0580: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 2a 2f 0a   allocated. .*/.
0590: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
05a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
05b0: 6f 63 28 69 6e 74 20 69 64 29 7b 0a 20 20 73 74  oc(int id){.  st
05c0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74  atic sqlite3_mut
05d0: 65 78 20 61 53 74 61 74 69 63 5b 34 5d 3b 0a 20  ex aStatic[4];. 
05e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
05f0: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 73 77 69 74  pNew = 0;.  swit
0600: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
0610: 73 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  se SQLITE_MUTEX_
0620: 46 41 53 54 3a 0a 20 20 20 20 63 61 73 65 20 53  FAST:.    case S
0630: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
0640: 52 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 70  RSIVE: {.      p
0650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
0660: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65  lloc(sizeof(*pNe
0670: 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  w));.      if( p
0680: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  New ){.        p
0690: 4e 65 77 2d 3e 69 64 20 3d 20 69 64 3b 0a 20 20  New->id = id;.  
06a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 63 6e 74 20        pNew->cnt 
06b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
06c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
06d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
06e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 2d       assert( id-
06f0: 32 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 20 20  2 >= 0 );.      
0700: 61 73 73 65 72 74 28 20 69 64 2d 32 20 3c 20 73  assert( id-2 < s
0710: 69 7a 65 6f 66 28 61 53 74 61 74 69 63 29 2f 73  izeof(aStatic)/s
0720: 69 7a 65 6f 66 28 61 53 74 61 74 69 63 5b 30 5d  izeof(aStatic[0]
0730: 29 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ) );.      pNew 
0740: 3d 20 26 61 53 74 61 74 69 63 5b 69 64 2d 32 5d  = &aStatic[id-2]
0750: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 64  ;.      pNew->id
0760: 20 3d 20 69 64 3b 0a 20 20 20 20 20 20 62 72 65   = id;.      bre
0770: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
0780: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
0790: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
07a0: 6e 65 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61  ne deallocates a
07b0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
07c0: 63 61 74 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  cated mutex..*/.
07d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 75 74  void sqlite3_mut
07e0: 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f  ex_free(sqlite3_
07f0: 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  mutex *p){.  ass
0800: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
0810: 72 74 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 29 3b  rt( p->cnt==0 );
0820: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 64  .  assert( p->id
0830: 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  ==SQLITE_MUTEX_F
0840: 41 53 54 20 7c 7c 20 70 2d 3e 69 64 3d 3d 53 51  AST || p->id==SQ
0850: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
0860: 53 49 56 45 20 29 3b 0a 20 20 73 71 6c 69 74 65  SIVE );.  sqlite
0870: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
0880: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
0890: 6d 75 74 65 78 5f 65 6e 74 65 72 28 29 20 61 6e  mutex_enter() an
08a0: 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  d sqlite3_mutex_
08b0: 74 72 79 28 29 20 72 6f 75 74 69 6e 65 73 20 61  try() routines a
08c0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 74  ttempt.** to ent
08d0: 65 72 20 61 20 6d 75 74 65 78 2e 20 20 49 66 20  er a mutex.  If 
08e0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
08f0: 73 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  s already within
0900: 20 74 68 65 20 6d 75 74 65 78 2c 0a 2a 2a 20 73   the mutex,.** s
0910: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
0920: 65 72 28 29 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  er() will block 
0930: 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  and sqlite3_mute
0940: 78 5f 74 72 79 28 29 20 77 69 6c 6c 20 72 65 74  x_try() will ret
0950: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  urn.** SQLITE_BU
0960: 53 59 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  SY.  The sqlite3
0970: 5f 6d 75 74 65 78 5f 74 72 79 28 29 20 69 6e 74  _mutex_try() int
0980: 65 72 66 61 63 65 20 72 65 74 75 72 6e 73 20 53  erface returns S
0990: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 75 70 6f 6e  QLITE_OK.** upon
09a0: 20 73 75 63 63 65 73 73 66 75 6c 20 65 6e 74 72   successful entr
09b0: 79 2e 20 20 4d 75 74 65 78 65 73 20 63 72 65 61  y.  Mutexes crea
09c0: 74 65 64 20 75 73 69 6e 67 20 53 51 4c 49 54 45  ted using SQLITE
09d0: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
09e0: 20 63 61 6e 0a 2a 2a 20 62 65 20 65 6e 74 65 72   can.** be enter
09f0: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
0a00: 73 20 62 79 20 74 68 65 20 73 61 6d 65 20 74 68  s by the same th
0a10: 72 65 61 64 2e 20 20 49 6e 20 73 75 63 68 20 63  read.  In such c
0a20: 61 73 65 73 20 74 68 65 2c 0a 2a 2a 20 6d 75 74  ases the,.** mut
0a30: 65 78 20 6d 75 73 74 20 62 65 20 65 78 69 74 65  ex must be exite
0a40: 64 20 61 6e 20 65 71 75 61 6c 20 6e 75 6d 62 65  d an equal numbe
0a50: 72 20 6f 66 20 74 69 6d 65 73 20 62 65 66 6f 72  r of times befor
0a60: 65 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  e another thread
0a70: 0a 2a 2a 20 63 61 6e 20 65 6e 74 65 72 2e 20 20  .** can enter.  
0a80: 49 66 20 74 68 65 20 73 61 6d 65 20 74 68 72 65  If the same thre
0a90: 61 64 20 74 72 69 65 73 20 74 6f 20 65 6e 74 65  ad tries to ente
0aa0: 72 20 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64  r any other kind
0ab0: 20 6f 66 20 6d 75 74 65 78 0a 2a 2a 20 6d 6f 72   of mutex.** mor
0ac0: 65 20 74 68 61 6e 20 6f 6e 63 65 2c 20 74 68 65  e than once, the
0ad0: 20 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e 64   behavior is und
0ae0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  efined..*/.void 
0af0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
0b00: 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ter(sqlite3_mute
0b10: 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
0b20: 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
0b30: 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55  p->id==SQLITE_MU
0b40: 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c 7c  TEX_RECURSIVE ||
0b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
0b60: 6f 74 68 65 6c 64 28 70 29 20 29 3b 0a 20 20 70  otheld(p) );.  p
0b70: 2d 3e 63 6e 74 2b 2b 3b 0a 7d 0a 69 6e 74 20 73  ->cnt++;.}.int s
0b80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79  qlite3_mutex_try
0b90: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
0ba0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 20  p){.  assert( p 
0bb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
0bc0: 69 64 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58  id==SQLITE_MUTEX
0bd0: 5f 52 45 43 55 52 53 49 56 45 20 7c 7c 20 73 71  _RECURSIVE || sq
0be0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
0bf0: 65 6c 64 28 70 29 20 29 3b 0a 20 20 70 2d 3e 63  eld(p) );.  p->c
0c00: 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53  nt++;.  return S
0c10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
0c20: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6d  ** The sqlite3_m
0c30: 75 74 65 78 5f 6c 65 61 76 65 28 29 20 72 6f 75  utex_leave() rou
0c40: 74 69 6e 65 20 65 78 69 74 73 20 61 20 6d 75 74  tine exits a mut
0c50: 65 78 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 70  ex that was.** p
0c60: 72 65 76 69 6f 75 73 6c 79 20 65 6e 74 65 72 65  reviously entere
0c70: 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 74 68  d by the same th
0c80: 72 65 61 64 2e 20 20 54 68 65 20 62 65 68 61 76  read.  The behav
0c90: 69 6f 72 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69  ior.** is undefi
0ca0: 6e 65 64 20 69 66 20 74 68 65 20 6d 75 74 65 78  ned if the mutex
0cb0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
0cc0: 79 20 65 6e 74 65 72 65 64 20 6f 72 0a 2a 2a 20  y entered or.** 
0cd0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ce0: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 53 51 4c   allocated.  SQL
0cf0: 69 74 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 64  ite will never d
0d00: 6f 20 65 69 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69  o either..*/.voi
0d10: 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  d sqlite3_mutex_
0d20: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
0d30: 74 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  tex *p){.  asser
0d40: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
0d50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
0d60: 68 65 6c 64 28 70 29 20 29 3b 0a 20 20 70 2d 3e  held(p) );.  p->
0d70: 63 6e 74 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28  cnt--;.  assert(
0d80: 20 70 2d 3e 69 64 3d 3d 53 51 4c 49 54 45 5f 4d   p->id==SQLITE_M
0d90: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 20 7c  UTEX_RECURSIVE |
0da0: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
0db0: 6e 6f 74 68 65 6c 64 28 70 29 20 29 3b 0a 7d 0a  notheld(p) );.}.
0dc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
0dd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 20  e3_mutex_held() 
0de0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  and sqlite3_mute
0df0: 78 5f 6e 6f 74 68 65 6c 64 28 29 20 72 6f 75 74  x_notheld() rout
0e00: 69 6e 65 20 61 72 65 0a 2a 2a 20 69 6e 74 65 6e  ine are.** inten
0e10: 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69  ded for use insi
0e20: 64 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  de assert() stat
0e30: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
0e40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
0e50: 64 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  d(sqlite3_mutex 
0e60: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d  *p){.  return p=
0e70: 3d 30 20 7c 7c 20 70 2d 3e 63 6e 74 3e 30 3b 0a  =0 || p->cnt>0;.
0e80: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 75  }.int sqlite3_mu
0e90: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 73 71 6c 69  tex_notheld(sqli
0ea0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20  te3_mutex *p){. 
0eb0: 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c 20   return p==0 || 
0ec0: 70 2d 3e 63 6e 74 3d 3d 30 3b 0a 7d 0a 23 65 6e  p->cnt==0;.}.#en
0ed0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 55  dif /* SQLITE_MU
0ee0: 54 45 58 5f 4e 4f 4f 50 5f 44 45 42 55 47 20 2a  TEX_NOOP_DEBUG *
0ef0: 2f 0a                                            /.