/ Hex Artifact Content
Login

Artifact d3422d9f60cc1330249d102e74b333f0d24a0cb6:


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 0a 2a 2a 20 24 49 64 3a 20 74 65  *.** .** $Id: te
0180: 73 74 5f 6d 75 74 65 78 2e 63 2c 76 20 31 2e 31  st_mutex.c,v 1.1
0190: 31 20 32 30 30 38 2f 30 37 2f 31 39 20 31 33 3a  1 2008/07/19 13:
01a0: 34 33 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37  43:24 danielk197
01b0: 37 20 45 78 70 20 24 0a 2a 2f 0a 0a 23 69 6e 63  7 Exp $.*/..#inc
01c0: 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e  lude "tcl.h".#in
01d0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68  clude "sqlite3.h
01e0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ".#include "sqli
01f0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0200: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0210: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0220: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0230: 67 2e 68 3e 0a 0a 2f 2a 20 64 65 66 69 6e 65 64  g.h>../* defined
0240: 20 69 6e 20 74 65 73 74 31 2e 63 20 2a 2f 0a 63   in test1.c */.c
0250: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
0260: 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
0270: 69 6e 74 29 3b 0a 0a 2f 2a 20 41 20 63 6f 75 6e  int);../* A coun
0280: 74 61 62 6c 65 20 6d 75 74 65 78 20 2a 2f 0a 73  table mutex */.s
0290: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 6d 75  truct sqlite3_mu
02a0: 74 65 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tex {.  sqlite3_
02b0: 6d 75 74 65 78 20 2a 70 52 65 61 6c 3b 0a 20 20  mutex *pReal;.  
02c0: 69 6e 74 20 65 54 79 70 65 3b 0a 7d 3b 0a 0a 2f  int eType;.};../
02d0: 2a 20 53 74 61 74 65 20 76 61 72 69 61 62 6c 65  * State variable
02e0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  s */.static stru
02f0: 63 74 20 74 65 73 74 5f 6d 75 74 65 78 5f 67 6c  ct test_mutex_gl
0300: 6f 62 61 6c 73 20 7b 0a 20 20 69 6e 74 20 69 73  obals {.  int is
0310: 49 6e 73 74 61 6c 6c 65 64 3b 20 20 20 20 20 20  Installed;      
0320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0330: 69 66 20 69 6e 73 74 61 6c 6c 65 64 20 2a 2f 0a  if installed */.
0340: 20 20 69 6e 74 20 64 69 73 61 62 6c 65 49 6e 69    int disableIni
0350: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
0360: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
0370: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 61 6c 69   sqlite3_initali
0380: 7a 65 28 29 20 74 6f 20 66 61 69 6c 20 2a 2f 0a  ze() to fail */.
0390: 20 20 69 6e 74 20 64 69 73 61 62 6c 65 54 72 79    int disableTry
03a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
03b0: 2f 2a 20 54 72 75 65 20 74 6f 20 66 6f 72 63 65  /* True to force
03c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 74   sqlite3_mutex_t
03d0: 72 79 28 29 20 74 6f 20 66 61 69 6c 20 2a 2f 0a  ry() to fail */.
03e0: 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 20 20 20    int isInit;   
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 69 74 69  /* True if initi
0410: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 73 71 6c 69  alized */.  sqli
0420: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
0430: 73 20 6d 3b 20 20 20 20 20 20 2f 2a 20 49 6e 74  s m;      /* Int
0440: 65 72 66 61 63 65 20 74 6f 20 22 72 65 61 6c 22  erface to "real"
0450: 20 6d 75 74 65 78 20 73 79 73 74 65 6d 20 2a 2f   mutex system */
0460: 0a 20 20 69 6e 74 20 61 43 6f 75 6e 74 65 72 5b  .  int aCounter[
0470: 38 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  8];             
0480: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 67 72   /* Number of gr
0490: 61 62 73 20 6f 66 20 65 61 63 68 20 74 79 70 65  abs of each type
04a0: 20 6f 66 20 6d 75 74 65 78 20 2a 2f 0a 20 20 73   of mutex */.  s
04b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 61 53 74  qlite3_mutex aSt
04c0: 61 74 69 63 5b 36 5d 3b 20 20 20 20 20 2f 2a 20  atic[6];     /* 
04d0: 54 68 65 20 73 69 78 20 73 74 61 74 69 63 20 6d  The six static m
04e0: 75 74 65 78 65 73 20 2a 2f 0a 7d 20 67 3b 0a 0a  utexes */.} g;..
04f0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
0500: 66 20 74 68 65 20 63 6f 75 6e 74 61 62 6c 65 20  f the countable 
0510: 6d 75 74 65 78 20 69 73 20 63 75 72 72 65 6e 74  mutex is current
0520: 6c 79 20 68 65 6c 64 20 2a 2f 0a 73 74 61 74 69  ly held */.stati
0530: 63 20 69 6e 74 20 63 6f 75 6e 74 65 72 4d 75 74  c int counterMut
0540: 65 78 48 65 6c 64 28 73 71 6c 69 74 65 33 5f 6d  exHeld(sqlite3_m
0550: 75 74 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75  utex *p){.  retu
0560: 72 6e 20 67 2e 6d 2e 78 4d 75 74 65 78 48 65 6c  rn g.m.xMutexHel
0570: 64 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a  d(p->pReal);.}..
0580: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
0590: 66 20 74 68 65 20 63 6f 75 6e 74 61 62 6c 65 20  f the countable 
05a0: 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 63 75 72  mutex is not cur
05b0: 72 65 6e 74 6c 79 20 68 65 6c 64 20 2a 2f 0a 73  rently held */.s
05c0: 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 65  tatic int counte
05d0: 72 4d 75 74 65 78 4e 6f 74 68 65 6c 64 28 73 71  rMutexNotheld(sq
05e0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
05f0: 0a 20 20 72 65 74 75 72 6e 20 67 2e 6d 2e 78 4d  .  return g.m.xM
0600: 75 74 65 78 4e 6f 74 68 65 6c 64 28 70 2d 3e 70  utexNotheld(p->p
0610: 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  Real);.}../* Ini
0620: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
0630: 74 61 62 6c 65 20 6d 75 74 65 78 20 69 6e 74 65  table mutex inte
0640: 72 66 61 63 65 0a 2a 2a 20 4f 72 2c 20 69 66 20  rface.** Or, if 
0650: 67 2e 64 69 73 61 62 6c 65 49 6e 69 74 20 69 73  g.disableInit is
0660: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
0670: 64 6f 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  do not initializ
0680: 65 20 62 75 74 20 69 6e 73 74 65 61 64 0a 2a 2a  e but instead.**
0690: 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
06a0: 65 20 6f 66 20 67 2e 64 69 73 61 62 6c 65 49 6e  e of g.disableIn
06b0: 69 74 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  it as the result
06c0: 20 63 6f 64 65 2e 20 20 54 68 69 73 20 63 61 6e   code.  This can
06d0: 20 62 65 20 75 73 65 64 0a 2a 2a 20 74 6f 20 73   be used.** to s
06e0: 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 69 74 69  imulate an initi
06f0: 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 75 72  alization failur
0700: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
0710: 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 49 6e 69   counterMutexIni
0720: 74 28 76 6f 69 64 29 7b 20 0a 20 20 69 6e 74 20  t(void){ .  int 
0730: 72 63 3b 0a 20 20 69 66 28 20 67 2e 64 69 73 61  rc;.  if( g.disa
0740: 62 6c 65 49 6e 69 74 20 29 20 72 65 74 75 72 6e  bleInit ) return
0750: 20 67 2e 64 69 73 61 62 6c 65 49 6e 69 74 3b 0a   g.disableInit;.
0760: 20 20 72 63 20 3d 20 67 2e 6d 2e 78 4d 75 74 65    rc = g.m.xMute
0770: 78 49 6e 69 74 28 29 3b 0a 20 20 67 2e 69 73 49  xInit();.  g.isI
0780: 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  nit = 1;.  retur
0790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
07a0: 6e 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  ninitialize the 
07b0: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 0a  mutex subsystem.
07c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
07d0: 75 6e 74 65 72 4d 75 74 65 78 45 6e 64 28 76 6f  unterMutexEnd(vo
07e0: 69 64 29 7b 20 0a 20 20 67 2e 69 73 49 6e 69 74  id){ .  g.isInit
07f0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67   = 0;.  return g
0800: 2e 6d 2e 78 4d 75 74 65 78 45 6e 64 28 29 3b 0a  .m.xMutexEnd();.
0810: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
0820: 65 20 61 20 63 6f 75 6e 74 61 62 6c 65 20 6d 75  e a countable mu
0830: 74 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  tex.*/.static sq
0840: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 63 6f 75  lite3_mutex *cou
0850: 6e 74 65 72 4d 75 74 65 78 41 6c 6c 6f 63 28 69  nterMutexAlloc(i
0860: 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 73 71 6c  nt eType){.  sql
0870: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 52 65 61  ite3_mutex *pRea
0880: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  l;.  sqlite3_mut
0890: 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 0a 0a 20  ex *pRet = 0;.. 
08a0: 20 61 73 73 65 72 74 28 20 67 2e 69 73 49 6e 69   assert( g.isIni
08b0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 65 54  t );.  assert(eT
08c0: 79 70 65 3c 38 20 26 26 20 65 54 79 70 65 3e 3d  ype<8 && eType>=
08d0: 30 29 3b 0a 0a 20 20 70 52 65 61 6c 20 3d 20 67  0);..  pReal = g
08e0: 2e 6d 2e 78 4d 75 74 65 78 41 6c 6c 6f 63 28 65  .m.xMutexAlloc(e
08f0: 54 79 70 65 29 3b 0a 20 20 69 66 28 20 21 70 52  Type);.  if( !pR
0900: 65 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  eal ) return 0;.
0910: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
0920: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 20  LITE_MUTEX_FAST 
0930: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
0940: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
0950: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 28   ){.    pRet = (
0960: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 29  sqlite3_mutex *)
0970: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 71  malloc(sizeof(sq
0980: 6c 69 74 65 33 5f 6d 75 74 65 78 29 29 3b 0a 20  lite3_mutex));. 
0990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
09a0: 20 3d 20 26 67 2e 61 53 74 61 74 69 63 5b 65 54   = &g.aStatic[eT
09b0: 79 70 65 2d 32 5d 3b 0a 20 20 7d 0a 0a 20 20 70  ype-2];.  }..  p
09c0: 52 65 74 2d 3e 65 54 79 70 65 20 3d 20 65 54 79  Ret->eType = eTy
09d0: 70 65 3b 0a 20 20 70 52 65 74 2d 3e 70 52 65 61  pe;.  pRet->pRea
09e0: 6c 20 3d 20 70 52 65 61 6c 3b 0a 20 20 72 65 74  l = pReal;.  ret
09f0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
0a00: 2a 2a 20 46 72 65 65 20 61 20 63 6f 75 6e 74 61  ** Free a counta
0a10: 62 6c 65 20 6d 75 74 65 78 0a 2a 2f 0a 73 74 61  ble mutex.*/.sta
0a20: 74 69 63 20 76 6f 69 64 20 63 6f 75 6e 74 65 72  tic void counter
0a30: 4d 75 74 65 78 46 72 65 65 28 73 71 6c 69 74 65  MutexFree(sqlite
0a40: 33 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61  3_mutex *p){.  a
0a50: 73 73 65 72 74 28 20 67 2e 69 73 49 6e 69 74 20  ssert( g.isInit 
0a60: 29 3b 0a 20 20 67 2e 6d 2e 78 4d 75 74 65 78 46  );.  g.m.xMutexF
0a70: 72 65 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20  ree(p->pReal);. 
0a80: 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 53   if( p->eType==S
0a90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
0aa0: 20 7c 7c 20 70 2d 3e 65 54 79 70 65 3d 3d 53 51   || p->eType==SQ
0ab0: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
0ac0: 53 49 56 45 20 29 7b 0a 20 20 20 20 66 72 65 65  SIVE ){.    free
0ad0: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
0ae0: 2a 20 45 6e 74 65 72 20 61 20 63 6f 75 6e 74 61  * Enter a counta
0af0: 62 6c 65 20 6d 75 74 65 78 2e 20 20 42 6c 6f 63  ble mutex.  Bloc
0b00: 6b 20 75 6e 74 69 6c 20 65 6e 74 72 79 20 69 73  k until entry is
0b10: 20 73 61 66 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   safe..*/.static
0b20: 20 76 6f 69 64 20 63 6f 75 6e 74 65 72 4d 75 74   void counterMut
0b30: 65 78 45 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  exEnter(sqlite3_
0b40: 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  mutex *p){.  ass
0b50: 65 72 74 28 20 67 2e 69 73 49 6e 69 74 20 29 3b  ert( g.isInit );
0b60: 0a 20 20 67 2e 61 43 6f 75 6e 74 65 72 5b 70 2d  .  g.aCounter[p-
0b70: 3e 65 54 79 70 65 5d 2b 2b 3b 0a 20 20 67 2e 6d  >eType]++;.  g.m
0b80: 2e 78 4d 75 74 65 78 45 6e 74 65 72 28 70 2d 3e  .xMutexEnter(p->
0b90: 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
0ba0: 20 54 72 79 20 74 6f 20 65 6e 74 65 72 20 61 20   Try to enter a 
0bb0: 6d 75 74 65 78 2e 20 20 52 65 74 75 72 6e 20 74  mutex.  Return t
0bc0: 72 75 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  rue on success..
0bd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
0be0: 75 6e 74 65 72 4d 75 74 65 78 54 72 79 28 73 71  unterMutexTry(sq
0bf0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 29 7b  lite3_mutex *p){
0c00: 0a 20 20 61 73 73 65 72 74 28 20 67 2e 69 73 49  .  assert( g.isI
0c10: 6e 69 74 20 29 3b 0a 20 20 67 2e 61 43 6f 75 6e  nit );.  g.aCoun
0c20: 74 65 72 5b 70 2d 3e 65 54 79 70 65 5d 2b 2b 3b  ter[p->eType]++;
0c30: 0a 20 20 69 66 28 20 67 2e 64 69 73 61 62 6c 65  .  if( g.disable
0c40: 54 72 79 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Try ) return SQL
0c50: 49 54 45 5f 42 55 53 59 3b 0a 20 20 72 65 74 75  ITE_BUSY;.  retu
0c60: 72 6e 20 67 2e 6d 2e 78 4d 75 74 65 78 54 72 79  rn g.m.xMutexTry
0c70: 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f  (p->pReal);.}../
0c80: 2a 20 4c 65 61 76 65 20 61 20 6d 75 74 65 78 0a  * Leave a mutex.
0c90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
0ca0: 6f 75 6e 74 65 72 4d 75 74 65 78 4c 65 61 76 65  ounterMutexLeave
0cb0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  (sqlite3_mutex *
0cc0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 67 2e  p){.  assert( g.
0cd0: 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 2e 6d 2e  isInit );.  g.m.
0ce0: 78 4d 75 74 65 78 4c 65 61 76 65 28 70 2d 3e 70  xMutexLeave(p->p
0cf0: 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
0d00: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
0d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
0d20: 65 73 74 5f 73 68 75 74 64 6f 77 6e 28 0a 20 20  est_shutdown(.  
0d30: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
0d40: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
0d50: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
0d60: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
0d70: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
0d80: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
0d90: 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
0da0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
0db0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
0dc0: 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
0dd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0de0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
0df0: 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 54  _shutdown();.  T
0e00: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
0e10: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
0e20: 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d  ite3TestErrorNam
0e30: 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  e(rc), TCL_VOLAT
0e40: 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ILE);.  return T
0e50: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
0e60: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
0e70: 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
0e80: 20 74 65 73 74 5f 69 6e 69 74 69 61 6c 69 7a 65   test_initialize
0e90: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
0ea0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
0eb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
0ec0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
0ed0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
0ee0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
0ef0: 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
0f00: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
0f10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
0f20: 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
0f30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0f40: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
0f50: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
0f60: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
0f70: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
0f80: 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 45 72   *)sqlite3TestEr
0f90: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
0fa0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65  _VOLATILE);.  re
0fb0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0fc0: 2f 2a 0a 2a 2a 20 69 6e 73 74 61 6c 6c 5f 6d 75  /*.** install_mu
0fd0: 74 65 78 5f 63 6f 75 6e 74 65 72 73 20 42 4f 4f  tex_counters BOO
0fe0: 4c 45 41 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAN.*/.static i
0ff0: 6e 74 20 74 65 73 74 5f 69 6e 73 74 61 6c 6c 5f  nt test_install_
1000: 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 28 0a  mutex_counters(.
1010: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1020: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1030: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1040: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1050: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1060: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1070: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73  ITE_OK;.  int is
1080: 49 6e 73 74 61 6c 6c 3b 0a 0a 20 20 73 71 6c 69  Install;..  sqli
1090: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
10a0: 73 20 63 6f 75 6e 74 65 72 5f 6d 65 74 68 6f 64  s counter_method
10b0: 73 20 3d 20 7b 0a 20 20 20 20 63 6f 75 6e 74 65  s = {.    counte
10c0: 72 4d 75 74 65 78 49 6e 69 74 2c 0a 20 20 20 20  rMutexInit,.    
10d0: 63 6f 75 6e 74 65 72 4d 75 74 65 78 45 6e 64 2c  counterMutexEnd,
10e0: 0a 20 20 20 20 63 6f 75 6e 74 65 72 4d 75 74 65  .    counterMute
10f0: 78 41 6c 6c 6f 63 2c 0a 20 20 20 20 63 6f 75 6e  xAlloc,.    coun
1100: 74 65 72 4d 75 74 65 78 46 72 65 65 2c 0a 20 20  terMutexFree,.  
1110: 20 20 63 6f 75 6e 74 65 72 4d 75 74 65 78 45 6e    counterMutexEn
1120: 74 65 72 2c 0a 20 20 20 20 63 6f 75 6e 74 65 72  ter,.    counter
1130: 4d 75 74 65 78 54 72 79 2c 0a 20 20 20 20 63 6f  MutexTry,.    co
1140: 75 6e 74 65 72 4d 75 74 65 78 4c 65 61 76 65 2c  unterMutexLeave,
1150: 0a 20 20 20 20 63 6f 75 6e 74 65 72 4d 75 74 65  .    counterMute
1160: 78 48 65 6c 64 2c 0a 20 20 20 20 63 6f 75 6e 74  xHeld,.    count
1170: 65 72 4d 75 74 65 78 4e 6f 74 68 65 6c 64 0a 20  erMutexNotheld. 
1180: 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   };..  if( objc!
1190: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
11a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11b0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f  p, 1, objv, "BOO
11c0: 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  LEAN");.    retu
11d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11e0: 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
11f0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
1200: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1210: 6a 76 5b 31 5d 2c 20 26 69 73 49 6e 73 74 61 6c  jv[1], &isInstal
1220: 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  l) ){.    return
1230: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1240: 0a 20 20 61 73 73 65 72 74 28 69 73 49 6e 73 74  .  assert(isInst
1250: 61 6c 6c 3d 3d 30 20 7c 7c 20 69 73 49 6e 73 74  all==0 || isInst
1260: 61 6c 6c 3d 3d 31 29 3b 0a 20 20 61 73 73 65 72  all==1);.  asser
1270: 74 28 67 2e 69 73 49 6e 73 74 61 6c 6c 65 64 3d  t(g.isInstalled=
1280: 3d 30 20 7c 7c 20 67 2e 69 73 49 6e 73 74 61 6c  =0 || g.isInstal
1290: 6c 65 64 3d 3d 31 29 3b 0a 20 20 69 66 28 20 69  led==1);.  if( i
12a0: 73 49 6e 73 74 61 6c 6c 3d 3d 67 2e 69 73 49 6e  sInstall==g.isIn
12b0: 73 74 61 6c 6c 65 64 20 29 7b 0a 20 20 20 20 54  stalled ){.    T
12c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12d0: 69 6e 74 65 72 70 2c 20 22 6d 75 74 65 78 20 63  interp, "mutex c
12e0: 6f 75 6e 74 65 72 73 20 61 72 65 20 22 2c 20 30  ounters are ", 0
12f0: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1300: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1310: 69 73 49 6e 73 74 61 6c 6c 3f 22 61 6c 72 65 61  isInstall?"alrea
1320: 64 79 20 69 6e 73 74 61 6c 6c 65 64 22 3a 22 6e  dy installed":"n
1330: 6f 74 20 69 6e 73 74 61 6c 6c 65 64 22 2c 20 30  ot installed", 0
1340: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1350: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1360: 69 66 28 20 69 73 49 6e 73 74 61 6c 6c 20 29 7b  if( isInstall ){
1370: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 2e 6d  .    assert( g.m
1380: 2e 78 4d 75 74 65 78 41 6c 6c 6f 63 3d 3d 30 20  .xMutexAlloc==0 
1390: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
13a0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
13b0: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
13c0: 58 2c 20 26 67 2e 6d 29 3b 0a 20 20 20 20 69 66  X, &g.m);.    if
13d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13f0: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
1400: 4f 4e 46 49 47 5f 4d 55 54 45 58 2c 20 26 63 6f  ONFIG_MUTEX, &co
1410: 75 6e 74 65 72 5f 6d 65 74 68 6f 64 73 29 3b 0a  unter_methods);.
1420: 20 20 20 20 7d 0a 20 20 20 20 67 2e 64 69 73 61      }.    g.disa
1430: 62 6c 65 54 72 79 20 3d 20 30 3b 0a 20 20 7d 65  bleTry = 0;.  }e
1440: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
1450: 20 67 2e 6d 2e 78 4d 75 74 65 78 41 6c 6c 6f 63   g.m.xMutexAlloc
1460: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1470: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
1480: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 2c  TE_CONFIG_MUTEX,
1490: 20 26 67 2e 6d 29 3b 0a 20 20 20 20 6d 65 6d 73   &g.m);.    mems
14a0: 65 74 28 26 67 2e 6d 2c 20 30 2c 20 73 69 7a 65  et(&g.m, 0, size
14b0: 6f 66 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  of(sqlite3_mutex
14c0: 5f 6d 65 74 68 6f 64 73 29 29 3b 0a 20 20 7d 0a  _methods));.  }.
14d0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 2e 69 73  E_OK ){.    g.is
14f0: 49 6e 73 74 61 6c 6c 65 64 20 3d 20 69 73 49 6e  Installed = isIn
1500: 73 74 61 6c 6c 3b 0a 20 20 7d 0a 0a 20 20 54 63  stall;.  }..  Tc
1510: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1520: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
1530: 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
1540: 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (rc), TCL_VOLATI
1550: 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  LE);.  return TC
1560: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 72  L_OK;.}../*.** r
1570: 65 61 64 5f 6d 75 74 65 78 5f 63 6f 75 6e 74 65  ead_mutex_counte
1580: 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  rs.*/.static int
1590: 20 74 65 73 74 5f 72 65 61 64 5f 6d 75 74 65 78   test_read_mutex
15a0: 5f 63 6f 75 6e 74 65 72 73 28 0a 20 20 76 6f 69  _counters(.  voi
15b0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15d0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15e0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15f0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
1600: 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20  cl_Obj *pRet;.  
1610: 69 6e 74 20 69 69 3b 0a 20 20 63 68 61 72 20 2a  int ii;.  char *
1620: 61 4e 61 6d 65 5b 38 5d 20 3d 20 7b 0a 20 20 20  aName[8] = {.   
1630: 20 22 66 61 73 74 22 2c 20 20 20 20 20 20 20 20   "fast",        
1640: 22 72 65 63 75 72 73 69 76 65 22 2c 20 20 20 22  "recursive",   "
1650: 73 74 61 74 69 63 5f 6d 61 73 74 65 72 22 2c 20  static_master", 
1660: 22 73 74 61 74 69 63 5f 6d 65 6d 22 2c 20 0a 20  "static_mem", . 
1670: 20 20 20 22 73 74 61 74 69 63 5f 6d 65 6d 32 22     "static_mem2"
1680: 2c 20 22 73 74 61 74 69 63 5f 70 72 6e 67 22 2c  , "static_prng",
1690: 20 22 73 74 61 74 69 63 5f 6c 72 75 22 2c 20 20   "static_lru",  
16a0: 20 20 22 73 74 61 74 69 63 5f 6c 72 75 32 22 0a    "static_lru2".
16b0: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
16c0: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
16d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16e0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
16f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1700: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
1710: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
1720: 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
1730: 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20  fCount(pRet);.  
1740: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 38 3b 20  for(ii=0; ii<8; 
1750: 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 4c  ii++){.    Tcl_L
1760: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1770: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
1780: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1790: 62 6a 28 61 4e 61 6d 65 5b 69 69 5d 2c 20 2d 31  bj(aName[ii], -1
17a0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
17b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
17c0: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
17d0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 67 2e 61  cl_NewIntObj(g.a
17e0: 43 6f 75 6e 74 65 72 5b 69 69 5d 29 29 3b 0a 20  Counter[ii]));. 
17f0: 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
1800: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1810: 65 74 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  et);.  Tcl_DecrR
1820: 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 0a  efCount(pRet);..
1830: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 6c 65 61 72 5f  .}../*.** clear_
1850: 6d 75 74 65 78 5f 63 6f 75 6e 74 65 72 73 0a 2a  mutex_counters.*
1860: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1870: 74 5f 63 6c 65 61 72 5f 6d 75 74 65 78 5f 63 6f  t_clear_mutex_co
1880: 75 6e 74 65 72 73 28 0a 20 20 76 6f 69 64 20 2a  unters(.  void *
1890: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18b0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18c0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18d0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
18e0: 69 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ii;..  if( objc!
18f0: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
1900: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1910: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
1920: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1930: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f  ERROR;.  }..  fo
1940: 72 28 69 69 3d 30 3b 20 69 69 3c 38 3b 20 69 69  r(ii=0; ii<8; ii
1950: 2b 2b 29 7b 0a 20 20 20 20 67 2e 61 43 6f 75 6e  ++){.    g.aCoun
1960: 74 65 72 5b 69 69 5d 20 3d 20 30 3b 0a 20 20 7d  ter[ii] = 0;.  }
1970: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1990: 65 20 61 6e 64 20 66 72 65 65 20 61 20 6d 75 74  e and free a mut
19a0: 65 78 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ex.  Return the 
19b0: 6d 75 74 65 78 20 70 6f 69 6e 74 65 72 2e 20 20  mutex pointer.  
19c0: 54 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 77  The pointer.** w
19d0: 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 20 73  ill be invalid s
19e0: 69 6e 63 65 20 74 68 65 20 6d 75 74 65 78 20 68  ince the mutex h
19f0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a00: 66 72 65 65 64 2e 20 20 54 68 65 0a 2a 2a 20 72  freed.  The.** r
1a10: 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 6a 75  eturn pointer ju
1a20: 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1a30: 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 72 65   if the mutex re
1a40: 61 6c 6c 79 20 77 61 73 20 61 6c 6c 6f 63 61 74  ally was allocat
1a50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1a60: 74 20 74 65 73 74 5f 61 6c 6c 6f 63 5f 6d 75 74  t test_alloc_mut
1a70: 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ex(.  void * cli
1a80: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1aa0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1ab0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ac0: 5b 5d 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  [].){.#if SQLITE
1ad0: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73 71  _THREADSAFE.  sq
1ae0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 20 3d  lite3_mutex *p =
1af0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1b00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b10: 58 5f 46 41 53 54 29 3b 0a 20 20 63 68 61 72 20  X_FAST);.  char 
1b20: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 73 71 6c  zBuf[100];.  sql
1b30: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
1b40: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  p);.  sqlite3_sn
1b50: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
1b60: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22 2c  uf), zBuf, "%p",
1b70: 20 70 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e   p);.  Tcl_Appen
1b80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1b90: 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
1ba0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1bb0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1bc0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
1bd0: 20 4f 50 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 4f 50   OPTION.**.** OP
1be0: 54 49 4f 4e 20 63 61 6e 20 62 65 20 65 69 74 68  TION can be eith
1bf0: 65 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  er one of the ke
1c00: 79 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ywords:.**.**   
1c10: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1c20: 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52  CONFIG_SINGLETHR
1c30: 45 41 44 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  EAD.**          
1c40: 20 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f    SQLITE_CONFIG_
1c50: 4d 55 4c 54 49 54 48 52 45 41 44 0a 2a 2a 20 20  MULTITHREAD.**  
1c60: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c70: 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a  _CONFIG_SERIALIZ
1c80: 45 44 0a 2a 2a 0a 2a 2a 20 4f 72 20 4f 50 54 49  ED.**.** Or OPTI
1c90: 4f 4e 20 63 61 6e 20 62 65 20 61 6e 20 72 61 77  ON can be an raw
1ca0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
1cb0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6e  tic int test_con
1cc0: 66 69 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  fig(.  void * cl
1cd0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ce0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cf0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d10: 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  v[].){.  struct 
1d20: 43 6f 6e 66 69 67 4f 70 74 69 6f 6e 20 7b 0a 20  ConfigOption {. 
1d30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d40: 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69 56  Name;.    int iV
1d50: 61 6c 75 65 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d  alue;.  } aOpt[]
1d60: 20 3d 20 7b 0a 20 20 20 20 7b 22 73 69 6e 67 6c   = {.    {"singl
1d70: 65 74 68 72 65 61 64 22 2c 20 53 51 4c 49 54 45  ethread", SQLITE
1d80: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
1d90: 52 45 41 44 7d 2c 0a 20 20 20 20 7b 22 6d 75 6c  READ},.    {"mul
1da0: 74 69 74 68 72 65 61 64 22 2c 20 20 53 51 4c 49  tithread",  SQLI
1db0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
1dc0: 48 52 45 41 44 7d 2c 0a 20 20 20 20 7b 22 73 65  HREAD},.    {"se
1dd0: 72 69 61 6c 69 7a 65 64 22 2c 20 20 20 53 51 4c  rialized",   SQL
1de0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
1df0: 4c 49 5a 45 44 7d 2c 0a 20 20 20 20 7b 30 2c 20  LIZED},.    {0, 
1e00: 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 73 20  0}.  };.  int s 
1e10: 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  = sizeof(struct 
1e20: 43 6f 6e 66 69 67 4f 70 74 69 6f 6e 29 3b 0a 20  ConfigOption);. 
1e30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
1e40: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1e50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1e60: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1e70: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
1e80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e90: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1ea0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
1eb0: 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
1ec0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 4f 70 74 2c  , objv[1], aOpt,
1ed0: 20 73 2c 20 22 66 6c 61 67 22 2c 20 30 2c 20 26   s, "flag", 0, &
1ee0: 69 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i) ){.    if( Tc
1ef0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1f00: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
1f10: 20 26 69 29 20 29 7b 0a 20 20 20 20 20 20 72 65   &i) ){.      re
1f20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1f40: 20 20 20 69 20 3d 20 61 4f 70 74 5b 69 5d 2e 69     i = aOpt[i].i
1f50: 56 61 6c 75 65 3b 0a 20 20 7d 0a 0a 20 20 72 63  Value;.  }..  rc
1f60: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69   = sqlite3_confi
1f70: 67 28 69 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  g(i);.  Tcl_SetR
1f80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1f90: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73  har *)sqlite3Tes
1fa0: 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  tErrorName(rc), 
1fb0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
1fc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fd0: 7d 0a 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73  }..int Sqlitetes
1fe0: 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c  t_mutex_Init(Tcl
1ff0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
2000: 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
2010: 74 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  t {.    char *zN
2020: 61 6d 65 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ame;.    Tcl_Obj
2030: 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
2040: 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20    } aCmd[] = {. 
2050: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68     { "sqlite3_sh
2060: 75 74 64 6f 77 6e 22 2c 20 20 20 20 20 20 20 20  utdown",        
2070: 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
2080: 29 74 65 73 74 5f 73 68 75 74 64 6f 77 6e 20 7d  )test_shutdown }
2090: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  ,.    { "sqlite3
20a0: 5f 69 6e 69 74 69 61 6c 69 7a 65 22 2c 20 20 20  _initialize",   
20b0: 20 20 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72     (Tcl_ObjCmdPr
20c0: 6f 63 2a 29 74 65 73 74 5f 69 6e 69 74 69 61 6c  oc*)test_initial
20d0: 69 7a 65 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  ize },.    { "sq
20e0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 22 2c 20 20  lite3_config",  
20f0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 4f 62 6a          (Tcl_Obj
2100: 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 6f  CmdProc*)test_co
2110: 6e 66 69 67 20 7d 2c 0a 0a 20 20 20 20 7b 20 22  nfig },..    { "
2120: 61 6c 6c 6f 63 5f 64 65 61 6c 6c 6f 63 5f 6d 75  alloc_dealloc_mu
2130: 74 65 78 22 2c 20 20 20 20 20 28 54 63 6c 5f 4f  tex",     (Tcl_O
2140: 62 6a 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  bjCmdProc*)test_
2150: 61 6c 6c 6f 63 5f 6d 75 74 65 78 20 7d 2c 0a 20  alloc_mutex },. 
2160: 20 20 20 7b 20 22 69 6e 73 74 61 6c 6c 5f 6d 75     { "install_mu
2170: 74 65 78 5f 63 6f 75 6e 74 65 72 73 22 2c 20 20  tex_counters",  
2180: 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
2190: 29 74 65 73 74 5f 69 6e 73 74 61 6c 6c 5f 6d 75  )test_install_mu
21a0: 74 65 78 5f 63 6f 75 6e 74 65 72 73 20 7d 2c 0a  tex_counters },.
21b0: 20 20 20 20 7b 20 22 72 65 61 64 5f 6d 75 74 65      { "read_mute
21c0: 78 5f 63 6f 75 6e 74 65 72 73 22 2c 20 20 20 20  x_counters",    
21d0: 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
21e0: 2a 29 74 65 73 74 5f 72 65 61 64 5f 6d 75 74 65  *)test_read_mute
21f0: 78 5f 63 6f 75 6e 74 65 72 73 20 7d 2c 0a 20 20  x_counters },.  
2200: 20 20 7b 20 22 63 6c 65 61 72 5f 6d 75 74 65 78    { "clear_mutex
2210: 5f 63 6f 75 6e 74 65 72 73 22 2c 20 20 20 20 28  _counters",    (
2220: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
2230: 74 65 73 74 5f 63 6c 65 61 72 5f 6d 75 74 65 78  test_clear_mutex
2240: 5f 63 6f 75 6e 74 65 72 73 20 7d 2c 0a 20 20 7d  _counters },.  }
2250: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
2260: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
2270: 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64  Cmd)/sizeof(aCmd
2280: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
2290: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
22a0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d  mand(interp, aCm
22b0: 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64  d[i].zName, aCmd
22c0: 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29  [i].xProc, 0, 0)
22d0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
22e0: 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 67 29 29  g, 0, sizeof(g))
22f0: 3b 0a 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  ;..  Tcl_LinkVar
2300: 28 69 6e 74 65 72 70 2c 20 22 64 69 73 61 62 6c  (interp, "disabl
2310: 65 5f 6d 75 74 65 78 5f 69 6e 69 74 22 2c 20 0a  e_mutex_init", .
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2330: 68 61 72 2a 29 26 67 2e 64 69 73 61 62 6c 65 49  har*)&g.disableI
2340: 6e 69 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  nit, TCL_LINK_IN
2350: 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2360: 72 28 69 6e 74 65 72 70 2c 20 22 64 69 73 61 62  r(interp, "disab
2370: 6c 65 5f 6d 75 74 65 78 5f 74 72 79 22 2c 20 0a  le_mutex_try", .
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2390: 68 61 72 2a 29 26 67 2e 64 69 73 61 62 6c 65 54  har*)&g.disableT
23a0: 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ry, TCL_LINK_INT
23b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23c0: 54 45 5f 4f 4b 3b 0a 7d 0a                       TE_OK;.}.