System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 36794590001ab5b2acfbf88e08e2e471417729a4:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 74 68 72 65 61 64 2e 65 61 67  .#..# thread.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 70 61 63 6b 61 67 65 20 72 65  ##....package re
0120: 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 70 61 63  quire Eagle..pac
0130: 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
0140: 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 70 61 63 6b  le.Library..pack
0150: 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
0160: 65 2e 54 65 73 74 0d 0a 0d 0a 72 75 6e 54 65 73  e.Test....runTes
0170: 74 50 72 6f 6c 6f 67 75 65 0d 0a 0d 0a 23 23 23  tPrologue....###
0180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
01d0: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
01e0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
01f0: 74 65 2e 54 65 73 74 0d 0a 72 75 6e 53 51 4c 69  te.Test..runSQLi
0200: 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 0d 0a  teTestPrologue..
0210: 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
0220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 0d 0a 0d 0a 63 68 65 63 6b 46 6f 72 53 51 4c  #....checkForSQL
0270: 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
0280: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
0290: 65 0d 0a 73 65 74 20 6d 65 6d 6f 72 79 5f 75 73  e..set memory_us
02a0: 65 64 20 5b 72 65 70 6f 72 74 53 51 4c 69 74 65  ed [reportSQLite
02b0: 52 65 73 6f 75 72 63 65 73 20 24 74 65 73 74 5f  Resources $test_
02c0: 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 0d 0a 0d  channel true]...
02d0: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a 20 48  ....#..# NOTE: H
0330: 6f 77 20 6d 61 6e 79 20 74 65 73 74 20 74 68 72  ow many test thr
0340: 65 61 64 73 20 73 68 6f 75 6c 64 20 62 65 20 63  eads should be c
0350: 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64 20  reated and used 
0360: 66 6f 72 20 74 68 65 73 65 20 74 65 73 74 73 3f  for these tests?
0370: 20 20 54 68 69 73 0d 0a 23 20 20 20 20 20 20 20    This..#       
0380: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 74  value must be at
0390: 20 6c 65 61 73 74 20 74 77 6f 2e 20 20 54 68 65   least two.  The
03a0: 20 66 69 72 73 74 20 74 65 73 74 20 74 68 72 65   first test thre
03b0: 61 64 20 28 61 74 20 69 6e 64 65 78 20 30 29 20  ad (at index 0) 
03c0: 6a 75 73 74 0d 0a 23 20 20 20 20 20 20 20 72 65  just..#       re
03d0: 70 65 61 74 65 64 6c 79 20 63 61 6c 6c 73 20 74  peatedly calls t
03e0: 68 65 20 54 68 72 65 61 64 2e 41 62 6f 72 74 28  he Thread.Abort(
03f0: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65 20  ) method on the 
0400: 6f 74 68 65 72 20 74 65 73 74 20 74 68 72 65 61  other test threa
0410: 64 73 0d 0a 23 20 20 20 20 20 20 20 74 68 61 74  ds..#       that
0420: 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6c   appear to be al
0430: 69 76 65 20 75 6e 74 69 6c 20 61 6c 6c 20 74 65  ive until all te
0440: 73 74 20 74 68 72 65 61 64 73 20 61 70 70 65 61  st threads appea
0450: 72 20 74 6f 20 62 65 20 64 65 61 64 2e 20 20 41  r to be dead.  A
0460: 6c 6c 0d 0a 23 20 20 20 20 20 20 20 6f 74 68 65  ll..#       othe
0470: 72 20 74 68 72 65 61 64 73 20 77 69 6c 6c 20 61  r threads will a
0480: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
0490: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 65 78 65   connection, exe
04a0: 63 75 74 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  cute one or more
04b0: 0d 0a 23 20 20 20 20 20 20 20 71 75 65 72 69 65  ..#       querie
04c0: 73 20 61 67 61 69 6e 73 74 20 69 74 2c 20 61 6e  s against it, an
04d0: 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e  d then close it.
04e0: 0d 0a 23 0d 0a 73 65 74 20 63 6f 75 6e 74 20 31  ..#..set count 1
04f0: 30 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23  0....###########
0500: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0520: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0540: 23 23 23 23 0d 0a 0d 0a 72 75 6e 54 65 73 74 20  ####....runTest 
0550: 7b 74 65 73 74 20 74 68 72 65 61 64 2d 31 2e 31  {test thread-1.1
0560: 20 7b 54 68 72 65 61 64 2e 41 62 6f 72 74 28 29   {Thread.Abort()
0570: 20 69 6d 70 61 63 74 20 6f 6e 20 6e 61 74 69 76   impact on nativ
0580: 65 20 72 65 73 6f 75 72 63 65 73 7d 20 2d 73 65  e resources} -se
0590: 74 75 70 20 7b 0d 0a 20 20 73 65 74 75 70 44 62  tup {..  setupDb
05a0: 20 5b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 74   [set fileName t
05b0: 68 72 65 61 64 2d 31 2e 31 2e 64 62 5d 0d 0a 0d  hread-1.1.db]...
05c0: 0a 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63  .  tputs $test_c
05d0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
05e0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d  gs \..      "---
05f0: 2d 20 75 73 69 6e 67 20 61 20 74 6f 74 61 6c 20  - using a total 
0600: 6f 66 20 22 20 24 63 6f 75 6e 74 20 22 20 74 68  of " $count " th
0610: 72 65 61 64 73 2e 2e 2e 5c 6e 22 5d 0d 0a 7d 20  reads...\n"]..} 
0620: 2d 62 6f 64 79 20 7b 0d 0a 20 20 73 71 6c 20 65  -body {..  sql e
0630: 78 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20  xecute $db {..  
0640: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0650: 31 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(x INTEGER PRIM
0660: 41 52 59 20 4b 45 59 2c 20 79 20 42 4c 4f 42 29  ARY KEY, y BLOB)
0670: 3b 0d 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
0680: 54 4f 20 74 31 20 28 79 29 20 56 41 4c 55 45 53  TO t1 (y) VALUES
0690: 28 52 41 4e 44 4f 4d 42 4c 4f 42 28 31 30 30 30  (RANDOMBLOB(1000
06a0: 29 29 3b 0d 0a 20 20 20 20 49 4e 53 45 52 54 20  ));..    INSERT 
06b0: 49 4e 54 4f 20 74 31 20 28 79 29 20 56 41 4c 55  INTO t1 (y) VALU
06c0: 45 53 28 52 41 4e 44 4f 4d 42 4c 4f 42 28 31 30  ES(RANDOMBLOB(10
06d0: 30 30 29 29 3b 0d 0a 20 20 20 20 49 4e 53 45 52  00));..    INSER
06e0: 54 20 49 4e 54 4f 20 74 31 20 28 79 29 20 56 41  T INTO t1 (y) VA
06f0: 4c 55 45 53 28 52 41 4e 44 4f 4d 42 4c 4f 42 28  LUES(RANDOMBLOB(
0700: 31 30 30 30 29 29 3b 0d 0a 20 20 20 20 49 4e 53  1000));..    INS
0710: 45 52 54 20 49 4e 54 4f 20 74 31 20 28 79 29 20  ERT INTO t1 (y) 
0720: 56 41 4c 55 45 53 28 52 41 4e 44 4f 4d 42 4c 4f  VALUES(RANDOMBLO
0730: 42 28 31 30 30 30 29 29 3b 0d 0a 20 20 20 20 49  B(1000));..    I
0740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 28 79  NSERT INTO t1 (y
0750: 29 20 56 41 4c 55 45 53 28 52 41 4e 44 4f 4d 42  ) VALUES(RANDOMB
0760: 4c 4f 42 28 31 30 30 30 29 29 3b 0d 0a 20 20 7d  LOB(1000));..  }
0770: 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
0780: 45 3a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  E: The temporary
0790: 20 64 69 72 65 63 74 6f 72 79 20 6d 75 73 74 20   directory must 
07a0: 62 65 20 72 65 73 65 74 20 68 65 72 65 20 62 65  be reset here be
07b0: 63 61 75 73 65 20 69 74 20 61 6c 6c 6f 63 61 74  cause it allocat
07c0: 65 73 0d 0a 20 20 23 20 20 20 20 20 20 20 73 6f  es..  #       so
07d0: 6d 65 20 53 51 4c 69 74 65 20 6d 65 6d 6f 72 79  me SQLite memory
07e0: 20 61 6e 64 20 74 68 69 73 20 74 65 73 74 20 72   and this test r
07f0: 65 71 75 69 72 65 73 20 61 6e 20 65 78 74 72 65  equires an extre
0800: 6d 65 6c 79 20 61 63 63 75 72 61 74 65 0d 0a 20  mely accurate.. 
0810: 20 23 20 20 20 20 20 20 20 72 65 61 64 69 6e 67   #       reading
0820: 2e 0d 0a 20 20 23 0d 0a 20 20 73 71 6c 20 65 78  ...  #..  sql ex
0830: 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20  ecute $db {..   
0840: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
0850: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22  re_directory = "
0860: 22 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ";..  }....  #..
0870: 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20    # NOTE: Close 
0880: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77  the database now
0890: 2c 20 66 72 65 65 69 6e 67 20 61 6e 79 20 6e 61  , freeing any na
08a0: 74 69 76 65 20 53 51 4c 69 74 65 20 6d 65 6d 6f  tive SQLite memo
08b0: 72 79 20 61 6e 64 2f 6f 72 0d 0a 20 20 23 20 20  ry and/or..  #  
08c0: 20 20 20 20 20 72 65 73 6f 75 72 63 65 73 20 74       resources t
08d0: 68 61 74 20 69 74 20 6d 61 79 20 62 65 20 75 73  hat it may be us
08e0: 69 6e 67 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ing at this poin
08f0: 74 3b 20 68 6f 77 65 76 65 72 2c 20 64 6f 20 6e  t; however, do n
0900: 6f 74 0d 0a 20 20 23 20 20 20 20 20 20 20 61 63  ot..  #       ac
0910: 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  tually delete th
0920: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0930: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 65  because it is ne
0940: 65 64 65 64 20 69 6e 20 74 68 65 20 43 23 0d 0a  eded in the C#..
0950: 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
0960: 6f 72 20 74 68 69 73 20 74 65 73 74 2e 0d 0a 20  or this test... 
0970: 20 23 0d 0a 20 20 63 6c 65 61 6e 75 70 44 62 20   #..  cleanupDb 
0980: 24 66 69 6c 65 4e 61 6d 65 20 64 62 20 74 72 75  $fileName db tru
0990: 65 20 66 61 6c 73 65 20 66 61 6c 73 65 3b 20 75  e false false; u
09a0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
09b0: 20 64 62 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20   db....  #..  # 
09c0: 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20  NOTE: Setup the 
09d0: 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 69  variables used i
09e0: 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 61 6c 6c  n the dynamicall
09f0: 79 20 73 75 62 73 74 69 74 75 74 65 64 20 43 23  y substituted C#
0a00: 20 63 6f 64 65 0d 0a 20 20 23 20 20 20 20 20 20   code..  #      
0a10: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 62 6f   for the main bo
0a20: 64 79 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  dy of this test 
0a30: 28 62 65 6c 6f 77 29 2e 0d 0a 20 20 23 0d 0a 20  (below)...  #.. 
0a40: 20 73 65 74 20 69 64 20 5b 6f 62 6a 65 63 74 20   set id [object 
0a50: 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
0a60: 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78  er.GetActive Nex
0a70: 74 49 64 5d 0d 0a 20 20 73 65 74 20 64 61 74 61  tId]..  set data
0a80: 53 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69  Source [file joi
0a90: 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69  n [getDatabaseDi
0aa0: 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61  rectory] $fileNa
0ab0: 6d 65 5d 0d 0a 0d 0a 20 20 73 65 74 20 73 71 6c  me]....  set sql
0ac0: 20 7b 20 5c 0d 0a 20 20 20 20 53 45 4c 45 43 54   { \..    SELECT
0ad0: 20 78 2c 20 79 20 46 52 4f 4d 20 74 31 20 4f 52   x, y FROM t1 OR
0ae0: 44 45 52 20 42 59 20 78 3b 20 5c 0d 0a 20 20 7d  DER BY x; \..  }
0af0: 0d 0a 0d 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63  ....  unset -noc
0b00: 6f 6d 70 6c 61 69 6e 20 72 65 73 75 6c 74 73 20  omplain results 
0b10: 65 72 72 6f 72 73 0d 0a 0d 0a 20 20 73 65 74 20  errors....  set 
0b20: 63 6f 64 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68  code [compileCSh
0b30: 61 72 70 57 69 74 68 20 5b 73 75 62 73 74 20 7b  arpWith [subst {
0b40: 0d 0a 20 20 20 20 75 73 69 6e 67 20 53 79 73 74  ..    using Syst
0b50: 65 6d 3b 0d 0a 20 20 20 20 75 73 69 6e 67 20 53  em;..    using S
0b60: 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e  ystem.Collection
0b70: 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 20 20 20 20  s.Generic;..    
0b80: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74  using System.Dat
0b90: 61 2e 53 51 4c 69 74 65 3b 0d 0a 20 20 20 20 75  a.SQLite;..    u
0ba0: 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61 67  sing System.Diag
0bb0: 6e 6f 73 74 69 63 73 3b 0d 0a 20 20 20 20 75 73  nostics;..    us
0bc0: 69 6e 67 20 53 79 73 74 65 6d 2e 54 68 72 65 61  ing System.Threa
0bd0: 64 69 6e 67 3b 0d 0a 20 20 20 20 75 73 69 6e 67  ding;..    using
0be0: 20 45 61 67 6c 65 2e 5f 43 6f 6e 74 61 69 6e 65   Eagle._Containe
0bf0: 72 73 2e 50 75 62 6c 69 63 3b 0d 0a 0d 0a 20 20  rs.Public;....  
0c00: 20 20 6e 61 6d 65 73 70 61 63 65 20 5f 44 79 6e    namespace _Dyn
0c10: 61 6d 69 63 24 7b 69 64 7d 0d 0a 20 20 20 20 7b  amic${id}..    {
0c20: 0d 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20 73  ..      public s
0c30: 74 61 74 69 63 20 63 6c 61 73 73 20 54 65 73 74  tatic class Test
0c40: 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20 7b 0d 0a  ${id}..      {..
0c50: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
0c60: 74 61 74 69 63 20 49 6e 74 4c 69 73 74 20 52 75  tatic IntList Ru
0c70: 6e 54 65 73 74 54 68 72 65 61 64 73 28 29 0d 0a  nTestThreads()..
0c80: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0c90: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
0ca0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69 73     // NOTE: This
0cb0: 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
0cc0: 6d 62 65 72 20 6f 66 20 64 61 74 61 20 62 79 74  mber of data byt
0cd0: 65 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 73  es seen in the s
0ce0: 65 63 6f 6e 64 0d 0a 20 20 20 20 20 20 20 20 20  econd..         
0cf0: 20 2f 2f 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e   //       column
0d00: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 72 65   of the query re
0d10: 73 75 6c 74 20 72 6f 77 73 20 73 65 65 6e 20 62  sult rows seen b
0d20: 79 20 61 6c 6c 20 74 65 73 74 20 74 68 72 65 61  y all test threa
0d30: 64 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2f  ds...          /
0d40: 2f 20 20 20 20 20 20 20 54 68 69 73 20 76 61 6c  /       This val
0d50: 75 65 20 77 69 6c 6c 20 76 61 72 79 20 67 72 65  ue will vary gre
0d60: 61 74 6c 79 20 62 61 73 65 64 20 75 70 6f 6e 20  atly based upon 
0d70: 68 6f 77 20 6d 61 6e 79 20 6c 6f 6f 70 0d 0a 20  how many loop.. 
0d80: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
0d90: 20 20 69 74 65 72 61 74 69 6f 6e 73 20 61 72 65    iterations are
0da0: 20 70 65 72 66 6f 72 6d 65 64 20 70 72 69 6f 72   performed prior
0db0: 20 74 6f 20 65 61 63 68 20 74 65 73 74 20 74 68   to each test th
0dc0: 72 65 61 64 20 62 65 69 6e 67 0d 0a 20 20 20 20  read being..    
0dd0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61        //       a
0de0: 62 6f 72 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  borted...       
0df0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
0e00: 20 69 6e 74 20 73 75 6d 20 3d 20 30 3b 0d 0a 0d   int sum = 0;...
0e10: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20  .          //.. 
0e20: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
0e30: 3a 20 54 68 69 73 20 69 73 20 74 68 65 20 74 6f  : This is the to
0e40: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 71 75  tal number of qu
0e50: 65 72 79 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ery result rows 
0e60: 73 65 65 6e 20 62 79 20 61 6c 6c 0d 0a 20 20 20  seen by all..   
0e70: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
0e80: 74 68 65 20 74 65 73 74 20 74 68 72 65 61 64 73  the test threads
0e90: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  ...          //.
0ea0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
0eb0: 6f 77 73 20 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20  ows = 0;....    
0ec0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
0ed0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69      // NOTE: Thi
0ee0: 73 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  s is the total n
0ef0: 75 6d 62 65 72 20 6f 66 20 65 78 63 65 70 74 69  umber of excepti
0f00: 6f 6e 73 20 63 61 75 67 68 74 20 62 79 20 61 6c  ons caught by al
0f10: 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  l the..         
0f20: 20 2f 2f 20 20 20 20 20 20 20 74 65 73 74 20 74   //       test t
0f30: 68 72 65 61 64 73 2e 0d 0a 20 20 20 20 20 20 20  hreads...       
0f40: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
0f50: 20 69 6e 74 20 65 72 72 6f 72 73 20 3d 20 30 3b   int errors = 0;
0f60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  ....          //
0f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e  ..          // N
0f80: 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 68 65  OTE: This is the
0f90: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0fa0: 20 74 65 73 74 20 74 68 72 65 61 64 73 20 74 6f   test threads to
0fb0: 20 63 72 65 61 74 65 2e 0d 0a 20 20 20 20 20 20   create...      
0fc0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
0fd0: 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 24 7b    int count = ${
0fe0: 63 6f 75 6e 74 7d 3b 0d 0a 0d 0a 20 20 20 20 20  count};....     
0ff0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
1000: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65 61     // NOTE: Crea
1010: 74 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  te the array of 
1020: 74 68 72 65 61 64 20 6f 62 6a 65 63 74 73 2e 0d  thread objects..
1030: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20  .          //.. 
1040: 20 20 20 20 20 20 20 20 20 54 68 72 65 61 64 5c           Thread\
1050: 5b 5c 5d 20 74 68 72 65 61 64 20 3d 20 6e 65 77  [\] thread = new
1060: 20 54 68 72 65 61 64 5c 5b 63 6f 75 6e 74 5c 5d   Thread\[count\]
1070: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f  ;....          /
1080: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  /..          // 
1090: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 72  NOTE: Create a r
10a0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
10b0: 65 72 61 74 6f 72 20 73 75 69 74 61 62 6c 65 20  erator suitable 
10c0: 66 6f 72 20 77 61 69 74 69 6e 67 20 61 0d 0a 20  for waiting a.. 
10d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
10e0: 20 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20    random number 
10f0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
1100: 62 65 74 77 65 65 6e 20 65 61 63 68 20 6c 6f 6f  between each loo
1110: 70 20 69 74 65 72 61 74 69 6f 6e 0d 0a 20 20 20  p iteration..   
1120: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
1130: 61 6e 64 20 74 68 65 6e 20 73 65 6c 65 63 74 69  and then selecti
1140: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 74 68 72 65  ng a random thre
1150: 61 64 20 69 6e 64 65 78 2e 0d 0a 20 20 20 20 20  ad index...     
1160: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
1170: 20 20 20 52 61 6e 64 6f 6d 20 72 61 6e 64 6f 6d     Random random
1180: 20 3d 20 6e 65 77 20 52 61 6e 64 6f 6d 28 29 3b   = new Random();
1190: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  ....          //
11a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e  ..          // N
11b0: 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
11c0: 65 76 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  event that will 
11d0: 62 65 20 75 73 65 64 20 74 6f 20 73 79 6e 63 68  be used to synch
11e0: 72 6f 6e 69 7a 65 20 61 6c 6c 20 74 68 65 0d 0a  ronize all the..
11f0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
1200: 20 20 20 63 72 65 61 74 65 64 20 74 68 72 65 61     created threa
1210: 64 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ds so that they 
1220: 73 74 61 72 74 20 64 6f 69 6e 67 20 74 68 65 69  start doing thei
1230: 72 20 61 63 74 75 61 6c 20 74 65 73 74 0d 0a 20  r actual test.. 
1240: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1250: 20 20 22 77 6f 72 6b 22 20 61 74 20 61 70 70 72    "work" at appr
1260: 6f 78 69 6d 61 74 65 6c 79 20 74 68 65 20 73 61  oximately the sa
1270: 6d 65 20 74 69 6d 65 2e 20 20 54 68 69 73 20 69  me time.  This i
1280: 73 20 61 6c 73 6f 20 75 73 65 64 0d 0a 20 20 20  s also used..   
1290: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
12a0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
12b0: 74 20 61 6c 6c 20 74 65 73 74 20 74 68 72 65 61  t all test threa
12c0: 64 73 20 61 72 65 20 69 6e 73 69 64 65 20 6f 66  ds are inside of
12d0: 20 61 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20   a try..        
12e0: 20 20 2f 2f 20 20 20 20 20 20 20 62 6c 6f 63 6b    //       block
12f0: 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
1300: 6e 67 20 74 6f 20 61 62 6f 72 74 20 74 68 65 6d  ng to abort them
1310: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  ...          //.
1320: 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67  .          using
1330: 20 28 4d 61 6e 75 61 6c 52 65 73 65 74 45 76 65   (ManualResetEve
1340: 6e 74 20 67 6f 45 76 65 6e 74 20 3d 20 6e 65 77  nt goEvent = new
1350: 20 4d 61 6e 75 61 6c 52 65 73 65 74 45 76 65 6e   ManualResetEven
1360: 74 28 66 61 6c 73 65 29 29 0d 0a 20 20 20 20 20  t(false))..     
1370: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1380: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1390: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65      // NOTE: Cre
13a0: 61 74 65 20 61 20 28 72 65 75 73 61 62 6c 65 29  ate a (reusable)
13b0: 20 64 65 6c 65 67 61 74 65 20 74 68 61 74 20 77   delegate that w
13c0: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
13d0: 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20  code..          
13e0: 20 20 2f 2f 20 20 20 20 20 20 20 74 68 61 74 20    //       that 
13f0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 63 72 65 61  most of the crea
1400: 74 65 64 20 74 65 73 74 20 74 68 72 65 61 64 73  ted test threads
1410: 20 61 72 65 20 74 6f 20 65 78 65 63 75 74 65 2e   are to execute.
1420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
1430: 20 20 20 20 20 20 20 54 68 69 73 20 63 6f 64 65         This code
1440: 20 77 69 6c 6c 20 6f 70 65 6e 2c 20 75 73 65 2c   will open, use,
1450: 20 61 6e 64 20 63 6c 6f 73 65 20 61 20 73 69 6e   and close a sin
1460: 67 6c 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20  gle database..  
1470: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
1480: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20     connection.  
1490: 4d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64  Multiple command
14a0: 73 20 61 6e 64 20 64 61 74 61 20 72 65 61 64 65  s and data reade
14b0: 72 73 20 77 69 6c 6c 20 61 6c 73 6f 0d 0a 20 20  rs will also..  
14c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
14d0: 20 20 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20     be used...   
14e0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
14f0: 20 20 20 20 20 20 20 20 20 54 68 72 65 61 64 53           ThreadS
1500: 74 61 72 74 20 74 68 72 65 61 64 53 74 61 72 74  tart threadStart
1510: 31 20 3d 20 64 65 6c 65 67 61 74 65 28 29 0d 0a  1 = delegate()..
1520: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1550: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1560: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
1570: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
1580: 57 61 69 74 20 66 6f 72 65 76 65 72 20 66 6f 72  Wait forever for
1590: 20 74 68 65 20 22 47 4f 22 20 73 69 67 6e 61 6c   the "GO" signal
15a0: 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 74 68 72   so that all thr
15b0: 65 61 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20  eads..          
15c0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63        //       c
15d0: 61 6e 20 73 74 61 72 74 20 77 6f 72 6b 69 6e 67  an start working
15e0: 20 61 74 20 61 70 70 72 6f 78 69 6d 61 74 65 6c   at approximatel
15f0: 79 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  y the same time.
1600: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1610: 20 20 2f 2f 20 20 20 20 20 20 20 54 68 69 73 20    //       This 
1620: 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  is also used to 
1630: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
1640: 6c 6c 20 74 65 73 74 20 74 68 72 65 61 64 73 0d  ll test threads.
1650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1660: 20 2f 2f 20 20 20 20 20 20 20 61 72 65 20 69 6e   //       are in
1670: 73 69 64 65 20 6f 66 20 61 20 74 72 79 20 62 6c  side of a try bl
1680: 6f 63 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ock before attem
1690: 70 74 69 6e 67 20 74 6f 20 61 62 6f 72 74 0d 0a  pting to abort..
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2f 20 20 20 20 20 20 20 74 68 65 6d 2e 0d 0a  //       them...
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
16e0: 20 20 20 20 67 6f 45 76 65 6e 74 2e 57 61 69 74      goEvent.Wait
16f0: 4f 6e 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  One();....      
1700: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1720: 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20   NOTE: Create a 
1730: 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  new connection o
1740: 62 6a 65 63 74 2e 20 20 57 65 20 70 75 72 70 6f  bject.  We purpo
1750: 73 65 6c 79 20 61 76 6f 69 64 0d 0a 20 20 20 20  sely avoid..    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
1770: 20 20 20 20 20 70 75 74 74 69 6e 67 20 74 68 69       putting thi
1780: 73 20 69 6e 73 69 64 65 20 61 20 22 75 73 69 6e  s inside a "usin
1790: 67 22 20 62 6c 6f 63 6b 20 74 6f 20 68 65 6c 70  g" block to help
17a0: 20 74 65 73 74 20 6f 75 72 0d 0a 20 20 20 20 20   test our..     
17b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
17c0: 20 20 20 20 63 6c 65 61 6e 75 70 20 76 69 61 20      cleanup via 
17d0: 74 68 65 20 67 61 72 62 61 67 65 20 63 6f 6c 6c  the garbage coll
17e0: 65 63 74 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20  ector...        
17f0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
1800: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69              SQLi
1810: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  teConnection con
1820: 6e 65 63 74 69 6f 6e 20 3d 20 6e 65 77 20 53 51  nection = new SQ
1830: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d  LiteConnection(.
1840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1850: 20 20 20 20 20 22 44 61 74 61 20 53 6f 75 72 63       "Data Sourc
1860: 65 3d 24 7b 64 61 74 61 53 6f 75 72 63 65 7d 3b  e=${dataSource};
1870: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
1880: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
1890: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
18a0: 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 63 6f 6e  TE: Open the con
18b0: 6e 65 63 74 69 6f 6e 2e 20 20 41 66 74 65 72 20  nection.  After 
18c0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 61 74 69  this point, nati
18d0: 76 65 20 6d 65 6d 6f 72 79 0d 0a 20 20 20 20 20  ve memory..     
18e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
18f0: 20 20 20 20 61 6e 64 20 72 65 73 6f 75 72 63 65      and resource
1900: 73 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  s have been allo
1910: 63 61 74 65 64 20 62 79 20 74 68 69 73 20 74 68  cated by this th
1920: 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  read...         
1930: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
1940: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65             conne
1950: 63 74 69 6f 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d  ction.Open();...
1960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1970: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
1980: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4c 6f       // NOTE: Lo
1990: 6f 70 20 66 6f 72 65 76 65 72 20 75 6e 74 69 6c  op forever until
19a0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
19b0: 64 20 73 69 67 6e 61 6c 73 20 75 73 20 74 6f 20  d signals us to 
19c0: 73 74 6f 70 0d 0a 20 20 20 20 20 20 20 20 20 20  stop..          
19d0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 76        //       v
19e0: 69 61 20 63 61 6c 6c 69 6e 67 20 54 68 72 65 61  ia calling Threa
19f0: 64 2e 41 62 6f 72 74 28 29 20 6d 65 74 68 6f 64  d.Abort() method
1a00: 20 6f 6e 20 6f 75 72 20 61 73 73 6f 63 69 61 74   on our associat
1a10: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
1a20: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68 72      //       thr
1a30: 65 61 64 20 6f 62 6a 65 63 74 2e 0d 0a 20 20 20  ead object...   
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
1a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a60: 20 77 68 69 6c 65 20 28 74 72 75 65 29 0d 0a 20   while (true).. 
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1a80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a90: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1aa0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
1ab0: 45 3a 20 43 72 65 61 74 65 20 61 20 64 69 63 74  E: Create a dict
1ac0: 69 6f 6e 61 72 79 20 74 6f 20 74 65 6d 70 6f 72  ionary to tempor
1ad0: 61 72 69 6c 79 20 68 6f 6c 64 20 74 68 65 20 76  arily hold the v
1ae0: 61 6c 75 65 73 0d 0a 20 20 20 20 20 20 20 20 20  alues..         
1af0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1b00: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 20    from the data 
1b10: 72 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20  reader for this 
1b20: 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 2e 0d  loop iteration..
1b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b40: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
1b50: 20 20 20 20 20 20 20 20 20 44 69 63 74 69 6f 6e           Diction
1b60: 61 72 79 3c 6c 6f 6e 67 2c 20 62 79 74 65 5c 5b  ary<long, byte\[
1b70: 5c 5d 3e 20 72 65 73 75 6c 74 73 20 3d 0d 0a 20  \]> results =.. 
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 6e 65 77 20 44 69 63 74 69 6f 6e       new Diction
1ba0: 61 72 79 3c 6c 6f 6e 67 2c 20 62 79 74 65 5c 5b  ary<long, byte\[
1bb0: 5c 5d 3e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  \]>();....      
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65 61 74    // NOTE: Creat
1bf0: 65 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20  e a new command 
1c00: 6f 62 6a 65 63 74 20 75 73 69 6e 67 20 74 68 65  object using the
1c10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c30: 2f 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66  /       object f
1c40: 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 2e 20  or this thread. 
1c50: 20 41 67 61 69 6e 2c 20 61 76 6f 69 64 20 70 75   Again, avoid pu
1c60: 74 74 69 6e 67 20 74 68 69 73 0d 0a 20 20 20 20  tting this..    
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1c80: 20 20 20 20 20 20 20 69 6e 73 69 64 65 20 61 20         inside a 
1c90: 22 75 73 69 6e 67 22 20 62 6c 6f 63 6b 20 74 6f  "using" block to
1ca0: 20 68 65 6c 70 20 74 65 73 74 20 6f 75 72 20 63   help test our c
1cb0: 6c 65 61 6e 75 70 20 76 69 61 0d 0a 20 20 20 20  leanup via..    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1cd0: 20 20 20 20 20 20 20 74 68 65 20 67 61 72 62 61         the garba
1ce0: 67 65 20 63 6f 6c 6c 65 63 74 6f 72 2e 0d 0a 20  ge collector... 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
1d10: 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6d         SQLiteCom
1d20: 6d 61 6e 64 20 63 6f 6d 6d 61 6e 64 20 3d 20 6e  mand command = n
1d30: 65 77 20 53 51 4c 69 74 65 43 6f 6d 6d 61 6e 64  ew SQLiteCommand
1d40: 28 22 24 7b 73 71 6c 7d 22 2c 0d 0a 20 20 20 20  ("${sql}",..    
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0d 0a    connection);..
1d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d80: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
1da0: 45 3a 20 45 78 65 63 75 74 65 20 74 68 65 20 71  E: Execute the q
1db0: 75 65 72 79 20 61 6e 64 20 67 65 74 20 74 68 65  uery and get the
1dc0: 20 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 20   resulting data 
1dd0: 72 65 61 64 65 72 0d 0a 20 20 20 20 20 20 20 20  reader..        
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
1df0: 20 20 20 6f 62 6a 65 63 74 2e 20 20 41 67 61 69     object.  Agai
1e00: 6e 2c 20 61 76 6f 69 64 20 70 75 74 74 69 6e 67  n, avoid putting
1e10: 20 74 68 69 73 20 69 6e 73 69 64 65 20 61 20 22   this inside a "
1e20: 75 73 69 6e 67 22 0d 0a 20 20 20 20 20 20 20 20  using"..        
1e30: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
1e40: 20 20 20 62 6c 6f 63 6b 20 74 6f 20 68 65 6c 70     block to help
1e50: 20 74 65 73 74 20 6f 75 72 20 63 6c 65 61 6e 75   test our cleanu
1e60: 70 20 76 69 61 20 74 68 65 20 67 61 72 62 61 67  p via the garbag
1e70: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1e80: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63 6f       //       co
1e90: 6c 6c 65 63 74 6f 72 2e 0d 0a 20 20 20 20 20 20  llector...      
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 53 51 4c 69 74 65 44 61 74 61 52 65 61 64    SQLiteDataRead
1ed0: 65 72 20 72 65 61 64 65 72 20 3d 20 63 6f 6d 6d  er reader = comm
1ee0: 61 6e 64 2e 45 78 65 63 75 74 65 52 65 61 64 65  and.ExecuteReade
1ef0: 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  r();....        
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 2f 2f 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 70  // NOTE: Start p
1f30: 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 20 61  rocessing each a
1f40: 76 61 69 6c 61 62 6c 65 20 71 75 65 72 79 20 72  vailable query r
1f50: 65 73 75 6c 74 20 72 6f 77 2e 0d 0a 20 20 20 20  esult row...    
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1f70: 20 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63         This proc
1f80: 65 73 73 69 6e 67 20 28 6f 72 20 61 6e 79 20 6f  essing (or any o
1f90: 66 20 74 68 65 20 61 62 6f 76 65 20 70 72 6f 63  f the above proc
1fa0: 65 73 73 69 6e 67 29 0d 0a 20 20 20 20 20 20 20  essing)..       
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
1fc0: 20 20 20 20 6d 61 79 20 62 65 20 73 74 6f 70 70      may be stopp
1fd0: 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 20 64  ed at any time d
1fe0: 75 65 20 74 6f 20 74 68 69 73 20 74 65 73 74 20  ue to this test 
1ff0: 74 68 72 65 61 64 0d 0a 20 20 20 20 20 20 20 20  thread..        
2000: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
2010: 20 20 20 62 65 69 6e 67 20 61 62 6f 72 74 65 64     being aborted
2020: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2030: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2040: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
2050: 20 28 72 65 61 64 65 72 2e 52 65 61 64 28 29 29   (reader.Read())
2060: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2070: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2080: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
2090: 74 73 2e 41 64 64 28 28 6c 6f 6e 67 29 72 65 61  ts.Add((long)rea
20a0: 64 65 72 5c 5b 22 78 22 5c 5d 2c 0d 0a 20 20 20  der\["x"\],..   
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 72 65 61 64 65 72 5c 5b 22 79 22       reader\["y"
20d0: 5c 5d 20 61 73 20 62 79 74 65 5c 5b 5c 5d 29 3b  \] as byte\[\]);
20e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20f0: 20 20 20 20 20 20 20 20 49 6e 74 65 72 6c 6f 63          Interloc
2100: 6b 65 64 2e 41 64 64 28 72 65 66 20 73 75 6d 2c  ked.Add(ref sum,
2110: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2120: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
2130: 73 5c 5b 28 6c 6f 6e 67 29 72 65 61 64 65 72 5c  s\[(long)reader\
2140: 5b 22 78 22 5c 5d 5c 5d 2e 4c 65 6e 67 74 68 29  ["x"\]\].Length)
2150: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2160: 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 6c 6f           Interlo
2170: 63 6b 65 64 2e 49 6e 63 72 65 6d 65 6e 74 28 72  cked.Increment(r
2180: 65 66 20 72 6f 77 73 29 3b 0d 0a 20 20 20 20 20  ef rows);..     
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
21a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21b0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
21c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
21d0: 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 64 61 74  E: Close the dat
21e0: 61 20 72 65 61 64 65 72 20 66 6f 72 20 74 68 69  a reader for thi
21f0: 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  s loop iteration
2200: 20 61 73 20 77 65 0d 0a 20 20 20 20 20 20 20 20   as we..        
2210: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
2220: 20 20 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68     are done with
2230: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20   it...          
2240: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2260: 61 64 65 72 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20  ader.Close();.. 
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 72 65 61 64 65 72 20 3d 20 6e 75 6c 6c 3b 0d   reader = null;.
2290: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
22a0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
22b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
22c0: 54 45 3a 20 44 69 73 70 6f 73 65 20 74 68 65 20  TE: Dispose the 
22d0: 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 74 68 69 73  command for this
22e0: 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20   loop iteration 
22f0: 61 73 20 77 65 0d 0a 20 20 20 20 20 20 20 20 20  as we..         
2300: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
2310: 20 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68 20    are done with 
2320: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  it...           
2330: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
2350: 6d 61 6e 64 2e 44 69 73 70 6f 73 65 28 29 3b 0d  mand.Dispose();.
2360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2370: 20 20 20 63 6f 6d 6d 61 6e 64 20 3d 20 6e 75 6c     command = nul
2380: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
2390: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
23a0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
23c0: 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20  NOTE: Close the 
23d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 74  connection for t
23e0: 68 69 73 20 74 65 73 74 20 74 68 72 65 61 64 20  his test thread 
23f0: 61 73 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20  as we are..     
2400: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
2410: 20 20 20 20 64 6f 6e 65 20 77 69 74 68 20 69 74      done with it
2420: 2e 20 20 53 69 6e 63 65 20 74 68 65 20 61 62 6f  .  Since the abo
2430: 76 65 20 6c 6f 6f 70 20 69 73 20 69 6e 66 69 6e  ve loop is infin
2440: 69 74 65 2c 20 69 74 0d 0a 20 20 20 20 20 20 20  ite, it..       
2450: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
2460: 20 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65    should only be
2470: 20 65 78 69 74 65 64 20 76 69 61 20 74 68 69 73   exited via this
2480: 20 74 65 73 74 20 74 68 72 65 61 64 20 62 65 69   test thread bei
2490: 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng..            
24a0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61 62 6f      //       abo
24b0: 72 74 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c  rted; therefore,
24c0: 20 65 78 65 63 75 74 69 6f 6e 20 73 68 6f 75 6c   execution shoul
24d0: 64 20 6e 65 76 65 72 20 72 65 61 63 68 20 74 68  d never reach th
24e0: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
24f0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 70 6f 69      //       poi
2500: 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt...           
2510: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2520: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
2530: 69 6f 6e 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20 20  ion.Close();..  
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2550: 6e 6e 65 63 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b  nnection = null;
2560: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2570: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
2580: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
2590: 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  n e)..          
25a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
25b0: 20 20 20 20 20 20 20 49 6e 74 65 72 6c 6f 63 6b         Interlock
25c0: 65 64 2e 49 6e 63 72 65 6d 65 6e 74 28 72 65 66  ed.Increment(ref
25d0: 20 65 72 72 6f 72 73 29 3b 0d 0a 20 20 20 20 20   errors);..     
25e0: 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
25f0: 2e 57 72 69 74 65 4c 69 6e 65 28 65 29 3b 0d 0a  .WriteLine(e);..
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0d  .            };.
2620: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
2630: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
2640: 2f 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61  / NOTE: Create a
2650: 20 28 72 65 75 73 61 62 6c 65 29 20 64 65 6c 65   (reusable) dele
2660: 67 61 74 65 20 74 68 61 74 20 77 69 6c 6c 20 63  gate that will c
2670: 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 64 65 0d  ontain the code.
2680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
2690: 20 20 20 20 20 20 74 68 61 74 20 68 61 6c 66 20        that half 
26a0: 74 68 65 20 63 72 65 61 74 65 64 20 74 68 72 65  the created thre
26b0: 61 64 73 20 61 72 65 20 74 6f 20 65 78 65 63 75  ads are to execu
26c0: 74 65 2e 20 20 54 68 69 73 20 63 6f 64 65 0d 0a  te.  This code..
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
26e0: 20 20 20 20 20 77 69 6c 6c 20 72 65 70 65 61 74       will repeat
26f0: 65 64 6c 79 20 63 61 6c 6c 20 74 68 65 20 54 68  edly call the Th
2700: 72 65 61 64 2e 41 62 6f 72 74 28 29 20 6d 65 74  read.Abort() met
2710: 68 6f 64 20 6f 6e 20 61 6c 6c 20 74 68 65 0d 0a  hod on all the..
2720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
2730: 20 20 20 20 20 6f 74 68 65 72 20 74 65 73 74 20       other test 
2740: 74 68 72 65 61 64 73 20 75 6e 74 69 6c 20 74 68  threads until th
2750: 65 79 20 61 6c 6c 20 61 70 70 65 61 72 20 74 6f  ey all appear to
2760: 20 62 65 20 64 65 61 64 2e 0d 0a 20 20 20 20 20   be dead...     
2770: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2780: 20 20 20 20 20 20 20 54 68 72 65 61 64 53 74 61         ThreadSta
2790: 72 74 20 74 68 72 65 61 64 53 74 61 72 74 32 20  rt threadStart2 
27a0: 3d 20 64 65 6c 65 67 61 74 65 28 29 0d 0a 20 20  = delegate()..  
27b0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
27c0: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
27e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27f0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
2800: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 61       // NOTE: Wa
2810: 69 74 20 66 6f 72 65 76 65 72 20 66 6f 72 20 74  it forever for t
2820: 68 65 20 22 47 4f 22 20 73 69 67 6e 61 6c 20 73  he "GO" signal s
2830: 6f 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  o that all threa
2840: 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ds..            
2850: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63 61 6e      //       can
2860: 20 73 74 61 72 74 20 77 6f 72 6b 69 6e 67 20 61   start working a
2870: 74 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  t approximately 
2880: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0d 0a  the same time...
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 2f 2f 20 20 20 20 20 20 20 54 68 69 73 20 69 73  //       This is
28b0: 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6d 61   also used to ma
28c0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  ke sure that all
28d0: 20 74 65 73 74 20 74 68 72 65 61 64 73 0d 0a 20   test threads.. 
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f0: 2f 20 20 20 20 20 20 20 61 72 65 20 69 6e 73 69  /       are insi
2900: 64 65 20 6f 66 20 61 20 74 72 79 20 62 6c 6f 63  de of a try bloc
2910: 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
2920: 69 6e 67 20 74 6f 20 61 62 6f 72 74 0d 0a 20 20  ing to abort..  
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2940: 20 20 20 20 20 20 20 74 68 65 6d 2e 0d 0a 20 20         them...  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2960: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2970: 20 20 67 6f 45 76 65 6e 74 2e 57 61 69 74 4f 6e    goEvent.WaitOn
2980: 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
2990: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
29b0: 4f 54 45 3a 20 47 69 76 65 20 74 68 65 20 6f 74  OTE: Give the ot
29c0: 68 65 72 20 74 65 73 74 20 74 68 72 65 61 64 73  her test threads
29d0: 20 61 20 73 6c 69 67 68 74 20 68 65 61 64 20 73   a slight head s
29e0: 74 61 72 74 20 74 6f 0d 0a 20 20 20 20 20 20 20  tart to..       
29f0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
2a00: 20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74    make sure that
2a10: 20 74 68 65 79 20 61 72 65 20 66 75 6c 6c 79 20   they are fully 
2a20: 61 6c 69 76 65 20 70 72 69 6f 72 20 74 6f 20 74  alive prior to t
2a30: 72 79 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20  rying..         
2a40: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
2a50: 74 6f 20 61 62 6f 72 74 20 61 6e 79 20 6f 66 20  to abort any of 
2a60: 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20 20 20 20  them...         
2a70: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2a80: 20 20 20 20 20 20 20 20 20 20 20 54 68 72 65 61             Threa
2a90: 64 2e 53 6c 65 65 70 28 31 30 30 30 29 3b 0d 0a  d.Sleep(1000);..
2aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ab0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
2ac0: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4c        // NOTE: L
2ad0: 6f 6f 70 20 66 6f 72 65 76 65 72 20 75 6e 74 69  oop forever unti
2ae0: 6c 20 61 6c 6c 20 74 65 73 74 20 74 68 72 65 61  l all test threa
2af0: 64 73 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ds appear to be 
2b00: 64 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  dead...         
2b10: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2b20: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
2b30: 20 28 74 72 75 65 29 0d 0a 20 20 20 20 20 20 20   (true)..       
2b40: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2b60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b70: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 61 69      // NOTE: Wai
2b80: 74 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  t a random numbe
2b90: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
2ba0: 73 2c 20 75 70 20 74 6f 20 61 20 66 75 6c 6c 0d  s, up to a full.
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc0: 20 20 20 2f 2f 20 20 20 20 20 20 20 73 65 63 6f     //       seco
2bd0: 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nd...           
2be0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 72               Thr
2c00: 65 61 64 2e 53 6c 65 65 70 28 72 61 6e 64 6f 6d  ead.Sleep(random
2c10: 2e 4e 65 78 74 28 30 2c 20 31 30 30 30 29 29 3b  .Next(0, 1000));
2c20: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2c30: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
2c50: 4f 54 45 3a 20 53 65 6c 65 63 74 20 61 20 72 61  OTE: Select a ra
2c60: 6e 64 6f 6d 20 74 68 72 65 61 64 20 74 6f 20 61  ndom thread to a
2c70: 62 6f 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  bort...         
2c80: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2ca0: 6e 74 20 69 6e 64 65 78 20 3d 20 72 61 6e 64 6f  nt index = rando
2cb0: 6d 2e 4e 65 78 74 28 31 2c 20 63 6f 75 6e 74 29  m.Next(1, count)
2cc0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2cd0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2cf0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 68 72  NOTE: If the thr
2d00: 65 61 64 20 61 70 70 65 61 72 73 20 74 6f 20 62  ead appears to b
2d10: 65 20 61 6c 69 76 65 2c 20 74 72 79 20 74 6f 20  e alive, try to 
2d20: 61 62 6f 72 74 0d 0a 20 20 20 20 20 20 20 20 20  abort..         
2d30: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
2d40: 20 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20    it...         
2d50: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2d70: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
2d80: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2da0: 28 74 68 72 65 61 64 5c 5b 69 6e 64 65 78 5c 5d  (thread\[index\]
2db0: 2e 49 73 41 6c 69 76 65 29 0d 0a 20 20 20 20 20  .IsAlive)..     
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 74 68 72 65 61 64 5c 5b 69 6e 64 65 78 5c 5d   thread\[index\]
2de0: 2e 41 62 6f 72 74 28 29 3b 0d 0a 20 20 20 20 20  .Abort();..     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69    catch (Excepti
2e20: 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20  on e)..         
2e30: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 54 72 61 63 65 2e 57 72 69 74 65 4c 69 6e 65 28  Trace.WriteLine(
2e60: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
2e70: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ea0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20      // NOTE: If 
2eb0: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 74 68  all the other th
2ec0: 72 65 61 64 73 20 61 72 65 20 64 65 61 64 2c 20  reads are dead, 
2ed0: 70 72 65 73 75 6d 61 62 6c 79 20 64 75 65 0d 0a  presumably due..
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 2f 2f 20 20 20 20 20 20 20 74 6f 20 62 65    //       to be
2f00: 69 6e 67 20 61 62 6f 72 74 65 64 2c 20 73 74 6f  ing aborted, sto
2f10: 70 20 6e 6f 77 2e 20 20 54 68 69 73 20 63 68 65  p now.  This che
2f20: 63 6b 20 69 73 20 73 69 6d 70 6c 65 72 2c 0d 0a  ck is simpler,..
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 2f 2f 20 20 20 20 20 20 20 61 6e 64 20 70    //       and p
2f50: 6f 73 73 69 62 6c 79 20 6d 6f 72 65 20 72 65 6c  ossibly more rel
2f60: 69 61 62 6c 65 2c 20 74 68 61 6e 20 63 68 65 63  iable, than chec
2f70: 6b 69 6e 67 20 69 66 20 61 6e 79 20 6f 66 0d 0a  king if any of..
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 2f 2f 20 20 20 20 20 20 20 74 68 65 20 74    //       the t
2fa0: 65 73 74 20 74 68 72 65 61 64 73 20 61 72 65 20  est threads are 
2fb0: 73 74 69 6c 6c 20 61 6c 69 76 65 20 76 69 61 20  still alive via 
2fc0: 74 68 65 69 72 20 49 73 41 6c 69 76 65 0d 0a 20  their IsAlive.. 
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 2f 2f 20 20 20 20 20 20 20 70 72 6f 70 65 72   //       proper
2ff0: 74 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ty...           
3000: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3020: 28 49 6e 74 65 72 6c 6f 63 6b 65 64 2e 49 6e 63  (Interlocked.Inc
3030: 72 65 6d 65 6e 74 28 72 65 66 20 65 72 72 6f 72  rement(ref error
3040: 73 29 20 3d 3d 20 63 6f 75 6e 74 29 0d 0a 20 20  s) == count)..  
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
3070: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
3080: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3090: 20 20 20 20 20 20 49 6e 74 65 72 6c 6f 63 6b 65        Interlocke
30a0: 64 2e 44 65 63 72 65 6d 65 6e 74 28 72 65 66 20  d.Decrement(ref 
30b0: 65 72 72 6f 72 73 29 3b 0d 0a 20 20 20 20 20 20  errors);..      
30c0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
30d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
30f0: 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 0d  h (Exception e).
3100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
3110: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3120: 20 20 49 6e 74 65 72 6c 6f 63 6b 65 64 2e 49 6e    Interlocked.In
3130: 63 72 65 6d 65 6e 74 28 72 65 66 20 65 72 72 6f  crement(ref erro
3140: 72 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rs);..          
3150: 20 20 20 20 20 20 54 72 61 63 65 2e 57 72 69 74        Trace.Writ
3160: 65 4c 69 6e 65 28 65 29 3b 0d 0a 20 20 20 20 20  eLine(e);..     
3170: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3180: 20 20 20 20 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20          };....  
3190: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
31a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
31b0: 45 3a 20 43 72 65 61 74 65 20 65 61 63 68 20 6f  E: Create each o
31c0: 66 20 74 68 65 20 74 65 73 74 20 74 68 72 65 61  f the test threa
31d0: 64 73 20 77 69 74 68 20 61 20 73 75 69 74 61 62  ds with a suitab
31e0: 6c 65 20 73 74 61 63 6b 0d 0a 20 20 20 20 20 20  le stack..      
31f0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 73        //       s
3200: 69 7a 65 2e 20 20 57 65 20 6d 75 73 74 20 73 70  ize.  We must sp
3210: 65 63 69 66 79 20 61 20 73 74 61 63 6b 20 73 69  ecify a stack si
3220: 7a 65 20 68 65 72 65 20 62 65 63 61 75 73 65 20  ze here because 
3230: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
3240: 20 2f 2f 20 20 20 20 20 20 20 64 65 66 61 75 6c   //       defaul
3250: 74 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 70 72  t one for the pr
3260: 6f 63 65 73 73 20 77 6f 75 6c 64 20 62 65 20 74  ocess would be t
3270: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 0d 0a  he same as the..
3280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
3290: 20 20 20 20 20 70 61 72 65 6e 74 20 65 78 65 63       parent exec
32a0: 75 74 61 62 6c 65 20 28 74 68 65 20 45 61 67 6c  utable (the Eagl
32b0: 65 20 73 68 65 6c 6c 29 2c 20 77 68 69 63 68 20  e shell), which 
32c0: 69 73 20 31 36 4d 42 2c 0d 0a 20 20 20 20 20 20  is 16MB,..      
32d0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74        //       t
32e0: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 75  oo large to be u
32f0: 73 65 66 75 6c 2e 0d 0a 20 20 20 20 20 20 20 20  seful...        
3300: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
3310: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64      for (int ind
3320: 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20  ex = 0; index < 
3330: 63 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d  count; index++).
3340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
3360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3370: 2f 2f 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20  // NOTE: Figure 
3380: 6f 75 74 20 77 68 61 74 20 6b 69 6e 64 20 6f 66  out what kind of
3390: 20 74 68 72 65 61 64 20 74 6f 20 63 72 65 61 74   thread to creat
33a0: 65 20 28 69 2e 65 2e 20 6f 6e 65 0d 0a 20 20 20  e (i.e. one..   
33b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
33c0: 20 20 20 20 74 68 61 74 20 75 73 65 73 20 61 20      that uses a 
33d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 6f 6e  connection or on
33e0: 65 20 74 68 61 74 20 63 61 6c 6c 73 20 74 68 65  e that calls the
33f0: 20 47 43 29 2e 0d 0a 20 20 20 20 20 20 20 20 20   GC)...         
3400: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3410: 20 20 20 20 20 20 20 54 68 72 65 61 64 53 74 61         ThreadSta
3420: 72 74 20 74 68 72 65 61 64 53 74 61 72 74 3b 0d  rt threadStart;.
3430: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3440: 20 69 66 20 28 69 6e 64 65 78 20 3d 3d 20 30 29   if (index == 0)
3450: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3460: 20 20 74 68 72 65 61 64 53 74 61 72 74 20 3d 20    threadStart = 
3470: 74 68 72 65 61 64 53 74 61 72 74 32 3b 0d 0a 20  threadStart2;.. 
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
3490: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
34a0: 20 20 20 74 68 72 65 61 64 53 74 61 72 74 20 3d     threadStart =
34b0: 20 74 68 72 65 61 64 53 74 61 72 74 31 3b 0d 0a   threadStart1;..
34c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
34d0: 74 68 72 65 61 64 5c 5b 69 6e 64 65 78 5c 5d 20  thread\[index\] 
34e0: 3d 20 6e 65 77 20 54 68 72 65 61 64 28 74 68 72  = new Thread(thr
34f0: 65 61 64 53 74 61 72 74 2c 20 31 30 34 38 35 37  eadStart, 104857
3500: 36 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  6);....         
3510: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3520: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
3530: 4e 61 6d 65 20 65 61 63 68 20 74 68 72 65 61 64  Name each thread
3540: 20 66 6f 72 20 61 20 62 65 74 74 65 72 20 64 65   for a better de
3550: 62 75 67 67 69 6e 67 20 65 78 70 65 72 69 65 6e  bugging experien
3560: 63 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce...           
3570: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
3580: 20 20 20 20 20 74 68 72 65 61 64 5c 5b 69 6e 64       thread\[ind
3590: 65 78 5c 5d 2e 4e 61 6d 65 20 3d 20 53 74 72 69  ex\].Name = Stri
35a0: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5b                "[
35c0: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 7b  file rootname ${
35d0: 66 69 6c 65 4e 61 6d 65 7d 5d 20 23 7b 30 7d 22  fileName}] #{0}"
35e0: 2c 20 69 6e 64 65 78 29 3b 0d 0a 20 20 20 20 20  , index);..     
35f0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
3600: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
3610: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
3620: 20 53 74 61 72 74 20 61 6c 6c 20 74 68 65 20 74   Start all the t
3630: 68 72 65 61 64 73 20 6e 6f 77 2e 20 20 54 68 65  hreads now.  The
3640: 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 63 74  y should not act
3650: 75 61 6c 6c 79 20 64 6f 0d 0a 20 20 20 20 20 20  ually do..      
3660: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61        //       a
3670: 6e 79 20 6f 66 20 74 68 65 20 74 65 73 74 20 22  ny of the test "
3680: 77 6f 72 6b 22 20 75 6e 74 69 6c 20 77 65 20 73  work" until we s
3690: 69 67 6e 61 6c 20 74 68 65 20 65 76 65 6e 74 2e  ignal the event.
36a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
36b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ..            fo
36c0: 72 20 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30  r (int index = 0
36d0: 3b 20 69 6e 64 65 78 20 3c 20 63 6f 75 6e 74 3b  ; index < count;
36e0: 20 69 6e 64 65 78 2b 2b 29 0d 0a 20 20 20 20 20   index++)..     
36f0: 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64 5c           thread\
3700: 5b 69 6e 64 65 78 5c 5d 2e 53 74 61 72 74 28 29  [index\].Start()
3710: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
3720: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
3730: 20 2f 2f 20 4e 4f 54 45 3a 20 53 65 6e 64 20 74   // NOTE: Send t
3740: 68 65 20 73 69 67 6e 61 6c 20 74 68 61 74 20 61  he signal that a
3750: 6c 6c 20 74 68 72 65 61 64 73 20 73 68 6f 75 6c  ll threads shoul
3760: 64 20 73 74 61 72 74 20 64 6f 69 6e 67 0d 0a 20  d start doing.. 
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
3780: 20 20 20 20 74 68 65 69 72 20 74 65 73 74 20 22      their test "
3790: 77 6f 72 6b 22 20 6e 6f 77 2e 0d 0a 20 20 20 20  work" now...    
37a0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
37b0: 20 20 20 20 20 20 20 20 67 6f 45 76 65 6e 74 2e          goEvent.
37c0: 53 65 74 28 29 3b 20 2f 2a 20 47 4f 20 2a 2f 0d  Set(); /* GO */.
37d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
37e0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
37f0: 2f 20 4e 4f 54 45 3a 20 57 61 69 74 20 66 6f 72  / NOTE: Wait for
3800: 65 76 65 72 20 66 6f 72 20 65 61 63 68 20 74 68  ever for each th
3810: 72 65 61 64 20 74 6f 20 66 69 6e 69 73 68 20 69  read to finish i
3820: 74 73 20 74 65 73 74 20 22 77 6f 72 6b 22 0d 0a  ts test "work"..
3830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
3840: 20 20 20 20 20 61 6e 64 20 74 68 65 6e 20 64 69       and then di
3850: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
3860: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
3870: 66 6f 72 20 28 69 6e 74 20 69 6e 64 65 78 20 3d  for (int index =
3880: 20 30 3b 20 69 6e 64 65 78 20 3c 20 63 6f 75 6e   0; index < coun
3890: 74 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a 20 20 20  t; index++)..   
38a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
38b0: 64 5c 5b 69 6e 64 65 78 5c 5d 2e 4a 6f 69 6e 28  d\[index\].Join(
38c0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
38d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  ...          //.
38e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f  .          // NO
38f0: 54 45 3a 20 52 65 74 75 72 6e 20 61 20 6c 69 73  TE: Return a lis
3900: 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 77 69  t of integers wi
3910: 74 68 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  th total number 
3920: 6f 66 20 64 61 74 61 20 62 79 74 65 73 0d 0a 20  of data bytes.. 
3930: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
3940: 20 20 73 65 65 6e 2c 20 74 6f 74 61 6c 20 6e 75    seen, total nu
3950: 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 72 65  mber of query re
3960: 73 75 6c 74 20 72 6f 77 73 20 73 65 65 6e 2c 20  sult rows seen, 
3970: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 0d 0a 20  and the total.. 
3980: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
3990: 20 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 63 65    number of exce
39a0: 70 74 69 6f 6e 73 20 63 61 75 67 68 74 20 62 79  ptions caught by
39b0: 20 61 6c 6c 20 74 68 65 20 74 65 73 74 20 74 68   all the test th
39c0: 72 65 61 64 73 2e 0d 0a 20 20 20 20 20 20 20 20  reads...        
39d0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
39e0: 49 6e 74 4c 69 73 74 20 63 6f 75 6e 74 73 20 3d  IntList counts =
39f0: 20 6e 65 77 20 49 6e 74 4c 69 73 74 28 29 3b 0d   new IntList();.
3a00: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 75  ...          cou
3a10: 6e 74 73 2e 41 64 64 28 73 75 6d 29 3b 0d 0a 20  nts.Add(sum);.. 
3a20: 20 20 20 20 20 20 20 20 20 63 6f 75 6e 74 73 2e           counts.
3a30: 41 64 64 28 72 6f 77 73 29 3b 0d 0a 20 20 20 20  Add(rows);..    
3a40: 20 20 20 20 20 20 63 6f 75 6e 74 73 2e 41 64 64        counts.Add
3a50: 28 65 72 72 6f 72 73 29 3b 0d 0a 0d 0a 20 20 20  (errors);....   
3a60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f         return co
3a70: 75 6e 74 73 3b 0d 0a 20 20 20 20 20 20 20 20 7d  unts;..        }
3a80: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
3a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ad0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70  ///....        p
3ae0: 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69  ublic static voi
3af0: 64 20 4d 61 69 6e 28 29 0d 0a 20 20 20 20 20 20  d Main()..      
3b00: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f    {..          /
3b10: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
3b20: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3b30: 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 5d 20 74  }..    }..  }] t
3b40: 72 75 65 20 74 72 75 65 20 74 72 75 65 20 72 65  rue true true re
3b50: 73 75 6c 74 73 20 65 72 72 6f 72 73 20 5b 6c 69  sults errors [li
3b60: 73 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  st System.Data.S
3b70: 51 4c 69 74 65 2e 64 6c 6c 20 45 61 67 6c 65 2e  QLite.dll Eagle.
3b80: 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 6c 69 73 74 20  dll]]....  list 
3b90: 24 63 6f 64 65 20 24 72 65 73 75 6c 74 73 20 5c  $code $results \
3ba0: 0d 0a 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b  ..      [expr {[
3bb0: 69 6e 66 6f 20 65 78 69 73 74 73 20 65 72 72 6f  info exists erro
3bc0: 72 73 5d 20 3f 20 24 65 72 72 6f 72 73 20 3a 20  rs] ? $errors : 
3bd0: 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 5b 65  ""}] \..      [e
3be0: 78 70 72 20 7b 24 63 6f 64 65 20 65 71 20 22 4f  xpr {$code eq "O
3bf0: 6b 22 20 3f 20 5b 63 61 74 63 68 20 7b 0d 0a 20  k" ? [catch {.. 
3c00: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
3c10: 76 6f 6b 65 20 5f 44 79 6e 61 6d 69 63 24 7b 69  voke _Dynamic${i
3c20: 64 7d 2e 54 65 73 74 24 7b 69 64 7d 20 52 75 6e  d}.Test${id} Run
3c30: 54 65 73 74 54 68 72 65 61 64 73 0d 0a 20 20 20  TestThreads..   
3c40: 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3a 20 5b     } result] : [
3c50: 73 65 74 20 72 65 73 75 6c 74 20 22 22 5d 7d 5d  set result ""]}]
3c60: 20 24 72 65 73 75 6c 74 20 5c 0d 0a 20 20 20 20   $result \..    
3c70: 20 20 5b 63 6f 6c 6c 65 63 74 47 61 72 62 61 67    [collectGarbag
3c80: 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d  e $test_channel]
3c90: 20 5c 0d 0a 20 20 20 20 20 20 5b 72 65 70 6f 72   \..      [repor
3ca0: 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
3cb0: 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74   $test_channel t
3cc0: 72 75 65 5d 0d 0a 7d 20 2d 63 6c 65 61 6e 75 70  rue]..} -cleanup
3cd0: 20 7b 0d 0a 20 20 63 6c 65 61 6e 75 70 44 62 20   {..  cleanupDb 
3ce0: 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a 20 20 75  $fileName....  u
3cf0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
3d00: 20 72 65 73 75 6c 74 20 72 65 73 75 6c 74 73 20   result results 
3d10: 65 72 72 6f 72 73 20 63 6f 64 65 20 73 71 6c 20  errors code sql 
3d20: 64 61 74 61 53 6f 75 72 63 65 20 69 64 20 64 62  dataSource id db
3d30: 20 66 69 6c 65 4e 61 6d 65 0d 0a 7d 20 2d 74 69   fileName..} -ti
3d40: 6d 65 20 74 72 75 65 20 2d 63 6f 6e 73 74 72 61  me true -constra
3d50: 69 6e 74 73 20 7b 65 61 67 6c 65 20 6d 6f 6e 6f  ints {eagle mono
3d60: 42 75 67 32 38 20 63 6f 6d 6d 61 6e 64 2e 73 71  Bug28 command.sq
3d70: 6c 20 63 6f 6d 70 69 6c 65 2e 44 41 54 41 20 53  l compile.DATA S
3d80: 51 4c 69 74 65 5c 0d 0a 53 79 73 74 65 6d 2e 44  QLite\..System.D
3d90: 61 74 61 2e 53 51 4c 69 74 65 7d 20 2d 6d 61 74  ata.SQLite} -mat
3da0: 63 68 20 72 65 67 65 78 70 20 2d 72 65 73 75 6c  ch regexp -resul
3db0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 5e  t [appendArgs "^
3dc0: 4f 6b 5c 0d 0a 53 79 73 74 65 6d 23 43 6f 64 65  Ok\..System#Code
3dd0: 44 6f 6d 23 43 6f 6d 70 69 6c 65 72 23 43 6f 6d  Dom#Compiler#Com
3de0: 70 69 6c 65 72 52 65 73 75 6c 74 73 23 5c 5c 64  pilerResults#\\d
3df0: 2b 20 5c 5c 7b 5c 5c 7d 20 30 20 5c 5c 7b 5c 5c  + \\{\\} 0 \\{\\
3e00: 64 2b 20 5c 5c 64 2b 20 22 20 24 63 6f 75 6e 74  d+ \\d+ " $count
3e10: 20 5c 0d 0a 22 5c 5c 7d 20 5c 5c 7b 5c 5c 7d 20   \.."\\} \\{\\} 
3e20: 22 20 24 6d 65 6d 6f 72 79 5f 75 73 65 64 20 5c  " $memory_used \
3e30: 24 5d 7d 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23  $]}....#########
3e40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3e50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3e60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3e70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3e80: 23 23 23 23 23 23 0d 0a 0d 0a 75 6e 73 65 74 20  ######....unset 
3e90: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 63 6f 75 6e  -nocomplain coun
3ea0: 74 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23  t....###########
3eb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ec0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ed0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ee0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ef0: 23 23 23 23 0d 0a 0d 0a 75 6e 73 65 74 20 2d 6e  ####....unset -n
3f00: 6f 63 6f 6d 70 6c 61 69 6e 20 6d 65 6d 6f 72 79  ocomplain memory
3f10: 5f 75 73 65 64 0d 0a 0d 0a 23 23 23 23 23 23 23  _used....#######
3f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3f30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3f40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3f50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3f60: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 72 75 6e 53  ########....runS
3f70: 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75  QLiteTestEpilogu
3f80: 65 0d 0a 72 75 6e 54 65 73 74 45 70 69 6c 6f 67  e..runTestEpilog
3f90: 75 65 0d 0a                                      ue..