/ Hex Artifact Content
Login

Artifact 293042d623ebba969160f471a82aa1551626454f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4a 75 6e 65 20  /*.** 2008 June 
0010: 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  18.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 74 65 73 74 20 6c 6f 67  ontains test log
0190: 69 63 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ic for the sqlit
01a0: 65 33 5f 6d 75 74 65 78 20 69 6e 74 65 72 66 61  e3_mutex interfa
01b0: 63 65 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64  ces..*/..#includ
01c0: 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75  e "tcl.h".#inclu
01d0: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23  de "sqlite3.h".#
01e0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
01f0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0200: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
0210: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0220: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
0230: 3e 0a 0a 2f 2a 20 64 65 66 69 6e 65 64 20 69 6e  >../* defined in
0240: 20 6d 61 69 6e 2e 63 20 2a 2f 0a 65 78 74 65 72   main.c */.exter
0250: 6e 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  n const char *sq
0260: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74  lite3ErrName(int
0270: 29 3b 0a 0a 2f 2a 20 41 20 63 6f 75 6e 74 61 62  );../* A countab
0280: 6c 65 20 6d 75 74 65 78 20 2a 2f 0a 73 74 72 75  le mutex */.stru
0290: 63 74 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ct sqlite3_mutex
02a0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   {.  sqlite3_mut
02b0: 65 78 20 2a 70 52 65 61 6c 3b 0a 20 20 69 6e 74  ex *pReal;.  int
02c0: 20 65 54 79 70 65 3b 0a 7d 3b 0a 0a 2f 2a 20 53   eType;.};../* S
02d0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 2a  tate variables *
02e0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
02f0: 74 65 73 74 5f 6d 75 74 65 78 5f 67 6c 6f 62 61  test_mutex_globa
0300: 6c 73 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 73  ls {.  int isIns
0310: 74 61 6c 6c 65 64 3b 20 20 20 20 20 20 20 20 20  talled;         
0320: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0330: 69 6e 73 74 61 6c 6c 65 64 20 2a 2f 0a 20 20 69  installed */.  i
0340: 6e 74 20 64 69 73 61 62 6c 65 49 6e 69 74 3b 20  nt disableInit; 
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0360: 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 73 71  True to cause sq
0370: 6c 69 74 65 33 5f 69 6e 69 74 61 6c 69 7a 65 28  lite3_initalize(
0380: 29 20 74 6f 20 66 61 69 6c 20 2a 2f 0a 20 20 69  ) to fail */.  i
0390: 6e 74 20 64 69 73 61 62 6c 65 54 72 79 3b 20 20  nt disableTry;  
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
03b0: 54 72 75 65 20 74 6f 20 66 6f 72 63 65 20 73 71  True to force sq
03c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74 72 79 28  lite3_mutex_try(
03d0: 29 20 74 6f 20 66 61 69 6c 20 2a 2f 0a 20 20 69  ) to fail */.  i
03e0: 6e 74 20 69 73 49 6e 69 74 3b 20 20 20 20 20 20  nt isInit;      
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0400: 54 72 75 65 20 69 66 20 69 6e 69 74 69 61 6c 69  True if initiali
0410: 7a 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  zed */.  sqlite3
0420: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 20 6d  _mutex_methods m
0430: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 66  ;      /* Interf
0440: 61 63 65 20 74 6f 20 22 72 65 61 6c 22 20 6d 75  ace to "real" mu
0450: 74 65 78 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  tex system */.  
0460: 69 6e 74 20 61 43 6f 75 6e 74 65 72 5b 38 5d 3b  int aCounter[8];
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0480: 20 4e 75 6d 62 65 72 20 6f 66 20 67 72 61 62 73   Number of grabs
0490: 20 6f 66 20 65 61 63 68 20 74 79 70 65 20 6f 66   of each type of
04a0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 73 71 6c 69   mutex */.  sqli
04b0: 74 65 33 5f 6d 75 74 65 78 20 61 53 74 61 74 69  te3_mutex aStati
04c0: 63 5b 36 5d 3b 20 20 20 20 20 2f 2a 20 54 68 65  c[6];     /* The
04d0: 20 73 69 78 20 73 74 61 74 69 63 20 6d 75 74 65   six static mute
04e0: 78 65 73 20 2a 2f 0a 7d 20 67 20 3d 20 7b 30 7d  xes */.} g = {0}
04f0: 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  ;../* Return tru
0500: 65 20 69 66 20 74 68 65 20 63 6f 75 6e 74 61 62  e if the countab
0510: 6c 65 20 6d 75 74 65 78 20 69 73 20 63 75 72 72  le mutex is curr
0520: 65 6e 74 6c 79 20 68 65 6c 64 20 2a 2f 0a 73 74  ently held */.st
0530: 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 65 72  atic int counter
0540: 4d 75 74 65 78 48 65 6c 64 28 73 71 6c 69 74 65  MutexHeld(sqlite
0550: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 72  3_mutex *p){.  r
0560: 65 74 75 72 6e 20 67 2e 6d 2e 78 4d 75 74 65 78  eturn g.m.xMutex
0570: 48 65 6c 64 28 70 2d 3e 70 52 65 61 6c 29 3b 0a  Held(p->pReal);.
0580: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  }../* Return tru
0590: 65 20 69 66 20 74 68 65 20 63 6f 75 6e 74 61 62  e if the countab
05a0: 6c 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20  le mutex is not 
05b0: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 2a  currently held *
05c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
05d0: 6e 74 65 72 4d 75 74 65 78 4e 6f 74 68 65 6c 64  nterMutexNotheld
05e0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
05f0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 6d  p){.  return g.m
0600: 2e 78 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 70  .xMutexNotheld(p
0610: 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20  ->pReal);.}../* 
0620: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
0630: 6f 75 6e 74 61 62 6c 65 20 6d 75 74 65 78 20 69  ountable mutex i
0640: 6e 74 65 72 66 61 63 65 0a 2a 2a 20 4f 72 2c 20  nterface.** Or, 
0650: 69 66 20 67 2e 64 69 73 61 62 6c 65 49 6e 69 74  if g.disableInit
0660: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
0670: 65 6e 20 64 6f 20 6e 6f 74 20 69 6e 69 74 69 61  en do not initia
0680: 6c 69 7a 65 20 62 75 74 20 69 6e 73 74 65 61 64  lize but instead
0690: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 76  .** return the v
06a0: 61 6c 75 65 20 6f 66 20 67 2e 64 69 73 61 62 6c  alue of g.disabl
06b0: 65 49 6e 69 74 20 61 73 20 74 68 65 20 72 65 73  eInit as the res
06c0: 75 6c 74 20 63 6f 64 65 2e 20 20 54 68 69 73 20  ult code.  This 
06d0: 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 74  can be used.** t
06e0: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
06f0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
0700: 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
0710: 69 6e 74 20 63 6f 75 6e 74 65 72 4d 75 74 65 78  int counterMutex
0720: 49 6e 69 74 28 76 6f 69 64 29 7b 20 0a 20 20 69  Init(void){ .  i
0730: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 67 2e 64  nt rc;.  if( g.d
0740: 69 73 61 62 6c 65 49 6e 69 74 20 29 20 72 65 74  isableInit ) ret
0750: 75 72 6e 20 67 2e 64 69 73 61 62 6c 65 49 6e 69  urn g.disableIni
0760: 74 3b 0a 20 20 72 63 20 3d 20 67 2e 6d 2e 78 4d  t;.  rc = g.m.xM
0770: 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 67 2e  utexInit();.  g.
0780: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65  isInit = 1;.  re
0790: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
07a0: 2a 20 55 6e 69 6e 69 74 69 61 6c 69 7a 65 20 74  * Uninitialize t
07b0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
07c0: 65 6d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  em.*/.static int
07d0: 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 45 6e 64   counterMutexEnd
07e0: 28 76 6f 69 64 29 7b 20 0a 20 20 67 2e 69 73 49  (void){ .  g.isI
07f0: 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nit = 0;.  retur
0800: 6e 20 67 2e 6d 2e 78 4d 75 74 65 78 45 6e 64 28  n g.m.xMutexEnd(
0810: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
0820: 63 61 74 65 20 61 20 63 6f 75 6e 74 61 62 6c 65  cate a countable
0830: 20 6d 75 74 65 78 0a 2a 2f 0a 73 74 61 74 69 63   mutex.*/.static
0840: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
0850: 63 6f 75 6e 74 65 72 4d 75 74 65 78 41 6c 6c 6f  counterMutexAllo
0860: 63 28 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20  c(int eType){.  
0870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0880: 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Real;.  sqlite3_
0890: 6d 75 74 65 78 20 2a 70 52 65 74 20 3d 20 30 3b  mutex *pRet = 0;
08a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 67 2e 69 73  ..  assert( g.is
08b0: 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
08c0: 28 65 54 79 70 65 3c 38 20 26 26 20 65 54 79 70  (eType<8 && eTyp
08d0: 65 3e 3d 30 29 3b 0a 0a 20 20 70 52 65 61 6c 20  e>=0);..  pReal 
08e0: 3d 20 67 2e 6d 2e 78 4d 75 74 65 78 41 6c 6c 6f  = g.m.xMutexAllo
08f0: 63 28 65 54 79 70 65 29 3b 0a 20 20 69 66 28 20  c(eType);.  if( 
0900: 21 70 52 65 61 6c 20 29 20 72 65 74 75 72 6e 20  !pReal ) return 
0910: 30 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  0;..  if( eType=
0920: 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  =SQLITE_MUTEX_FA
0930: 53 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  ST || eType==SQL
0940: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
0950: 49 56 45 20 29 7b 0a 20 20 20 20 70 52 65 74 20  IVE ){.    pRet 
0960: 3d 20 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  = (sqlite3_mutex
0970: 20 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   *)malloc(sizeof
0980: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 29 29  (sqlite3_mutex))
0990: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
09a0: 52 65 74 20 3d 20 26 67 2e 61 53 74 61 74 69 63  Ret = &g.aStatic
09b0: 5b 65 54 79 70 65 2d 32 5d 3b 0a 20 20 7d 0a 0a  [eType-2];.  }..
09c0: 20 20 70 52 65 74 2d 3e 65 54 79 70 65 20 3d 20    pRet->eType = 
09d0: 65 54 79 70 65 3b 0a 20 20 70 52 65 74 2d 3e 70  eType;.  pRet->p
09e0: 52 65 61 6c 20 3d 20 70 52 65 61 6c 3b 0a 20 20  Real = pReal;.  
09f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
0a00: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 63 6f 75  /*.** Free a cou
0a10: 6e 74 61 62 6c 65 20 6d 75 74 65 78 0a 2a 2f 0a  ntable mutex.*/.
0a20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 75 6e  static void coun
0a30: 74 65 72 4d 75 74 65 78 46 72 65 65 28 73 71 6c  terMutexFree(sql
0a40: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  ite3_mutex *p){.
0a50: 20 20 61 73 73 65 72 74 28 20 67 2e 69 73 49 6e    assert( g.isIn
0a60: 69 74 20 29 3b 0a 20 20 67 2e 6d 2e 78 4d 75 74  it );.  g.m.xMut
0a70: 65 78 46 72 65 65 28 70 2d 3e 70 52 65 61 6c 29  exFree(p->pReal)
0a80: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65  ;.  if( p->eType
0a90: 3d 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  ==SQLITE_MUTEX_F
0aa0: 41 53 54 20 7c 7c 20 70 2d 3e 65 54 79 70 65 3d  AST || p->eType=
0ab0: 3d 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  =SQLITE_MUTEX_RE
0ac0: 43 55 52 53 49 56 45 20 29 7b 0a 20 20 20 20 66  CURSIVE ){.    f
0ad0: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
0ae0: 2a 0a 2a 2a 20 45 6e 74 65 72 20 61 20 63 6f 75  *.** Enter a cou
0af0: 6e 74 61 62 6c 65 20 6d 75 74 65 78 2e 20 20 42  ntable mutex.  B
0b00: 6c 6f 63 6b 20 75 6e 74 69 6c 20 65 6e 74 72 79  lock until entry
0b10: 20 69 73 20 73 61 66 65 2e 0a 2a 2f 0a 73 74 61   is safe..*/.sta
0b20: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 65 72  tic void counter
0b30: 4d 75 74 65 78 45 6e 74 65 72 28 73 71 6c 69 74  MutexEnter(sqlit
0b40: 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20  e3_mutex *p){.  
0b50: 61 73 73 65 72 74 28 20 67 2e 69 73 49 6e 69 74  assert( g.isInit
0b60: 20 29 3b 0a 20 20 67 2e 61 43 6f 75 6e 74 65 72   );.  g.aCounter
0b70: 5b 70 2d 3e 65 54 79 70 65 5d 2b 2b 3b 0a 20 20  [p->eType]++;.  
0b80: 67 2e 6d 2e 78 4d 75 74 65 78 45 6e 74 65 72 28  g.m.xMutexEnter(
0b90: 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
0ba0: 0a 2a 2a 20 54 72 79 20 74 6f 20 65 6e 74 65 72  .** Try to enter
0bb0: 20 61 20 6d 75 74 65 78 2e 20 20 52 65 74 75 72   a mutex.  Retur
0bc0: 6e 20 74 72 75 65 20 6f 6e 20 73 75 63 63 65 73  n true on succes
0bd0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
0be0: 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 54 72 79   counterMutexTry
0bf0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
0c00: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 67 2e  p){.  assert( g.
0c10: 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 2e 61 43  isInit );.  g.aC
0c20: 6f 75 6e 74 65 72 5b 70 2d 3e 65 54 79 70 65 5d  ounter[p->eType]
0c30: 2b 2b 3b 0a 20 20 69 66 28 20 67 2e 64 69 73 61  ++;.  if( g.disa
0c40: 62 6c 65 54 72 79 20 29 20 72 65 74 75 72 6e 20  bleTry ) return 
0c50: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 72  SQLITE_BUSY;.  r
0c60: 65 74 75 72 6e 20 67 2e 6d 2e 78 4d 75 74 65 78  eturn g.m.xMutex
0c70: 54 72 79 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d  Try(p->pReal);.}
0c80: 0a 0a 2f 2a 20 4c 65 61 76 65 20 61 20 6d 75 74  ../* Leave a mut
0c90: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
0ca0: 64 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 4c 65  d counterMutexLe
0cb0: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
0cc0: 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
0cd0: 20 67 2e 69 73 49 6e 69 74 20 29 3b 0a 20 20 67   g.isInit );.  g
0ce0: 2e 6d 2e 78 4d 75 74 65 78 4c 65 61 76 65 28 70  .m.xMutexLeave(p
0cf0: 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
0d00: 2a 2a 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ** sqlite3_shutd
0d10: 6f 77 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  own.*/.static in
0d20: 74 20 74 65 73 74 5f 73 68 75 74 64 6f 77 6e 28  t test_shutdown(
0d30: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
0d40: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
0d50: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
0d60: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
0d70: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
0d80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
0d90: 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
0da0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
0db0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
0dc0: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
0dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0de0: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
0df0: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a  te3_shutdown();.
0e00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
0e10: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
0e20: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
0e30: 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  c), TCL_VOLATILE
0e40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
0e50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  OK;.}../*.** sql
0e60: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a  ite3_initialize.
0e70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
0e80: 73 74 5f 69 6e 69 74 69 61 6c 69 7a 65 28 0a 20  st_initialize(. 
0e90: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
0ea0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
0eb0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
0ec0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
0ed0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
0ee0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
0ef0: 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
0f00: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
0f10: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
0f20: 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
0f30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0f40: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
0f50: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
0f60: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
0f70: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
0f80: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
0f90: 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  c), TCL_VOLATILE
0fa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
0fb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 69 6e 73  OK;.}../*.** ins
0fc0: 74 61 6c 6c 5f 6d 75 74 65 78 5f 63 6f 75 6e 74  tall_mutex_count
0fd0: 65 72 73 20 42 4f 4f 4c 45 41 4e 0a 2a 2f 0a 73  ers BOOLEAN.*/.s
0fe0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69  tatic int test_i
0ff0: 6e 73 74 61 6c 6c 5f 6d 75 74 65 78 5f 63 6f 75  nstall_mutex_cou
1000: 6e 74 65 72 73 28 0a 20 20 76 6f 69 64 20 2a 20  nters(.  void * 
1010: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1020: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1030: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1040: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1050: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
1060: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1070: 20 69 6e 74 20 69 73 49 6e 73 74 61 6c 6c 3b 0a   int isInstall;.
1080: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1090: 5f 6d 65 74 68 6f 64 73 20 63 6f 75 6e 74 65 72  _methods counter
10a0: 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  _methods = {.   
10b0: 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 49 6e 69   counterMutexIni
10c0: 74 2c 0a 20 20 20 20 63 6f 75 6e 74 65 72 4d 75  t,.    counterMu
10d0: 74 65 78 45 6e 64 2c 0a 20 20 20 20 63 6f 75 6e  texEnd,.    coun
10e0: 74 65 72 4d 75 74 65 78 41 6c 6c 6f 63 2c 0a 20  terMutexAlloc,. 
10f0: 20 20 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 46     counterMutexF
1100: 72 65 65 2c 0a 20 20 20 20 63 6f 75 6e 74 65 72  ree,.    counter
1110: 4d 75 74 65 78 45 6e 74 65 72 2c 0a 20 20 20 20  MutexEnter,.    
1120: 63 6f 75 6e 74 65 72 4d 75 74 65 78 54 72 79 2c  counterMutexTry,
1130: 0a 20 20 20 20 63 6f 75 6e 74 65 72 4d 75 74 65  .    counterMute
1140: 78 4c 65 61 76 65 2c 0a 20 20 20 20 63 6f 75 6e  xLeave,.    coun
1150: 74 65 72 4d 75 74 65 78 48 65 6c 64 2c 0a 20 20  terMutexHeld,.  
1160: 20 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 4e 6f    counterMutexNo
1170: 74 68 65 6c 64 0a 20 20 7d 3b 0a 0a 20 20 69 66  theld.  };..  if
1180: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1190: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
11a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
11b0: 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  v, "BOOLEAN");. 
11c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
11e0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
11f0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
1200: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69  erp, objv[1], &i
1210: 73 49 6e 73 74 61 6c 6c 29 20 29 7b 0a 20 20 20  sInstall) ){.   
1220: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1230: 52 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  R;.  }..  assert
1240: 28 69 73 49 6e 73 74 61 6c 6c 3d 3d 30 20 7c 7c  (isInstall==0 ||
1250: 20 69 73 49 6e 73 74 61 6c 6c 3d 3d 31 29 3b 0a   isInstall==1);.
1260: 20 20 61 73 73 65 72 74 28 67 2e 69 73 49 6e 73    assert(g.isIns
1270: 74 61 6c 6c 65 64 3d 3d 30 20 7c 7c 20 67 2e 69  talled==0 || g.i
1280: 73 49 6e 73 74 61 6c 6c 65 64 3d 3d 31 29 3b 0a  sInstalled==1);.
1290: 20 20 69 66 28 20 69 73 49 6e 73 74 61 6c 6c 3d    if( isInstall=
12a0: 3d 67 2e 69 73 49 6e 73 74 61 6c 6c 65 64 20 29  =g.isInstalled )
12b0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
12c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12d0: 6d 75 74 65 78 20 63 6f 75 6e 74 65 72 73 20 61  mutex counters a
12e0: 72 65 20 22 2c 20 30 29 3b 0a 20 20 20 20 54 63  re ", 0);.    Tc
12f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1300: 6e 74 65 72 70 2c 20 69 73 49 6e 73 74 61 6c 6c  nterp, isInstall
1310: 3f 22 61 6c 72 65 61 64 79 20 69 6e 73 74 61 6c  ?"already instal
1320: 6c 65 64 22 3a 22 6e 6f 74 20 69 6e 73 74 61 6c  led":"not instal
1330: 6c 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  led", 0);.    re
1340: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1350: 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 49 6e 73    }..  if( isIns
1360: 74 61 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  tall ){.    asse
1370: 72 74 28 20 67 2e 6d 2e 78 4d 75 74 65 78 41 6c  rt( g.m.xMutexAl
1380: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  loc==0 );.    rc
1390: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69   = sqlite3_confi
13a0: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
13b0: 47 45 54 4d 55 54 45 58 2c 20 26 67 2e 6d 29 3b  GETMUTEX, &g.m);
13c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
13f0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
1400: 45 58 2c 20 26 63 6f 75 6e 74 65 72 5f 6d 65 74  EX, &counter_met
1410: 68 6f 64 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hods);.    }.   
1420: 20 67 2e 64 69 73 61 62 6c 65 54 72 79 20 3d 20   g.disableTry = 
1430: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1440: 61 73 73 65 72 74 28 20 67 2e 6d 2e 78 4d 75 74  assert( g.m.xMut
1450: 65 78 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 72  exAlloc );.    r
1460: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  c = sqlite3_conf
1470: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
1480: 5f 4d 55 54 45 58 2c 20 26 67 2e 6d 29 3b 0a 20  _MUTEX, &g.m);. 
1490: 20 20 20 6d 65 6d 73 65 74 28 26 67 2e 6d 2c 20     memset(&g.m, 
14a0: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
14b0: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 29  3_mutex_methods)
14c0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
14d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14e0: 20 20 20 67 2e 69 73 49 6e 73 74 61 6c 6c 65 64     g.isInstalled
14f0: 20 3d 20 69 73 49 6e 73 74 61 6c 6c 3b 0a 20 20   = isInstall;.  
1500: 7d 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  }..  Tcl_SetResu
1510: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1520: 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
1530: 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  e(rc), TCL_VOLAT
1540: 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ILE);.  return T
1550: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1560: 72 65 61 64 5f 6d 75 74 65 78 5f 63 6f 75 6e 74  read_mutex_count
1570: 65 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ers.*/.static in
1580: 74 20 74 65 73 74 5f 72 65 61 64 5f 6d 75 74 65  t test_read_mute
1590: 78 5f 63 6f 75 6e 74 65 72 73 28 0a 20 20 76 6f  x_counters(.  vo
15a0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15c0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15d0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15e0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15f0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20  Tcl_Obj *pRet;. 
1600: 20 69 6e 74 20 69 69 3b 0a 20 20 63 68 61 72 20   int ii;.  char 
1610: 2a 61 4e 61 6d 65 5b 38 5d 20 3d 20 7b 0a 20 20  *aName[8] = {.  
1620: 20 20 22 66 61 73 74 22 2c 20 20 20 20 20 20 20    "fast",       
1630: 20 22 72 65 63 75 72 73 69 76 65 22 2c 20 20 20   "recursive",   
1640: 22 73 74 61 74 69 63 5f 6d 61 73 74 65 72 22 2c  "static_master",
1650: 20 22 73 74 61 74 69 63 5f 6d 65 6d 22 2c 20 0a   "static_mem", .
1660: 20 20 20 20 22 73 74 61 74 69 63 5f 6f 70 65 6e      "static_open
1670: 22 2c 20 22 73 74 61 74 69 63 5f 70 72 6e 67 22  ", "static_prng"
1680: 2c 20 22 73 74 61 74 69 63 5f 6c 72 75 22 2c 20  , "static_lru", 
1690: 20 20 20 22 73 74 61 74 69 63 5f 70 6d 65 6d 22     "static_pmem"
16a0: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
16b0: 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
16c0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
16d0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
16e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1700: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
1710: 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  j();.  Tcl_IncrR
1720: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
1730: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 38 3b   for(ii=0; ii<8;
1740: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f   ii++){.    Tcl_
1750: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1760: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
1770: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
1780: 4f 62 6a 28 61 4e 61 6d 65 5b 69 69 5d 2c 20 2d  Obj(aName[ii], -
1790: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
17a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
17b0: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
17c0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 67 2e  Tcl_NewIntObj(g.
17d0: 61 43 6f 75 6e 74 65 72 5b 69 69 5d 29 29 3b 0a  aCounter[ii]));.
17e0: 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
17f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
1800: 52 65 74 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  Ret);.  Tcl_Decr
1810: 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
1820: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 6c 65 61 72  ;.}../*.** clear
1840: 5f 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 0a  _mutex_counters.
1850: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1860: 73 74 5f 63 6c 65 61 72 5f 6d 75 74 65 78 5f 63  st_clear_mutex_c
1870: 6f 75 6e 74 65 72 73 28 0a 20 20 76 6f 69 64 20  ounters(.  void 
1880: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1890: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18a0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18c0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
18d0: 20 69 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   ii;..  if( objc
18e0: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
18f0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1900: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
1910: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1920: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66  _ERROR;.  }..  f
1930: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 38 3b 20 69  or(ii=0; ii<8; i
1940: 69 2b 2b 29 7b 0a 20 20 20 20 67 2e 61 43 6f 75  i++){.    g.aCou
1950: 6e 74 65 72 5b 69 69 5d 20 3d 20 30 3b 0a 20 20  nter[ii] = 0;.  
1960: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1970: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
1980: 74 65 20 61 6e 64 20 66 72 65 65 20 61 20 6d 75  te and free a mu
1990: 74 65 78 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tex.  Return the
19a0: 20 6d 75 74 65 78 20 70 6f 69 6e 74 65 72 2e 20   mutex pointer. 
19b0: 20 54 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   The pointer.** 
19c0: 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 20  will be invalid 
19d0: 73 69 6e 63 65 20 74 68 65 20 6d 75 74 65 78 20  since the mutex 
19e0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19f0: 20 66 72 65 65 64 2e 20 20 54 68 65 0a 2a 2a 20   freed.  The.** 
1a00: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 6a  return pointer j
1a10: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
1a20: 65 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 72  e if the mutex r
1a30: 65 61 6c 6c 79 20 77 61 73 20 61 6c 6c 6f 63 61  eally was alloca
1a40: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1a50: 6e 74 20 74 65 73 74 5f 61 6c 6c 6f 63 5f 6d 75  nt test_alloc_mu
1a60: 74 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tex(.  void * cl
1a70: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a90: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1aa0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1ab0: 76 5b 5d 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  v[].){.#if SQLIT
1ac0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73  E_THREADSAFE.  s
1ad0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 20  qlite3_mutex *p 
1ae0: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1af0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1b00: 45 58 5f 46 41 53 54 29 3b 0a 20 20 63 68 61 72  EX_FAST);.  char
1b10: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 73 71   zBuf[100];.  sq
1b20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1b30: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  (p);.  sqlite3_s
1b40: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1b50: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22  Buf), zBuf, "%p"
1b60: 2c 20 70 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , p);.  Tcl_Appe
1b70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b80: 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
1b90: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1ba0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1bb0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  ** sqlite3_confi
1bc0: 67 20 4f 50 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 4f  g OPTION.**.** O
1bd0: 50 54 49 4f 4e 20 63 61 6e 20 62 65 20 65 69 74  PTION can be eit
1be0: 68 65 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  her one of the k
1bf0: 65 79 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  eywords:.**.**  
1c00: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c10: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
1c20: 52 45 41 44 0a 2a 2a 20 20 20 20 20 20 20 20 20  READ.**         
1c30: 20 20 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47     SQLITE_CONFIG
1c40: 5f 4d 55 4c 54 49 54 48 52 45 41 44 0a 2a 2a 20  _MULTITHREAD.** 
1c50: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1c60: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
1c70: 5a 45 44 0a 2a 2a 0a 2a 2a 20 4f 72 20 4f 50 54  ZED.**.** Or OPT
1c80: 49 4f 4e 20 63 61 6e 20 62 65 20 61 6e 20 72 61  ION can be an ra
1c90: 77 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  w integer..*/.st
1ca0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1cb0: 6e 66 69 67 28 0a 20 20 76 6f 69 64 20 2a 20 63  nfig(.  void * c
1cc0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1cd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ce0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1cf0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d00: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
1d10: 20 43 6f 6e 66 69 67 4f 70 74 69 6f 6e 20 7b 0a   ConfigOption {.
1d20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d30: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69  zName;.    int i
1d40: 56 61 6c 75 65 3b 0a 20 20 7d 20 61 4f 70 74 5b  Value;.  } aOpt[
1d50: 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 73 69 6e 67  ] = {.    {"sing
1d60: 6c 65 74 68 72 65 61 64 22 2c 20 53 51 4c 49 54  lethread", SQLIT
1d70: 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54  E_CONFIG_SINGLET
1d80: 48 52 45 41 44 7d 2c 0a 20 20 20 20 7b 22 6d 75  HREAD},.    {"mu
1d90: 6c 74 69 74 68 72 65 61 64 22 2c 20 20 53 51 4c  ltithread",  SQL
1da0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49  ITE_CONFIG_MULTI
1db0: 54 48 52 45 41 44 7d 2c 0a 20 20 20 20 7b 22 73  THREAD},.    {"s
1dc0: 65 72 69 61 6c 69 7a 65 64 22 2c 20 20 20 53 51  erialized",   SQ
1dd0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49  LITE_CONFIG_SERI
1de0: 41 4c 49 5a 45 44 7d 2c 0a 20 20 20 20 7b 30 2c  ALIZED},.    {0,
1df0: 20 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 73   0}.  };.  int s
1e00: 20 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74   = sizeof(struct
1e10: 20 43 6f 6e 66 69 67 4f 70 74 69 6f 6e 29 3b 0a   ConfigOption);.
1e20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
1e30: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
1e40: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1e50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1e60: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
1e70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e80: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1e90: 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
1ea0: 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72  mObjStruct(inter
1eb0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 4f 70 74  p, objv[1], aOpt
1ec0: 2c 20 73 2c 20 22 66 6c 61 67 22 2c 20 30 2c 20  , s, "flag", 0, 
1ed0: 26 69 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54  &i) ){.    if( T
1ee0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1ef0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
1f00: 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 20 20 72  , &i) ){.      r
1f10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f20: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1f30: 20 20 20 20 69 20 3d 20 61 4f 70 74 5b 69 5d 2e      i = aOpt[i].
1f40: 69 56 61 6c 75 65 3b 0a 20 20 7d 0a 0a 20 20 72  iValue;.  }..  r
1f50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  c = sqlite3_conf
1f60: 69 67 28 69 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ig(i);.  Tcl_Set
1f70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1f80: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
1f90: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
1fa0: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75  OLATILE);.  retu
1fb0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74  rn TCL_OK;.}..st
1fc0: 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 67 65  atic sqlite3 *ge
1fd0: 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49  tDbPointer(Tcl_I
1fe0: 6e 74 65 72 70 20 2a 70 49 6e 74 65 72 70 2c 20  nterp *pInterp, 
1ff0: 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 29 7b 0a  Tcl_Obj *pObj){.
2000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2010: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66   Tcl_CmdInfo inf
2020: 6f 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64 20  o;.  char *zCmd 
2030: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2040: 70 4f 62 6a 29 3b 0a 20 20 69 66 28 20 54 63 6c  pObj);.  if( Tcl
2050: 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
2060: 70 49 6e 74 65 72 70 2c 20 7a 43 6d 64 2c 20 26  pInterp, zCmd, &
2070: 69 6e 66 6f 29 20 29 7b 0a 20 20 20 20 64 62 20  info) ){.    db 
2080: 3d 20 2a 28 28 73 71 6c 69 74 65 33 20 2a 2a 29  = *((sqlite3 **)
2090: 69 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  info.objClientDa
20a0: 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ta);.  }else{.  
20b0: 20 20 64 62 20 3d 20 28 73 71 6c 69 74 65 33 2a    db = (sqlite3*
20c0: 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74  )sqlite3TestText
20d0: 54 6f 50 74 72 28 7a 43 6d 64 29 3b 0a 20 20 7d  ToPtr(zCmd);.  }
20e0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b  .  assert( db );
20f0: 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a  .  return db;.}.
2100: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2110: 5f 65 6e 74 65 72 5f 64 62 5f 6d 75 74 65 78 28  _enter_db_mutex(
2120: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2130: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2140: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2150: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2160: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2170: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2180: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
2190: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
21a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
21b0: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
21c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
21d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
21e0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
21f0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a  terp, objv[1]);.
2200: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
2210: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2220: 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
2230: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
2240: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 64 62  ite3_db_mutex(db
2250: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
2260: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
2270: 6e 74 20 74 65 73 74 5f 6c 65 61 76 65 5f 64 62  nt test_leave_db
2280: 5f 6d 75 74 65 78 28 0a 20 20 76 6f 69 64 20 2a  _mutex(.  void *
2290: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
22a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22b0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
22c0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
22d0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
22e0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f  te3 *db;.  if( o
22f0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2300: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2310: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2320: 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
2330: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2340: 0a 20 20 64 62 20 3d 20 67 65 74 44 62 50 6f 69  .  db = getDbPoi
2350: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a  nter(interp, obj
2360: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 21 64 62  v[1]);.  if( !db
2370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2380: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2390: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
23a0: 61 76 65 28 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ave(sqlite3_db_m
23b0: 75 74 65 78 28 64 62 29 29 3b 0a 20 20 72 65 74  utex(db));.  ret
23c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 69  urn TCL_OK;.}..i
23d0: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
23e0: 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
23f0: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
2400: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
2410: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2420: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  .    Tcl_ObjCmdP
2430: 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20  roc *xProc;.  } 
2440: 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aCmd[] = {.    {
2450: 20 22 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f   "sqlite3_shutdo
2460: 77 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  wn",        (Tcl
2470: 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 74 65 73  _ObjCmdProc*)tes
2480: 74 5f 73 68 75 74 64 6f 77 6e 20 7d 2c 0a 20 20  t_shutdown },.  
2490: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 69    { "sqlite3_ini
24a0: 74 69 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 28  tialize",      (
24b0: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
24c0: 74 65 73 74 5f 69 6e 69 74 69 61 6c 69 7a 65 20  test_initialize 
24d0: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
24e0: 33 5f 63 6f 6e 66 69 67 22 2c 20 20 20 20 20 20  3_config",      
24f0: 20 20 20 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50      (Tcl_ObjCmdP
2500: 72 6f 63 2a 29 74 65 73 74 5f 63 6f 6e 66 69 67  roc*)test_config
2510: 20 7d 2c 0a 0a 20 20 20 20 7b 20 22 65 6e 74 65   },..    { "ente
2520: 72 5f 64 62 5f 6d 75 74 65 78 22 2c 20 20 20 20  r_db_mutex",    
2530: 20 20 20 20 20 20 28 54 63 6c 5f 4f 62 6a 43 6d        (Tcl_ObjCm
2540: 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 6e 74 65  dProc*)test_ente
2550: 72 5f 64 62 5f 6d 75 74 65 78 20 7d 2c 0a 20 20  r_db_mutex },.  
2560: 20 20 7b 20 22 6c 65 61 76 65 5f 64 62 5f 6d 75    { "leave_db_mu
2570: 74 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 28  tex",          (
2580: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
2590: 74 65 73 74 5f 6c 65 61 76 65 5f 64 62 5f 6d 75  test_leave_db_mu
25a0: 74 65 78 20 7d 2c 0a 0a 20 20 20 20 7b 20 22 61  tex },..    { "a
25b0: 6c 6c 6f 63 5f 64 65 61 6c 6c 6f 63 5f 6d 75 74  lloc_dealloc_mut
25c0: 65 78 22 2c 20 20 20 20 20 28 54 63 6c 5f 4f 62  ex",     (Tcl_Ob
25d0: 6a 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 61  jCmdProc*)test_a
25e0: 6c 6c 6f 63 5f 6d 75 74 65 78 20 7d 2c 0a 20 20  lloc_mutex },.  
25f0: 20 20 7b 20 22 69 6e 73 74 61 6c 6c 5f 6d 75 74    { "install_mut
2600: 65 78 5f 63 6f 75 6e 74 65 72 73 22 2c 20 20 28  ex_counters",  (
2610: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
2620: 74 65 73 74 5f 69 6e 73 74 61 6c 6c 5f 6d 75 74  test_install_mut
2630: 65 78 5f 63 6f 75 6e 74 65 72 73 20 7d 2c 0a 20  ex_counters },. 
2640: 20 20 20 7b 20 22 72 65 61 64 5f 6d 75 74 65 78     { "read_mutex
2650: 5f 63 6f 75 6e 74 65 72 73 22 2c 20 20 20 20 20  _counters",     
2660: 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
2670: 29 74 65 73 74 5f 72 65 61 64 5f 6d 75 74 65 78  )test_read_mutex
2680: 5f 63 6f 75 6e 74 65 72 73 20 7d 2c 0a 20 20 20  _counters },.   
2690: 20 7b 20 22 63 6c 65 61 72 5f 6d 75 74 65 78 5f   { "clear_mutex_
26a0: 63 6f 75 6e 74 65 72 73 22 2c 20 20 20 20 28 54  counters",    (T
26b0: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 74  cl_ObjCmdProc*)t
26c0: 65 73 74 5f 63 6c 65 61 72 5f 6d 75 74 65 78 5f  est_clear_mutex_
26d0: 63 6f 75 6e 74 65 72 73 20 7d 2c 0a 20 20 7d 3b  counters },.  };
26e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
26f0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43  i=0; i<sizeof(aC
2700: 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b  md)/sizeof(aCmd[
2710: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
2720: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
2730: 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64  and(interp, aCmd
2740: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b  [i].zName, aCmd[
2750: 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
2760: 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 4c 69 6e 6b  .  }..  Tcl_Link
2770: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 64 69 73  Var(interp, "dis
2780: 61 62 6c 65 5f 6d 75 74 65 78 5f 69 6e 69 74 22  able_mutex_init"
2790: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
27a0: 20 28 63 68 61 72 2a 29 26 67 2e 64 69 73 61 62   (char*)&g.disab
27b0: 6c 65 49 6e 69 74 2c 20 54 43 4c 5f 4c 49 4e 4b  leInit, TCL_LINK
27c0: 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
27d0: 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 64 69  kVar(interp, "di
27e0: 73 61 62 6c 65 5f 6d 75 74 65 78 5f 74 72 79 22  sable_mutex_try"
27f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2800: 20 28 63 68 61 72 2a 29 26 67 2e 64 69 73 61 62   (char*)&g.disab
2810: 6c 65 54 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  leTry, TCL_LINK_
2820: 49 4e 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  INT);.  return S
2830: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a              QLITE_OK;.}.