/ Hex Artifact Content
Login

Artifact 731d23f953ece5bf40ce87810cfb7607218953c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 44 65 63 65 6d  /*.** 2005 Decem
0010: 62 65 72 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68 65  ber 14.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  *****.**.** $Id:
0180: 20 74 65 73 74 5f 61 73 79 6e 63 2e 63 2c 76 20   test_async.c,v 
0190: 31 2e 36 32 20 32 30 30 39 2f 30 34 2f 32 38 20  1.62 2009/04/28 
01a0: 31 33 3a 30 31 3a 30 39 20 64 72 68 20 45 78 70  13:01:09 drh Exp
01b0: 20 24 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69   $.**.** This fi
01c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 62 69  le contains a bi
01d0: 6e 64 69 6e 67 20 6f 66 20 74 68 65 20 61 73 79  nding of the asy
01e0: 6e 63 68 72 6f 6e 6f 75 73 20 49 4f 20 65 78 74  nchronous IO ext
01f0: 65 6e 73 69 6f 6e 20 69 6e 74 65 72 66 61 63 65  ension interface
0200: 0a 2a 2a 20 28 64 65 66 69 6e 65 64 20 69 6e 20  .** (defined in 
0210: 65 78 74 2f 61 73 79 6e 63 2f 73 71 6c 69 74 65  ext/async/sqlite
0220: 33 61 73 79 6e 63 2e 68 29 20 74 6f 20 54 63 6c  3async.h) to Tcl
0230: 2e 0a 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 54 43  ..*/..#define TC
0240: 4c 5f 54 48 52 45 41 44 53 20 0a 23 69 6e 63 6c  L_THREADS .#incl
0250: 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 0a 23 69 66  ude <tcl.h>..#if
0260: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0270: 45 5f 41 53 59 4e 43 49 4f 0a 0a 23 69 6e 63 6c  E_ASYNCIO..#incl
0280: 75 64 65 20 22 73 71 6c 69 74 65 33 61 73 79 6e  ude "sqlite3asyn
0290: 63 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73  c.h".#include "s
02a0: 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75  qlite3.h".#inclu
02b0: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f  de <assert.h>../
02c0: 2a 20 46 72 6f 6d 20 74 65 73 74 31 2e 63 20 2a  * From test1.c *
02d0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
02e0: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
02f0: 6d 65 28 69 6e 74 29 3b 0a 0a 0a 73 74 72 75 63  me(int);...struc
0300: 74 20 54 65 73 74 41 73 79 6e 63 47 6c 6f 62 61  t TestAsyncGloba
0310: 6c 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 73 74  l {.  int isInst
0320: 61 6c 6c 65 64 3b 20 20 20 20 20 20 20 20 20 20  alled;          
0330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0340: 75 65 20 77 68 65 6e 20 61 73 79 6e 63 20 56 46  ue when async VF
0350: 53 20 69 73 20 69 6e 73 74 61 6c 6c 65 64 20 2a  S is installed *
0360: 2f 0a 7d 20 74 65 73 74 61 73 79 6e 63 5f 67 20  /.} testasync_g 
0370: 3d 20 7b 20 30 20 7d 3b 0a 0a 54 43 4c 5f 44 45  = { 0 };..TCL_DE
0380: 43 4c 41 52 45 5f 4d 55 54 45 58 28 74 65 73 74  CLARE_MUTEX(test
0390: 61 73 79 6e 63 5f 67 5f 77 72 69 74 65 72 4d 75  async_g_writerMu
03a0: 74 65 78 29 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  tex);../*.** sql
03b0: 69 74 65 33 61 73 79 6e 63 5f 69 6e 69 74 69 61  ite3async_initia
03c0: 6c 69 7a 65 20 50 41 52 45 4e 54 2d 56 46 53 20  lize PARENT-VFS 
03d0: 49 53 44 45 46 41 55 4c 54 0a 2a 2f 0a 73 74 61  ISDEFAULT.*/.sta
03e0: 74 69 63 20 69 6e 74 20 74 65 73 74 41 73 79 6e  tic int testAsyn
03f0: 63 49 6e 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  cInit(.  void * 
0400: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
0410: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0420: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
0430: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
0440: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
0450: 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a   char *zParent;.
0460: 20 20 69 6e 74 20 69 73 44 65 66 61 75 6c 74 3b    int isDefault;
0470: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
0480: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
0490: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
04a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
04b0: 76 2c 20 22 50 41 52 45 4e 54 2d 56 46 53 20 49  v, "PARENT-VFS I
04c0: 53 44 45 46 41 55 4c 54 22 29 3b 0a 20 20 20 20  SDEFAULT");.    
04d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
04e0: 3b 0a 20 20 7d 0a 20 20 7a 50 61 72 65 6e 74 20  ;.  }.  zParent 
04f0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
0500: 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  objv[1]);.  if( 
0510: 21 2a 7a 50 61 72 65 6e 74 20 29 20 7b 0a 20 20  !*zParent ) {.  
0520: 20 20 7a 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20    zParent = 0;. 
0530: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
0540: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
0550: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
0560: 26 69 73 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  &isDefault) ){. 
0570: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0580: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
0590: 20 73 71 6c 69 74 65 33 61 73 79 6e 63 5f 69 6e   sqlite3async_in
05a0: 69 74 69 61 6c 69 7a 65 28 7a 50 61 72 65 6e 74  itialize(zParent
05b0: 2c 20 69 73 44 65 66 61 75 6c 74 29 3b 0a 20 20  , isDefault);.  
05c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
05d0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
05e0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
05f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
0600: 62 6a 28 73 71 6c 69 74 65 33 54 65 73 74 45 72  bj(sqlite3TestEr
0610: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  rorName(rc), -1)
0620: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0630: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
0640: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
0650: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 61 73  ./*.** sqlite3as
0660: 79 6e 63 5f 73 68 75 74 64 6f 77 6e 0a 2a 2f 0a  ync_shutdown.*/.
0670: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 41  static int testA
0680: 73 79 6e 63 53 68 75 74 64 6f 77 6e 28 0a 20 20  syncShutdown(.  
0690: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
06a0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
06b0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
06c0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
06d0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
06e0: 20 20 73 71 6c 69 74 65 33 61 73 79 6e 63 5f 73    sqlite3async_s
06f0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 72 65 74  hutdown();.  ret
0700: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
0710: 74 61 74 69 63 20 54 63 6c 5f 54 68 72 65 61 64  tatic Tcl_Thread
0720: 43 72 65 61 74 65 54 79 70 65 20 74 63 6c 57 72  CreateType tclWr
0730: 69 74 65 72 54 68 72 65 61 64 28 43 6c 69 65 6e  iterThread(Clien
0740: 74 44 61 74 61 20 70 49 73 53 74 61 72 74 65 64  tData pIsStarted
0750: 29 7b 0a 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f  ){.  Tcl_MutexLo
0760: 63 6b 28 26 74 65 73 74 61 73 79 6e 63 5f 67 5f  ck(&testasync_g_
0770: 77 72 69 74 65 72 4d 75 74 65 78 29 3b 0a 20 20  writerMutex);.  
0780: 2a 28 28 69 6e 74 20 2a 29 70 49 73 53 74 61 72  *((int *)pIsStar
0790: 74 65 64 29 20 3d 20 31 3b 0a 20 20 73 71 6c 69  ted) = 1;.  sqli
07a0: 74 65 33 61 73 79 6e 63 5f 72 75 6e 28 29 3b 0a  te3async_run();.
07b0: 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63    Tcl_MutexUnloc
07c0: 6b 28 26 74 65 73 74 61 73 79 6e 63 5f 67 5f 77  k(&testasync_g_w
07d0: 72 69 74 65 72 4d 75 74 65 78 29 3b 0a 20 20 54  riterMutex);.  T
07e0: 43 4c 5f 54 48 52 45 41 44 5f 43 52 45 41 54 45  CL_THREAD_CREATE
07f0: 5f 52 45 54 55 52 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a  _RETURN;.}../*.*
0800: 2a 20 73 71 6c 69 74 65 33 61 73 79 6e 63 5f 73  * sqlite3async_s
0810: 74 61 72 74 0a 2a 2a 0a 2a 2a 20 53 74 61 72 74  tart.**.** Start
0820: 20 61 20 6e 65 77 20 77 72 69 74 65 72 20 74 68   a new writer th
0830: 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  read..*/.static 
0840: 69 6e 74 20 74 65 73 74 41 73 79 6e 63 53 74 61  int testAsyncSta
0850: 72 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  rt(.  void * cli
0860: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0870: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
0880: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
0890: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
08a0: 5b 5d 0a 29 7b 0a 20 20 76 6f 6c 61 74 69 6c 65  [].){.  volatile
08b0: 20 69 6e 74 20 69 73 53 74 61 72 74 65 64 20 3d   int isStarted =
08c0: 20 30 3b 0a 20 20 43 6c 69 65 6e 74 44 61 74 61   0;.  ClientData
08d0: 20 74 68 72 65 61 64 44 61 74 61 20 3d 20 28 43   threadData = (C
08e0: 6c 69 65 6e 74 44 61 74 61 29 26 69 73 53 74 61  lientData)&isSta
08f0: 72 74 65 64 3b 0a 0a 20 20 54 63 6c 5f 54 68 72  rted;..  Tcl_Thr
0900: 65 61 64 49 64 20 78 3b 0a 20 20 63 6f 6e 73 74  eadId x;.  const
0910: 20 69 6e 74 20 6e 53 74 61 63 6b 20 3d 20 54 43   int nStack = TC
0920: 4c 5f 54 48 52 45 41 44 5f 53 54 41 43 4b 5f 44  L_THREAD_STACK_D
0930: 45 46 41 55 4c 54 3b 0a 20 20 63 6f 6e 73 74 20  EFAULT;.  const 
0940: 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f  int flags = TCL_
0950: 54 48 52 45 41 44 5f 4e 4f 46 4c 41 47 53 3b 0a  THREAD_NOFLAGS;.
0960: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
0970: 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 68 72 65  = Tcl_CreateThre
0980: 61 64 28 26 78 2c 20 74 63 6c 57 72 69 74 65 72  ad(&x, tclWriter
0990: 54 68 72 65 61 64 2c 20 74 68 72 65 61 64 44 61  Thread, threadDa
09a0: 74 61 2c 20 6e 53 74 61 63 6b 2c 20 66 6c 61 67  ta, nStack, flag
09b0: 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  s);.  if( rc!=TC
09c0: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  L_OK ){.    Tcl_
09d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
09e0: 65 72 70 2c 20 22 54 63 6c 5f 43 72 65 61 74 65  erp, "Tcl_Create
09f0: 54 68 72 65 61 64 28 29 20 66 61 69 6c 65 64 22  Thread() failed"
0a00: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
0a10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
0a20: 0a 20 20 77 68 69 6c 65 28 20 69 73 53 74 61 72  .  while( isStar
0a30: 74 65 64 3d 3d 30 20 29 20 7b 20 2f 2a 20 42 75  ted==0 ) { /* Bu
0a40: 73 79 20 6c 6f 6f 70 20 2a 2f 20 7d 0a 20 20 72  sy loop */ }.  r
0a50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
0a60: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 61 73  ./*.** sqlite3as
0a70: 79 6e 63 5f 77 61 69 74 0a 2a 2a 0a 2a 2a 20 57  ync_wait.**.** W
0a80: 61 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ait for the curr
0a90: 65 6e 74 20 77 72 69 74 65 72 20 74 68 72 65 61  ent writer threa
0aa0: 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 2e 0a  d to terminate..
0ab0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
0ac0: 72 65 6e 74 20 77 72 69 74 65 72 20 74 68 72 65  rent writer thre
0ad0: 61 64 20 69 73 20 73 65 74 20 74 6f 20 72 75 6e  ad is set to run
0ae0: 20 66 6f 72 65 76 65 72 20 74 68 65 6e 20 74 68   forever then th
0af0: 69 73 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 77 6f  is.** command wo
0b00: 75 6c 64 20 62 6c 6f 63 6b 20 66 6f 72 65 76 65  uld block foreve
0b10: 72 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74  r.  To prevent t
0b20: 68 61 74 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  hat, an error is
0b30: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2f 0a 73   returned. .*/.s
0b40: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 41 73  tatic int testAs
0b50: 79 6e 63 57 61 69 74 28 0a 20 20 76 6f 69 64 20  yncWait(.  void 
0b60: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
0b70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0b80: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
0b90: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
0ba0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
0bb0: 20 65 43 6f 6e 64 3b 0a 20 20 69 66 28 20 6f 62   eCond;.  if( ob
0bc0: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
0bd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
0be0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
0bf0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
0c00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
0c10: 20 73 71 6c 69 74 65 33 61 73 79 6e 63 5f 63 6f   sqlite3async_co
0c20: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 41 53 59 4e  ntrol(SQLITEASYN
0c30: 43 5f 47 45 54 5f 48 41 4c 54 2c 20 26 65 43 6f  C_GET_HALT, &eCo
0c40: 6e 64 29 3b 0a 20 20 69 66 28 20 65 43 6f 6e 64  nd);.  if( eCond
0c50: 3d 3d 53 51 4c 49 54 45 41 53 59 4e 43 5f 48 41  ==SQLITEASYNC_HA
0c60: 4c 54 5f 4e 45 56 45 52 20 29 7b 0a 20 20 20 20  LT_NEVER ){.    
0c70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0c80: 28 69 6e 74 65 72 70 2c 20 22 77 6f 75 6c 64 20  (interp, "would 
0c90: 62 6c 6f 63 6b 20 66 6f 72 65 76 65 72 22 2c 20  block forever", 
0ca0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
0cb0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0cc0: 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 4d 75 74 65  .  }..  Tcl_Mute
0cd0: 78 4c 6f 63 6b 28 26 74 65 73 74 61 73 79 6e 63  xLock(&testasync
0ce0: 5f 67 5f 77 72 69 74 65 72 4d 75 74 65 78 29 3b  _g_writerMutex);
0cf0: 0a 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  .  Tcl_MutexUnlo
0d00: 63 6b 28 26 74 65 73 74 61 73 79 6e 63 5f 67 5f  ck(&testasync_g_
0d10: 77 72 69 74 65 72 4d 75 74 65 78 29 3b 0a 20 20  writerMutex);.  
0d20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
0d30: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 61  ../*.** sqlite3a
0d40: 73 79 6e 63 5f 63 6f 6e 74 72 6f 6c 20 4f 50 54  sync_control OPT
0d50: 49 4f 4e 20 3f 56 41 4c 55 45 3f 0a 2a 2f 0a 73  ION ?VALUE?.*/.s
0d60: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 41 73  tatic int testAs
0d70: 79 6e 63 43 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f  yncControl(.  vo
0d80: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
0d90: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
0da0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
0db0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
0dc0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
0dd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0de0: 4f 4b 3b 0a 20 20 69 6e 74 20 61 65 4f 70 74 5b  OK;.  int aeOpt[
0df0: 5d 20 3d 20 7b 20 53 51 4c 49 54 45 41 53 59 4e  ] = { SQLITEASYN
0e00: 43 5f 48 41 4c 54 2c 20 53 51 4c 49 54 45 41 53  C_HALT, SQLITEAS
0e10: 59 4e 43 5f 44 45 4c 41 59 2c 20 53 51 4c 49 54  YNC_DELAY, SQLIT
0e20: 45 41 53 59 4e 43 5f 4c 4f 43 4b 46 49 4c 45 53  EASYNC_LOCKFILES
0e30: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
0e40: 20 2a 61 7a 4f 70 74 5b 5d 20 3d 20 7b 20 22 68   *azOpt[] = { "h
0e50: 61 6c 74 22 2c 20 22 64 65 6c 61 79 22 2c 20 22  alt", "delay", "
0e60: 6c 6f 63 6b 66 69 6c 65 73 22 2c 20 30 20 7d 3b  lockfiles", 0 };
0e70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
0e80: 7a 5b 5d 20 3d 20 7b 20 22 6e 65 76 65 72 22 2c  z[] = { "never",
0e90: 20 22 6e 6f 77 22 2c 20 22 69 64 6c 65 22 2c 20   "now", "idle", 
0ea0: 30 20 7d 3b 0a 20 20 69 6e 74 20 69 56 61 6c 3b  0 };.  int iVal;
0eb0: 0a 20 20 69 6e 74 20 65 4f 70 74 3b 0a 0a 20 20  .  int eOpt;..  
0ec0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
0ed0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
0ee0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
0ef0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
0f00: 22 4f 50 54 49 4f 4e 20 3f 56 41 4c 55 45 3f 22  "OPTION ?VALUE?"
0f10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0f20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
0f30: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
0f40: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
0f50: 62 6a 76 5b 31 5d 2c 20 61 7a 4f 70 74 2c 20 22  bjv[1], azOpt, "
0f60: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 65 4f 70  option", 0, &eOp
0f70: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
0f80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
0f90: 20 20 65 4f 70 74 20 3d 20 61 65 4f 70 74 5b 65    eOpt = aeOpt[e
0fa0: 4f 70 74 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Opt];..  if( obj
0fb0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 73 77 69 74  c==3 ){.    swit
0fc0: 63 68 28 20 65 4f 70 74 20 29 7b 0a 20 20 20 20  ch( eOpt ){.    
0fd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 41 53 59    case SQLITEASY
0fe0: 4e 43 5f 48 41 4c 54 3a 20 7b 0a 20 20 20 20 20  NC_HALT: {.     
0ff0: 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1000: 45 41 53 59 4e 43 5f 48 41 4c 54 5f 4e 45 56 45  EASYNC_HALT_NEVE
1010: 52 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  R==0 );.        
1020: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 41 53  assert( SQLITEAS
1030: 59 4e 43 5f 48 41 4c 54 5f 4e 4f 57 3d 3d 31 20  YNC_HALT_NOW==1 
1040: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1050: 74 28 20 53 51 4c 49 54 45 41 53 59 4e 43 5f 48  t( SQLITEASYNC_H
1060: 41 4c 54 5f 49 44 4c 45 3d 3d 32 20 29 3b 0a 20  ALT_IDLE==2 );. 
1070: 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47         if( Tcl_G
1080: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
1090: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
10a0: 61 7a 2c 20 22 76 61 6c 75 65 22 2c 20 30 2c 20  az, "value", 0, 
10b0: 26 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iVal) ){.      
10c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10d0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
10e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
1100: 65 20 53 51 4c 49 54 45 41 53 59 4e 43 5f 44 45  e SQLITEASYNC_DE
1110: 4c 41 59 3a 0a 20 20 20 20 20 20 20 20 69 66 28  LAY:.        if(
1120: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1130: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1140: 32 5d 2c 20 26 69 56 61 6c 29 20 29 7b 0a 20 20  2], &iVal) ){.  
1150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
1160: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
1170: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1180: 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53  k;..      case S
1190: 51 4c 49 54 45 41 53 59 4e 43 5f 4c 4f 43 4b 46  QLITEASYNC_LOCKF
11a0: 49 4c 45 53 3a 0a 20 20 20 20 20 20 20 20 69 66  ILES:.        if
11b0: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
11c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
11d0: 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29 20  objv[2], &iVal) 
11e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
11f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1220: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 61     rc = sqlite3a
1230: 73 79 6e 63 5f 63 6f 6e 74 72 6f 6c 28 65 4f 70  sync_control(eOp
1240: 74 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 0a 20  t, iVal);.  }.. 
1250: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1260: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1270: 71 6c 69 74 65 33 61 73 79 6e 63 5f 63 6f 6e 74  qlite3async_cont
1280: 72 6f 6c 28 0a 20 20 20 20 20 20 20 20 65 4f 70  rol(.        eOp
1290: 74 3d 3d 53 51 4c 49 54 45 41 53 59 4e 43 5f 48  t==SQLITEASYNC_H
12a0: 41 4c 54 20 3f 20 53 51 4c 49 54 45 41 53 59 4e  ALT ? SQLITEASYN
12b0: 43 5f 47 45 54 5f 48 41 4c 54 20 3a 0a 20 20 20  C_GET_HALT :.   
12c0: 20 20 20 20 20 65 4f 70 74 3d 3d 53 51 4c 49 54       eOpt==SQLIT
12d0: 45 41 53 59 4e 43 5f 44 45 4c 41 59 20 3f 20 53  EASYNC_DELAY ? S
12e0: 51 4c 49 54 45 41 53 59 4e 43 5f 47 45 54 5f 44  QLITEASYNC_GET_D
12f0: 45 4c 41 59 20 3a 0a 20 20 20 20 20 20 20 20 53  ELAY :.        S
1300: 51 4c 49 54 45 41 53 59 4e 43 5f 47 45 54 5f 4c  QLITEASYNC_GET_L
1310: 4f 43 4b 46 49 4c 45 53 2c 20 26 69 56 61 6c 29  OCKFILES, &iVal)
1320: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
1330: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1340: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1350: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1360: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
1370: 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
1380: 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  (rc), -1));.    
1390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13a0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 4f 70  ;.  }..  if( eOp
13b0: 74 3d 3d 53 51 4c 49 54 45 41 53 59 4e 43 5f 48  t==SQLITEASYNC_H
13c0: 41 4c 54 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ALT ){.    Tcl_S
13d0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
13e0: 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
13f0: 67 4f 62 6a 28 61 7a 5b 69 56 61 6c 5d 2c 20 2d  gObj(az[iVal], -
1400: 31 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1));.  }else{.  
1410: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1420: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1430: 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b  ewIntObj(iVal));
1440: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
1450: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  CL_OK;.}..#endif
1460: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42    /* SQLITE_ENAB
1470: 4c 45 5f 41 53 59 4e 43 49 4f 20 2a 2f 0a 0a 2f  LE_ASYNCIO */../
1480: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1490: 65 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20  e registers the 
14a0: 63 75 73 74 6f 6d 20 54 43 4c 20 63 6f 6d 6d 61  custom TCL comma
14b0: 6e 64 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  nds defined in t
14c0: 68 69 73 0a 2a 2a 20 6d 6f 64 75 6c 65 2e 20 20  his.** module.  
14d0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74  This should be t
14e0: 68 65 20 6f 6e 6c 79 20 70 72 6f 63 65 64 75 72  he only procedur
14f0: 65 20 76 69 73 69 62 6c 65 20 66 72 6f 6d 20 6f  e visible from o
1500: 75 74 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 69  utside.** of thi
1510: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74  s module..*/.int
1520: 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63   Sqlitetestasync
1530: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1540: 20 2a 69 6e 74 65 72 70 29 7b 0a 23 69 66 20 53   *interp){.#if S
1550: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 53 59  QLITE_ENABLE_ASY
1560: 4e 43 49 4f 0a 20 20 54 63 6c 5f 43 72 65 61 74  NCIO.  Tcl_Creat
1570: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
1580: 72 70 2c 22 73 71 6c 69 74 65 33 61 73 79 6e 63  rp,"sqlite3async
1590: 5f 73 74 61 72 74 22 2c 74 65 73 74 41 73 79 6e  _start",testAsyn
15a0: 63 53 74 61 72 74 2c 30 2c 30 29 3b 0a 20 20 54  cStart,0,0);.  T
15b0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15c0: 61 6e 64 28 69 6e 74 65 72 70 2c 22 73 71 6c 69  and(interp,"sqli
15d0: 74 65 33 61 73 79 6e 63 5f 77 61 69 74 22 2c 74  te3async_wait",t
15e0: 65 73 74 41 73 79 6e 63 57 61 69 74 2c 30 2c 30  estAsyncWait,0,0
15f0: 29 3b 0a 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  );..  Tcl_Create
1600: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
1610: 70 2c 22 73 71 6c 69 74 65 33 61 73 79 6e 63 5f  p,"sqlite3async_
1620: 63 6f 6e 74 72 6f 6c 22 2c 74 65 73 74 41 73 79  control",testAsy
1630: 6e 63 43 6f 6e 74 72 6f 6c 2c 30 2c 30 29 3b 0a  ncControl,0,0);.
1640: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1650: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 22 73  ommand(interp,"s
1660: 71 6c 69 74 65 33 61 73 79 6e 63 5f 69 6e 69 74  qlite3async_init
1670: 69 61 6c 69 7a 65 22 2c 74 65 73 74 41 73 79 6e  ialize",testAsyn
1680: 63 49 6e 69 74 2c 30 2c 30 29 3b 0a 20 20 54 63  cInit,0,0);.  Tc
1690: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
16a0: 6e 64 28 69 6e 74 65 72 70 2c 22 73 71 6c 69 74  nd(interp,"sqlit
16b0: 65 33 61 73 79 6e 63 5f 73 68 75 74 64 6f 77 6e  e3async_shutdown
16c0: 22 2c 74 65 73 74 41 73 79 6e 63 53 68 75 74 64  ",testAsyncShutd
16d0: 6f 77 6e 2c 30 2c 30 29 3b 0a 23 65 6e 64 69 66  own,0,0);.#endif
16e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42    /* SQLITE_ENAB
16f0: 4c 45 5f 41 53 59 4e 43 49 4f 20 2a 2f 0a 20 20  LE_ASYNCIO */.  
1700: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1710: 0a                                               .