/ Hex Artifact Content
Login

Artifact ea2cc74d97f077b9e74c84cbd024f14d79a8126f:


0000: 23 20 32 30 30 38 20 4a 75 6e 65 20 31 37 0a 23  # 2008 June 17.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 0a 23 20 24 49 64 3a 20 6d 75  ****.#.# $Id: mu
0170: 74 65 78 31 2e 74 65 73 74 2c 76 20 31 2e 32 30  tex1.test,v 1.20
0180: 20 32 30 30 39 2f 30 34 2f 32 33 20 31 34 3a 35   2009/04/23 14:5
0190: 38 3a 34 30 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:40 danielk1977
01a0: 20 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74   Exp $..set test
01b0: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
01c0: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
01d0: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01e0: 2e 74 63 6c 0a 0a 69 66 63 61 70 61 62 6c 65 20  .tcl..ifcapable 
01f0: 21 6d 75 74 65 78 20 7b 0a 20 20 66 69 6e 69 73  !mutex {.  finis
0200: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
0210: 7d 0a 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  }.if {[info exis
0220: 74 73 20 74 65 73 74 65 72 5f 64 6f 5f 62 69 6e  ts tester_do_bin
0230: 61 72 79 6c 6f 67 5d 7d 20 7b 0a 20 20 66 69 6e  arylog]} {.  fin
0240: 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72  ish_test.  retur
0250: 6e 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 72 65 73  n.}..sqlite3_res
0260: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
0270: 6e 0a 63 6c 65 61 72 5f 6d 75 74 65 78 5f 63 6f  n.clear_mutex_co
0280: 75 6e 74 65 72 73 0a 0a 70 72 6f 63 20 6d 75 74  unters..proc mut
0290: 65 78 5f 63 6f 75 6e 74 65 72 73 20 7b 76 61 72  ex_counters {var
02a0: 6e 61 6d 65 7d 20 7b 0a 20 20 75 70 76 61 72 20  name} {.  upvar 
02b0: 24 76 61 72 6e 61 6d 65 20 76 61 72 0a 20 20 73  $varname var.  s
02c0: 65 74 20 76 61 72 28 74 6f 74 61 6c 29 20 30 0a  et var(total) 0.
02d0: 20 20 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20    foreach {name 
02e0: 76 61 6c 75 65 7d 20 5b 72 65 61 64 5f 6d 75 74  value} [read_mut
02f0: 65 78 5f 63 6f 75 6e 74 65 72 73 5d 20 7b 0a 20  ex_counters] {. 
0300: 20 20 20 73 65 74 20 76 61 72 28 24 6e 61 6d 65     set var($name
0310: 29 20 24 76 61 6c 75 65 0a 20 20 20 20 69 6e 63  ) $value.    inc
0320: 72 20 76 61 72 28 74 6f 74 61 6c 29 20 24 76 61  r var(total) $va
0330: 6c 75 65 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  lue.  }.}..#----
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 73 20 6d 75  -----.# Tests mu
0390: 74 65 78 31 2d 31 2e 2a 20 74 65 73 74 20 74 68  tex1-1.* test th
03a0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  at sqlite3_confi
03b0: 67 28 29 20 72 65 74 75 72 6e 73 20 53 51 4c 49  g() returns SQLI
03c0: 54 45 5f 4d 49 53 55 53 45 20 69 66 0a 23 20 69  TE_MISUSE if.# i
03d0: 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
03e0: 77 72 6f 6e 67 20 74 69 6d 65 2e 20 41 6e 64 20  wrong time. And 
03f0: 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 74  that the first t
0400: 69 6d 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  ime sqlite3_init
0410: 69 61 6c 69 7a 65 0a 23 20 69 73 20 63 61 6c 6c  ialize.# is call
0420: 65 64 20 69 74 20 6f 62 74 61 69 6e 73 20 74 68  ed it obtains th
0430: 65 20 27 73 74 61 74 69 63 5f 6d 61 73 74 65 72  e 'static_master
0440: 27 20 6d 75 74 65 78 20 33 20 74 69 6d 65 73 20  ' mutex 3 times 
0450: 61 6e 64 20 61 20 72 65 63 75 72 73 69 76 65 0a  and a recursive.
0460: 23 20 6d 75 74 65 78 20 28 73 71 6c 69 74 65 33  # mutex (sqlite3
0470: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
0480: 78 29 20 74 77 69 63 65 2e 20 53 75 62 73 65 71  x) twice. Subseq
0490: 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 65 20 6e  uent calls are n
04a0: 6f 2d 6f 70 73 0a 23 20 74 68 61 74 20 64 6f 20  o-ops.# that do 
04b0: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
04c0: 6d 75 74 65 78 65 73 2e 0a 23 0a 64 6f 5f 74 65  mutexes..#.do_te
04d0: 73 74 20 6d 75 74 65 78 31 2d 31 2e 30 20 7b 0a  st mutex1-1.0 {.
04e0: 20 20 69 6e 73 74 61 6c 6c 5f 6d 75 74 65 78 5f    install_mutex_
04f0: 63 6f 75 6e 74 65 72 73 20 31 0a 7d 20 7b 53 51  counters 1.} {SQ
0500: 4c 49 54 45 5f 4d 49 53 55 53 45 7d 0a 0a 64 6f  LITE_MISUSE}..do
0510: 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 31  _test mutex1-1.1
0520: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
0530: 69 6e 73 74 61 6c 6c 5f 6d 75 74 65 78 5f 63 6f  install_mutex_co
0540: 75 6e 74 65 72 73 20 31 0a 7d 20 7b 53 51 4c 49  unters 1.} {SQLI
0550: 54 45 5f 4d 49 53 55 53 45 7d 0a 0a 64 6f 5f 74  TE_MISUSE}..do_t
0560: 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 32 20 7b  est mutex1-1.2 {
0570: 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  .  sqlite3_shutd
0580: 6f 77 6e 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d 75  own.  install_mu
0590: 74 65 78 5f 63 6f 75 6e 74 65 72 73 20 31 0a 7d  tex_counters 1.}
05a0: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f   {SQLITE_OK}..do
05b0: 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 33  _test mutex1-1.3
05c0: 20 7b 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d 75 74   {.  install_mut
05d0: 65 78 5f 63 6f 75 6e 74 65 72 73 20 30 0a 7d 20  ex_counters 0.} 
05e0: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f  {SQLITE_OK}..do_
05f0: 74 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 34 20  test mutex1-1.4 
0600: 7b 0a 20 20 69 6e 73 74 61 6c 6c 5f 6d 75 74 65  {.  install_mute
0610: 78 5f 63 6f 75 6e 74 65 72 73 20 31 0a 7d 20 7b  x_counters 1.} {
0620: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 64 6f 5f 74  SQLITE_OK}..do_t
0630: 65 73 74 20 6d 75 74 65 78 31 2d 31 2e 35 20 7b  est mutex1-1.5 {
0640: 0a 20 20 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72  .  mutex_counter
0650: 73 20 63 6f 75 6e 74 65 72 73 0a 20 20 73 65 74  s counters.  set
0660: 20 63 6f 75 6e 74 65 72 73 28 74 6f 74 61 6c 29   counters(total)
0670: 0a 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  .} {0}..do_test 
0680: 6d 75 74 65 78 31 2d 31 2e 36 20 7b 0a 20 20 73  mutex1-1.6 {.  s
0690: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
06a0: 65 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  e.} {SQLITE_OK}.
06b0: 0a 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2d  .do_test mutex1-
06c0: 31 2e 37 20 7b 0a 20 20 6d 75 74 65 78 5f 63 6f  1.7 {.  mutex_co
06d0: 75 6e 74 65 72 73 20 63 6f 75 6e 74 65 72 73 0a  unters counters.
06e0: 20 20 23 20 6c 69 73 74 20 24 63 6f 75 6e 74 65    # list $counte
06f0: 72 73 28 74 6f 74 61 6c 29 20 24 63 6f 75 6e 74  rs(total) $count
0700: 65 72 73 28 73 74 61 74 69 63 5f 6d 61 73 74 65  ers(static_maste
0710: 72 29 0a 20 20 65 78 70 72 20 7b 24 63 6f 75 6e  r).  expr {$coun
0720: 74 65 72 73 28 74 6f 74 61 6c 29 3e 30 7d 0a 7d  ters(total)>0}.}
0730: 20 7b 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75   {1}..do_test mu
0740: 74 65 78 31 2d 31 2e 38 20 7b 0a 20 20 63 6c 65  tex1-1.8 {.  cle
0750: 61 72 5f 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72  ar_mutex_counter
0760: 73 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  s.  sqlite3_init
0770: 69 61 6c 69 7a 65 0a 7d 20 7b 53 51 4c 49 54 45  ialize.} {SQLITE
0780: 5f 4f 4b 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 75  _OK}..do_test mu
0790: 74 65 78 31 2d 31 2e 39 20 7b 0a 20 20 6d 75 74  tex1-1.9 {.  mut
07a0: 65 78 5f 63 6f 75 6e 74 65 72 73 20 63 6f 75 6e  ex_counters coun
07b0: 74 65 72 73 0a 20 20 6c 69 73 74 20 24 63 6f 75  ters.  list $cou
07c0: 6e 74 65 72 73 28 74 6f 74 61 6c 29 20 24 63 6f  nters(total) $co
07d0: 75 6e 74 65 72 73 28 73 74 61 74 69 63 5f 6d 61  unters(static_ma
07e0: 73 74 65 72 29 0a 7d 20 7b 30 20 30 7d 0a 0a 23  ster).} {0 0}..#
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
0840: 73 20 6d 75 74 65 78 31 2d 32 2e 2a 20 74 65 73  s mutex1-2.* tes
0850: 74 20 74 68 65 20 74 68 72 65 65 20 74 68 72 65  t the three thre
0860: 61 64 2d 73 61 66 65 74 79 20 72 65 6c 61 74 65  ad-safety relate
0870: 64 20 6d 6f 64 65 73 20 74 68 61 74 0a 23 20 63  d modes that.# c
0880: 61 6e 20 62 65 20 73 65 6c 65 63 74 65 64 20 75  an be selected u
0890: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6f 6e  sing sqlite3_con
08a0: 66 69 67 3a 0a 23 0a 23 20 20 20 2a 20 53 65 72  fig:.#.#   * Ser
08b0: 69 61 6c 69 7a 65 64 20 6d 6f 64 65 2c 0a 23 20  ialized mode,.# 
08c0: 20 20 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64    * Multi-thread
08d0: 65 64 20 6d 6f 64 65 2c 0a 23 20 20 20 2a 20 53  ed mode,.#   * S
08e0: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 6d  ingle-threaded m
08f0: 6f 64 65 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ode..#.ifcapable
0900: 20 74 68 72 65 61 64 73 61 66 65 31 26 26 73 68   threadsafe1&&sh
0910: 61 72 65 64 5f 63 61 63 68 65 20 7b 0a 20 20 73  ared_cache {.  s
0920: 65 74 20 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  et enable_shared
0930: 5f 63 61 63 68 65 20 5b 73 71 6c 69 74 65 33 5f  _cache [sqlite3_
0940: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
0950: 63 68 65 20 31 5d 0a 20 20 66 6f 72 65 61 63 68  che 1].  foreach
0960: 20 7b 6d 6f 64 65 20 6d 75 74 65 78 65 73 7d 20   {mode mutexes} 
0970: 7b 0a 20 20 20 20 73 69 6e 67 6c 65 74 68 72 65  {.    singlethre
0980: 61 64 20 7b 7d 0a 20 20 20 20 6d 75 6c 74 69 74  ad {}.    multit
0990: 68 72 65 61 64 20 20 7b 0a 20 20 20 20 20 20 66  hread  {.      f
09a0: 61 73 74 20 73 74 61 74 69 63 5f 61 70 70 31 20  ast static_app1 
09b0: 73 74 61 74 69 63 5f 61 70 70 32 20 73 74 61 74  static_app2 stat
09c0: 69 63 5f 61 70 70 33 0a 20 20 20 20 20 20 73 74  ic_app3.      st
09d0: 61 74 69 63 5f 6c 72 75 20 73 74 61 74 69 63 5f  atic_lru static_
09e0: 6d 61 73 74 65 72 20 73 74 61 74 69 63 5f 6d 65  master static_me
09f0: 6d 20 73 74 61 74 69 63 5f 6f 70 65 6e 0a 20 20  m static_open.  
0a00: 20 20 20 20 73 74 61 74 69 63 5f 70 72 6e 67 20      static_prng 
0a10: 73 74 61 74 69 63 5f 70 6d 65 6d 20 73 74 61 74  static_pmem stat
0a20: 69 63 5f 76 66 73 31 20 73 74 61 74 69 63 5f 76  ic_vfs1 static_v
0a30: 66 73 32 0a 20 20 20 20 20 20 73 74 61 74 69 63  fs2.      static
0a40: 5f 76 66 73 33 0a 20 20 20 20 7d 0a 20 20 20 20  _vfs3.    }.    
0a50: 73 65 72 69 61 6c 69 7a 65 64 20 20 7b 0a 20 20  serialized  {.  
0a60: 20 20 20 20 66 61 73 74 20 72 65 63 75 72 73 69      fast recursi
0a70: 76 65 20 73 74 61 74 69 63 5f 61 70 70 31 20 73  ve static_app1 s
0a80: 74 61 74 69 63 5f 61 70 70 32 0a 20 20 20 20 20  tatic_app2.     
0a90: 20 73 74 61 74 69 63 5f 61 70 70 33 20 73 74 61   static_app3 sta
0aa0: 74 69 63 5f 6c 72 75 20 73 74 61 74 69 63 5f 6d  tic_lru static_m
0ab0: 61 73 74 65 72 20 73 74 61 74 69 63 5f 6d 65 6d  aster static_mem
0ac0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 5f 6f 70  .      static_op
0ad0: 65 6e 20 73 74 61 74 69 63 5f 70 72 6e 67 20 73  en static_prng s
0ae0: 74 61 74 69 63 5f 70 6d 65 6d 20 73 74 61 74 69  tatic_pmem stati
0af0: 63 5f 76 66 73 31 0a 20 20 20 20 20 20 73 74 61  c_vfs1.      sta
0b00: 74 69 63 5f 76 66 73 32 20 73 74 61 74 69 63 5f  tic_vfs2 static_
0b10: 76 66 73 33 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  vfs3.    }.  } {
0b20: 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 6d 75  ..    do_test mu
0b30: 74 65 78 31 2e 32 2e 24 6d 6f 64 65 2e 31 20 7b  tex1.2.$mode.1 {
0b40: 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 64 62  .      catch {db
0b50: 20 63 6c 6f 73 65 7d 0a 20 20 20 20 20 20 73 71   close}.      sq
0b60: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
0b70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e       sqlite3_con
0b80: 66 69 67 20 24 6d 6f 64 65 0a 20 20 20 20 7d 20  fig $mode.    } 
0b90: 53 51 4c 49 54 45 5f 4f 4b 0a 0a 20 20 20 20 64  SQLITE_OK..    d
0ba0: 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2e 32 2e  o_test mutex1.2.
0bb0: 24 6d 6f 64 65 2e 32 20 7b 0a 20 20 20 20 20 20  $mode.2 {.      
0bc0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
0bd0: 7a 65 0a 20 20 20 20 20 20 63 6c 65 61 72 5f 6d  ze.      clear_m
0be0: 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 0a 20 20  utex_counters.  
0bf0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
0c00: 65 73 74 2e 64 62 20 2d 6e 6f 6d 75 74 65 78 20  est.db -nomutex 
0c10: 30 20 2d 66 75 6c 6c 6d 75 74 65 78 20 30 0a 20  0 -fullmutex 0. 
0c20: 20 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20       catchsql { 
0c30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
0c40: 28 61 2c 20 62 2c 20 63 29 20 7d 0a 20 20 20 20  (a, b, c) }.    
0c50: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
0c60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0c70: 61 62 63 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  abc VALUES(1, 2,
0c80: 20 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   3);.      }.   
0c90: 20 7d 20 7b 7d 0a 20 20 20 20 69 66 63 61 70 61   } {}.    ifcapa
0ca0: 62 6c 65 20 21 6d 65 6d 6f 72 79 6d 61 6e 61 67  ble !memorymanag
0cb0: 65 20 7b 0a 20 20 20 20 20 20 72 65 67 73 75 62  e {.      regsub
0cc0: 20 7b 20 73 74 61 74 69 63 5f 6c 72 75 7d 20 24   { static_lru} $
0cd0: 6d 75 74 65 78 65 73 20 7b 7d 20 6d 75 74 65 78  mutexes {} mutex
0ce0: 65 73 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  es.    }.    if 
0cf0: 7b 24 6d 6f 64 65 20 6e 65 20 22 73 69 6e 67 6c  {$mode ne "singl
0d00: 65 74 68 72 65 61 64 22 7d 20 7b 0a 20 20 20 20  ethread"} {.    
0d10: 20 20 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31    do_test mutex1
0d20: 2e 32 2e 24 6d 6f 64 65 2e 33 20 7b 0a 20 20 20  .2.$mode.3 {.   
0d30: 20 20 20 20 20 23 0a 20 20 20 20 20 20 20 20 23       #.        #
0d40: 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
0d50: 20 61 6c 6c 20 74 68 65 20 61 70 70 20 61 6e 64   all the app and
0d60: 20 76 66 73 20 6d 75 74 65 78 65 73 20 67 65 74   vfs mutexes get
0d70: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 20 20 23   used..        #
0d80: 0a 20 20 20 20 20 20 20 20 65 6e 74 65 72 5f 73  .        enter_s
0d90: 74 61 74 69 63 5f 6d 75 74 65 78 20 73 74 61 74  tatic_mutex stat
0da0: 69 63 5f 61 70 70 31 0a 20 20 20 20 20 20 20 20  ic_app1.        
0db0: 6c 65 61 76 65 5f 73 74 61 74 69 63 5f 6d 75 74  leave_static_mut
0dc0: 65 78 20 73 74 61 74 69 63 5f 61 70 70 31 0a 20  ex static_app1. 
0dd0: 20 20 20 20 20 20 20 65 6e 74 65 72 5f 73 74 61         enter_sta
0de0: 74 69 63 5f 6d 75 74 65 78 20 73 74 61 74 69 63  tic_mutex static
0df0: 5f 61 70 70 32 0a 20 20 20 20 20 20 20 20 6c 65  _app2.        le
0e00: 61 76 65 5f 73 74 61 74 69 63 5f 6d 75 74 65 78  ave_static_mutex
0e10: 20 73 74 61 74 69 63 5f 61 70 70 32 0a 20 20 20   static_app2.   
0e20: 20 20 20 20 20 65 6e 74 65 72 5f 73 74 61 74 69       enter_stati
0e30: 63 5f 6d 75 74 65 78 20 73 74 61 74 69 63 5f 61  c_mutex static_a
0e40: 70 70 33 0a 20 20 20 20 20 20 20 20 6c 65 61 76  pp3.        leav
0e50: 65 5f 73 74 61 74 69 63 5f 6d 75 74 65 78 20 73  e_static_mutex s
0e60: 74 61 74 69 63 5f 61 70 70 33 0a 20 20 20 20 20  tatic_app3.     
0e70: 20 20 20 65 6e 74 65 72 5f 73 74 61 74 69 63 5f     enter_static_
0e80: 6d 75 74 65 78 20 73 74 61 74 69 63 5f 76 66 73  mutex static_vfs
0e90: 31 0a 20 20 20 20 20 20 20 20 6c 65 61 76 65 5f  1.        leave_
0ea0: 73 74 61 74 69 63 5f 6d 75 74 65 78 20 73 74 61  static_mutex sta
0eb0: 74 69 63 5f 76 66 73 31 0a 20 20 20 20 20 20 20  tic_vfs1.       
0ec0: 20 65 6e 74 65 72 5f 73 74 61 74 69 63 5f 6d 75   enter_static_mu
0ed0: 74 65 78 20 73 74 61 74 69 63 5f 76 66 73 32 0a  tex static_vfs2.
0ee0: 20 20 20 20 20 20 20 20 6c 65 61 76 65 5f 73 74          leave_st
0ef0: 61 74 69 63 5f 6d 75 74 65 78 20 73 74 61 74 69  atic_mutex stati
0f00: 63 5f 76 66 73 32 0a 20 20 20 20 20 20 20 20 65  c_vfs2.        e
0f10: 6e 74 65 72 5f 73 74 61 74 69 63 5f 6d 75 74 65  nter_static_mute
0f20: 78 20 73 74 61 74 69 63 5f 76 66 73 33 0a 20 20  x static_vfs3.  
0f30: 20 20 20 20 20 20 6c 65 61 76 65 5f 73 74 61 74        leave_stat
0f40: 69 63 5f 6d 75 74 65 78 20 73 74 61 74 69 63 5f  ic_mutex static_
0f50: 76 66 73 33 0a 20 20 20 20 20 20 7d 20 7b 7d 0a  vfs3.      } {}.
0f60: 20 20 20 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73      }.    do_tes
0f70: 74 20 6d 75 74 65 78 31 2e 32 2e 24 6d 6f 64 65  t mutex1.2.$mode
0f80: 2e 34 20 7b 0a 20 20 20 20 20 20 6d 75 74 65 78  .4 {.      mutex
0f90: 5f 63 6f 75 6e 74 65 72 73 20 63 6f 75 6e 74 65  _counters counte
0fa0: 72 73 0a 0a 20 20 20 20 20 20 73 65 74 20 72 65  rs..      set re
0fb0: 73 20 5b 6c 69 73 74 5d 0a 20 20 20 20 20 20 66  s [list].      f
0fc0: 6f 72 65 61 63 68 20 7b 6b 65 79 20 76 61 6c 75  oreach {key valu
0fd0: 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 63 6f  e} [array get co
0fe0: 75 6e 74 65 72 73 5d 20 7b 0a 20 20 20 20 20 20  unters] {.      
0ff0: 20 20 69 66 20 7b 24 6b 65 79 20 6e 65 20 22 74    if {$key ne "t
1000: 6f 74 61 6c 22 20 26 26 20 24 76 61 6c 75 65 20  otal" && $value 
1010: 3e 20 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  > 0} {.         
1020: 20 6c 61 70 70 65 6e 64 20 72 65 73 20 24 6b 65   lappend res $ke
1030: 79 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  y.        }.    
1040: 20 20 7d 0a 20 20 20 20 20 20 6c 73 6f 72 74 20    }.      lsort 
1050: 24 72 65 73 0a 20 20 20 20 7d 20 5b 6c 73 6f 72  $res.    } [lsor
1060: 74 20 24 6d 75 74 65 78 65 73 5d 0a 20 20 7d 0a  t $mutexes].  }.
1070: 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
1080: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 24 65  _shared_cache $e
1090: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
10a0: 68 65 0a 0a 20 20 23 20 4f 70 65 6e 20 61 6e 64  he..  # Open and
10b0: 20 75 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f   use a connectio
10c0: 6e 20 69 6e 20 22 6e 6f 6d 75 74 65 78 22 20 6d  n in "nomutex" m
10d0: 6f 64 65 2e 20 54 65 73 74 20 74 68 61 74 20 6e  ode. Test that n
10e0: 6f 20 72 65 63 75 72 73 69 76 65 0a 20 20 23 20  o recursive.  # 
10f0: 6d 75 74 65 78 65 73 20 61 72 65 20 6f 62 74 61  mutexes are obta
1100: 69 6e 65 64 2e 0a 20 20 64 6f 5f 74 65 73 74 20  ined..  do_test 
1110: 6d 75 74 65 78 31 2e 33 2e 31 20 7b 0a 20 20 20  mutex1.3.1 {.   
1120: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
1130: 7d 0a 20 20 20 20 63 6c 65 61 72 5f 6d 75 74 65  }.    clear_mute
1140: 78 5f 63 6f 75 6e 74 65 72 73 0a 20 20 20 20 73  x_counters.    s
1150: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1160: 62 20 2d 6e 6f 6d 75 74 65 78 20 31 0a 20 20 20  b -nomutex 1.   
1170: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1180: 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 0a 20  T * FROM abc }. 
1190: 20 7d 20 7b 31 20 32 20 33 20 31 20 32 20 33 20   } {1 2 3 1 2 3 
11a0: 31 20 32 20 33 7d 0a 20 20 64 6f 5f 74 65 73 74  1 2 3}.  do_test
11b0: 20 6d 75 74 65 78 31 2e 33 2e 32 20 7b 0a 20 20   mutex1.3.2 {.  
11c0: 20 20 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72 73    mutex_counters
11d0: 20 63 6f 75 6e 74 65 72 73 0a 20 20 20 20 73 65   counters.    se
11e0: 74 20 63 6f 75 6e 74 65 72 73 28 72 65 63 75 72  t counters(recur
11f0: 73 69 76 65 29 0a 20 20 7d 20 7b 30 7d 0a 7d 0a  sive).  } {0}.}.
1200: 0a 23 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  .# Test the sqli
1210: 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 29 20 66  te3_db_mutex() f
1220: 75 6e 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  unction..#.do_te
1230: 73 74 20 6d 75 74 65 78 31 2e 34 2e 31 20 7b 0a  st mutex1.4.1 {.
1240: 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73    catch {db clos
1250: 65 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  e}.  sqlite3 db 
1260: 74 65 73 74 2e 64 62 0a 20 20 65 6e 74 65 72 5f  test.db.  enter_
1270: 64 62 5f 6d 75 74 65 78 20 64 62 0a 20 20 64 62  db_mutex db.  db
1280: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 31 2c   eval {SELECT 1,
1290: 20 32 2c 20 33 7d 0a 7d 20 7b 31 20 32 20 33 7d   2, 3}.} {1 2 3}
12a0: 0a 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2e  .do_test mutex1.
12b0: 34 2e 32 20 7b 0a 20 20 6c 65 61 76 65 5f 64 62  4.2 {.  leave_db
12c0: 5f 6d 75 74 65 78 20 64 62 0a 20 20 64 62 20 65  _mutex db.  db e
12d0: 76 61 6c 20 7b 53 45 4c 45 43 54 20 31 2c 20 32  val {SELECT 1, 2
12e0: 2c 20 33 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64  , 3}.} {1 2 3}.d
12f0: 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2e 34 2e  o_test mutex1.4.
1300: 33 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20  3 {.  catch {db 
1310: 63 6c 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33  close}.  sqlite3
1320: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 6e 6f 6d   db test.db -nom
1330: 75 74 65 78 20 31 0a 20 20 65 6e 74 65 72 5f 64  utex 1.  enter_d
1340: 62 5f 6d 75 74 65 78 20 64 62 0a 20 20 64 62 20  b_mutex db.  db 
1350: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 31 2c 20  eval {SELECT 1, 
1360: 32 2c 20 33 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a  2, 3}.} {1 2 3}.
1370: 64 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2e 34  do_test mutex1.4
1380: 2e 34 20 7b 0a 20 20 6c 65 61 76 65 5f 64 62 5f  .4 {.  leave_db_
1390: 6d 75 74 65 78 20 64 62 0a 20 20 64 62 20 65 76  mutex db.  db ev
13a0: 61 6c 20 7b 53 45 4c 45 43 54 20 31 2c 20 32 2c  al {SELECT 1, 2,
13b0: 20 33 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 0a 64   3}.} {1 2 3}..d
13c0: 6f 5f 74 65 73 74 20 6d 75 74 65 78 31 2d 58 20  o_test mutex1-X 
13d0: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c  {.  catch {db cl
13e0: 6f 73 65 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  ose}.  sqlite3_s
13f0: 68 75 74 64 6f 77 6e 0a 20 20 63 6c 65 61 72 5f  hutdown.  clear_
1400: 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 0a 20  mutex_counters. 
1410: 20 69 6e 73 74 61 6c 6c 5f 6d 75 74 65 78 5f 63   install_mutex_c
1420: 6f 75 6e 74 65 72 73 20 30 0a 20 20 73 71 6c 69  ounters 0.  sqli
1430: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a 7d  te3_initialize.}
1440: 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 0a 61 75   {SQLITE_OK}..au
1450: 74 6f 69 6e 73 74 61 6c 6c 5f 74 65 73 74 5f 66  toinstall_test_f
1460: 75 6e 63 74 69 6f 6e 73 0a 66 69 6e 69 73 68 5f  unctions.finish_
1470: 74 65 73 74 0a                                   test.