System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 2420c60fecc4082d89814e9867280ca49eed0e6d:


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: 69 73 0d 0a 23 20 20 20 20 20 20 20 61 6c 77 61  is..#       alwa
03d0: 79 73 20 74 68 65 20 22 6d 61 73 74 65 72 20 74  ys the "master t
03e0: 68 72 65 61 64 22 20 61 6e 64 20 6a 75 73 74 20  hread" and just 
03f0: 72 65 70 65 61 74 65 64 6c 79 20 63 61 6c 6c 73  repeatedly calls
0400: 20 74 68 65 20 54 68 72 65 61 64 2e 41 62 6f 72   the Thread.Abor
0410: 74 28 29 0d 0a 23 20 20 20 20 20 20 20 6d 65 74  t()..#       met
0420: 68 6f 64 20 6f 6e 20 6f 74 68 65 72 20 72 61 6e  hod on other ran
0430: 64 6f 6d 20 74 65 73 74 20 74 68 72 65 61 64 73  dom test threads
0440: 20 74 68 61 74 20 61 70 70 65 61 72 20 74 6f 20   that appear to 
0450: 62 65 20 61 6c 69 76 65 20 75 6e 74 69 6c 20 61  be alive until a
0460: 6c 6c 0d 0a 23 20 20 20 20 20 20 20 74 65 73 74  ll..#       test
0470: 20 74 68 72 65 61 64 73 20 61 70 70 65 61 72 20   threads appear 
0480: 74 6f 20 68 61 76 65 20 64 69 65 64 2e 20 20 41  to have died.  A
0490: 6c 6c 20 6f 74 68 65 72 20 74 65 73 74 20 74 68  ll other test th
04a0: 72 65 61 64 73 20 77 69 6c 6c 20 61 74 74 65 6d  reads will attem
04b0: 70 74 0d 0a 23 20 20 20 20 20 20 20 74 6f 20 6f  pt..#       to o
04c0: 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  pen a connection
04d0: 2c 20 65 78 65 63 75 74 65 20 6f 6e 65 20 6f 72  , execute one or
04e0: 20 6d 6f 72 65 20 71 75 65 72 69 65 73 20 61 67   more queries ag
04f0: 61 69 6e 73 74 20 69 74 2c 20 61 6e 64 20 74 68  ainst it, and th
0500: 65 6e 0d 0a 23 20 20 20 20 20 20 20 63 6c 6f 73  en..#       clos
0510: 65 20 69 74 2e 0d 0a 23 0d 0a 69 66 20 7b 21 5b  e it...#..if {![
0520: 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 75 6e  info exists coun
0530: 74 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  t(1)]} then {.. 
0540: 20 73 65 74 20 63 6f 75 6e 74 28 31 29 20 31 30   set count(1) 10
0550: 0d 0a 7d 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45  ..}....#..# NOTE
0560: 3a 20 48 6f 77 20 6d 61 6e 79 20 6d 69 6c 6c 69  : How many milli
0570: 73 65 63 6f 6e 64 73 20 73 68 6f 75 6c 64 20 74  seconds should t
0580: 68 65 20 6d 61 73 74 65 72 20 74 68 72 65 61 64  he master thread
0590: 20 69 6e 69 74 69 61 6c 6c 79 20 77 61 69 74 20   initially wait 
05a0: 75 6e 74 69 6c 20 69 74 0d 0a 23 20 20 20 20 20  until it..#     
05b0: 20 20 73 74 61 72 74 73 20 74 6f 20 61 62 6f 72    starts to abor
05c0: 74 20 74 68 65 20 6f 74 68 65 72 20 74 65 73 74  t the other test
05d0: 20 74 68 72 65 61 64 73 3f 0d 0a 23 0d 0a 69 66   threads?..#..if
05e0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
05f0: 63 6f 75 6e 74 28 32 29 5d 7d 20 74 68 65 6e 20  count(2)]} then 
0600: 7b 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28 32  {..  set count(2
0610: 29 20 31 30 30 30 0d 0a 7d 0d 0a 0d 0a 23 0d 0a  ) 1000..}....#..
0620: 23 20 4e 4f 54 45 3a 20 48 6f 77 20 6d 61 6e 79  # NOTE: How many
0630: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 28 6d   milliseconds (m
0640: 61 78 69 6d 75 6d 29 20 73 68 6f 75 6c 64 20 74  aximum) should t
0650: 68 65 20 6d 61 73 74 65 72 20 74 68 72 65 61 64  he master thread
0660: 20 77 61 69 74 20 62 65 74 77 65 65 6e 0d 0a 23   wait between..#
0670: 20 20 20 20 20 20 20 61 62 6f 72 74 69 6e 67 20         aborting 
0680: 6f 74 68 65 72 20 72 61 6e 64 6f 6d 20 74 65 73  other random tes
0690: 74 20 74 68 72 65 61 64 73 3f 0d 0a 23 0d 0a 69  t threads?..#..i
06a0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
06b0: 20 63 6f 75 6e 74 28 33 29 5d 7d 20 74 68 65 6e   count(3)]} then
06c0: 20 7b 0d 0a 20 20 73 65 74 20 63 6f 75 6e 74 28   {..  set count(
06d0: 33 29 20 31 30 30 30 0d 0a 7d 0d 0a 0d 0a 23 0d  3) 1000..}....#.
06e0: 0a 23 20 4e 4f 54 45 3a 20 48 6f 77 20 6d 61 6e  .# NOTE: How man
06f0: 79 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 62  y bytes should b
0700: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 66  e used for the f
0710: 69 76 65 20 72 61 6e 64 6f 6d 20 64 61 74 61 20  ive random data 
0720: 62 6c 6f 62 73 20 63 6f 6e 74 61 69 6e 65 64 0d  blobs contained.
0730: 0a 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  .#       in the 
0740: 74 65 73 74 20 64 61 74 61 62 61 73 65 3f 0d 0a  test database?..
0750: 23 0d 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  #..if {![info ex
0760: 69 73 74 73 20 63 6f 75 6e 74 28 34 29 5d 7d 20  ists count(4)]} 
0770: 74 68 65 6e 20 7b 0d 0a 20 20 73 65 74 20 63 6f  then {..  set co
0780: 75 6e 74 28 34 29 20 31 30 30 30 0d 0a 7d 0d 0a  unt(4) 1000..}..
0790: 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
07a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
07b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
07c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
07d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
07e0: 23 0d 0a 0d 0a 72 75 6e 54 65 73 74 20 7b 74 65  #....runTest {te
07f0: 73 74 20 74 68 72 65 61 64 2d 31 2e 31 20 7b 54  st thread-1.1 {T
0800: 68 72 65 61 64 2e 41 62 6f 72 74 28 29 20 69 6d  hread.Abort() im
0810: 70 61 63 74 20 6f 6e 20 6e 61 74 69 76 65 20 72  pact on native r
0820: 65 73 6f 75 72 63 65 73 7d 20 2d 73 65 74 75 70  esources} -setup
0830: 20 7b 0d 0a 20 20 73 65 74 75 70 44 62 20 5b 73   {..  setupDb [s
0840: 65 74 20 66 69 6c 65 4e 61 6d 65 20 74 68 72 65  et fileName thre
0850: 61 64 2d 31 2e 31 2e 64 62 5d 0d 0a 0d 0a 20 20  ad-1.1.db]....  
0860: 74 70 75 74 73 20 24 74 65 73 74 5f 63 68 61 6e  tputs $test_chan
0870: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
0880: 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d 20 75  \..      "---- u
0890: 73 69 6e 67 20 22 20 24 63 6f 75 6e 74 28 31 29  sing " $count(1)
08a0: 20 22 20 74 65 73 74 20 74 68 72 65 61 64 73 20   " test threads 
08b0: 28 77 69 74 68 20 6f 6e 65 20 6d 61 73 74 65 72  (with one master
08c0: 20 74 68 72 65 61 64 29 5c 6e 22 5d 0d 0a 0d 0a   thread)\n"]....
08d0: 20 20 74 70 75 74 73 20 24 74 65 73 74 5f 63 68    tputs $test_ch
08e0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
08f0: 73 20 5c 0d 0a 20 20 20 20 20 20 22 2d 2d 2d 2d  s \..      "----
0900: 20 69 6e 69 74 69 61 6c 20 77 61 69 74 20 77 69   initial wait wi
0910: 6c 6c 20 62 65 20 22 20 24 63 6f 75 6e 74 28 32  ll be " $count(2
0920: 29 20 22 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  ) " milliseconds
0930: 5c 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75 74 73 20  \n"]....  tputs 
0940: 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  $test_channel [a
0950: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
0960: 20 20 20 22 2d 2d 2d 2d 20 73 75 62 73 65 71 75     "---- subsequ
0970: 65 6e 74 20 6d 61 78 69 6d 75 6d 20 77 61 69 74  ent maximum wait
0980: 20 77 69 6c 6c 20 62 65 20 22 20 24 63 6f 75 6e   will be " $coun
0990: 74 28 33 29 20 22 20 6d 69 6c 6c 69 73 65 63 6f  t(3) " milliseco
09a0: 6e 64 73 5c 6e 22 5d 0d 0a 0d 0a 20 20 74 70 75  nds\n"]....  tpu
09b0: 74 73 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  ts $test_channel
09c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
09d0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 61 6e 64        "---- rand
09e0: 6f 6d 20 64 61 74 61 20 62 6c 6f 62 20 73 69 7a  om data blob siz
09f0: 65 20 77 69 6c 6c 20 62 65 20 22 20 24 63 6f 75  e will be " $cou
0a00: 6e 74 28 34 29 20 22 20 62 79 74 65 73 5c 6e 22  nt(4) " bytes\n"
0a10: 5d 0d 0a 7d 20 2d 62 6f 64 79 20 7b 0d 0a 20 20  ]..} -body {..  
0a20: 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20  sql execute $db 
0a30: 5b 73 75 62 73 74 20 7b 0d 0a 20 20 20 20 43 52  [subst {..    CR
0a40: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20  EATE TABLE t1(x 
0a50: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0a60: 4b 45 59 2c 20 79 20 42 4c 4f 42 29 3b 0d 0a 20  KEY, y BLOB);.. 
0a70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0a80: 31 20 28 79 29 20 56 41 4c 55 45 53 28 52 41 4e  1 (y) VALUES(RAN
0a90: 44 4f 4d 42 4c 4f 42 28 24 7b 63 6f 75 6e 74 28  DOMBLOB(${count(
0aa0: 34 29 7d 29 29 3b 0d 0a 20 20 20 20 49 4e 53 45  4)}));..    INSE
0ab0: 52 54 20 49 4e 54 4f 20 74 31 20 28 79 29 20 56  RT INTO t1 (y) V
0ac0: 41 4c 55 45 53 28 52 41 4e 44 4f 4d 42 4c 4f 42  ALUES(RANDOMBLOB
0ad0: 28 24 7b 63 6f 75 6e 74 28 34 29 7d 29 29 3b 0d  (${count(4)}));.
0ae0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0af0: 20 74 31 20 28 79 29 20 56 41 4c 55 45 53 28 52   t1 (y) VALUES(R
0b00: 41 4e 44 4f 4d 42 4c 4f 42 28 24 7b 63 6f 75 6e  ANDOMBLOB(${coun
0b10: 74 28 34 29 7d 29 29 3b 0d 0a 20 20 20 20 49 4e  t(4)}));..    IN
0b20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 28 79 29  SERT INTO t1 (y)
0b30: 20 56 41 4c 55 45 53 28 52 41 4e 44 4f 4d 42 4c   VALUES(RANDOMBL
0b40: 4f 42 28 24 7b 63 6f 75 6e 74 28 34 29 7d 29 29  OB(${count(4)}))
0b50: 3b 0d 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
0b60: 54 4f 20 74 31 20 28 79 29 20 56 41 4c 55 45 53  TO t1 (y) VALUES
0b70: 28 52 41 4e 44 4f 4d 42 4c 4f 42 28 24 7b 63 6f  (RANDOMBLOB(${co
0b80: 75 6e 74 28 34 29 7d 29 29 3b 0d 0a 20 20 7d 5d  unt(4)}));..  }]
0b90: 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
0ba0: 45 3a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  E: The temporary
0bb0: 20 64 69 72 65 63 74 6f 72 79 20 6d 75 73 74 20   directory must 
0bc0: 62 65 20 72 65 73 65 74 20 68 65 72 65 20 62 65  be reset here be
0bd0: 63 61 75 73 65 20 69 74 20 61 6c 6c 6f 63 61 74  cause it allocat
0be0: 65 73 0d 0a 20 20 23 20 20 20 20 20 20 20 73 6f  es..  #       so
0bf0: 6d 65 20 53 51 4c 69 74 65 20 6d 65 6d 6f 72 79  me SQLite memory
0c00: 20 61 6e 64 20 74 68 69 73 20 74 65 73 74 20 72   and this test r
0c10: 65 71 75 69 72 65 73 20 61 6e 20 65 78 74 72 65  equires an extre
0c20: 6d 65 6c 79 20 61 63 63 75 72 61 74 65 0d 0a 20  mely accurate.. 
0c30: 20 23 20 20 20 20 20 20 20 72 65 61 64 69 6e 67   #       reading
0c40: 2e 0d 0a 20 20 23 0d 0a 20 20 73 71 6c 20 65 78  ...  #..  sql ex
0c50: 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20  ecute $db {..   
0c60: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
0c70: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 22  re_directory = "
0c80: 22 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ";..  }....  #..
0c90: 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20    # NOTE: Close 
0ca0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77  the database now
0cb0: 2c 20 66 72 65 65 69 6e 67 20 61 6e 79 20 6e 61  , freeing any na
0cc0: 74 69 76 65 20 53 51 4c 69 74 65 20 6d 65 6d 6f  tive SQLite memo
0cd0: 72 79 20 61 6e 64 2f 6f 72 0d 0a 20 20 23 20 20  ry and/or..  #  
0ce0: 20 20 20 20 20 72 65 73 6f 75 72 63 65 73 20 74       resources t
0cf0: 68 61 74 20 69 74 20 6d 61 79 20 62 65 20 75 73  hat it may be us
0d00: 69 6e 67 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ing at this poin
0d10: 74 3b 20 68 6f 77 65 76 65 72 2c 20 64 6f 20 6e  t; however, do n
0d20: 6f 74 0d 0a 20 20 23 20 20 20 20 20 20 20 61 63  ot..  #       ac
0d30: 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  tually delete th
0d40: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0d50: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 65  because it is ne
0d60: 65 64 65 64 20 69 6e 20 74 68 65 20 43 23 0d 0a  eded in the C#..
0d70: 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
0d80: 6f 72 20 74 68 69 73 20 74 65 73 74 2e 0d 0a 20  or this test... 
0d90: 20 23 0d 0a 20 20 63 6c 65 61 6e 75 70 44 62 20   #..  cleanupDb 
0da0: 24 66 69 6c 65 4e 61 6d 65 20 64 62 20 74 72 75  $fileName db tru
0db0: 65 20 66 61 6c 73 65 20 66 61 6c 73 65 3b 20 75  e false false; u
0dc0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
0dd0: 20 64 62 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20   db....  #..  # 
0de0: 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20  NOTE: Setup the 
0df0: 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 69  variables used i
0e00: 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 61 6c 6c  n the dynamicall
0e10: 79 20 73 75 62 73 74 69 74 75 74 65 64 20 43 23  y substituted C#
0e20: 20 63 6f 64 65 0d 0a 20 20 23 20 20 20 20 20 20   code..  #      
0e30: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 62 6f   for the main bo
0e40: 64 79 20 6f 66 20 74 68 69 73 20 74 65 73 74 20  dy of this test 
0e50: 28 62 65 6c 6f 77 29 2e 0d 0a 20 20 23 0d 0a 20  (below)...  #.. 
0e60: 20 73 65 74 20 69 64 20 5b 6f 62 6a 65 63 74 20   set id [object 
0e70: 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
0e80: 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78  er.GetActive Nex
0e90: 74 49 64 5d 0d 0a 20 20 73 65 74 20 64 61 74 61  tId]..  set data
0ea0: 53 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f 69  Source [file joi
0eb0: 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69  n [getDatabaseDi
0ec0: 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61  rectory] $fileNa
0ed0: 6d 65 5d 0d 0a 0d 0a 20 20 73 65 74 20 73 71 6c  me]....  set sql
0ee0: 20 7b 20 5c 0d 0a 20 20 20 20 53 45 4c 45 43 54   { \..    SELECT
0ef0: 20 78 2c 20 79 20 46 52 4f 4d 20 74 31 20 4f 52   x, y FROM t1 OR
0f00: 44 45 52 20 42 59 20 78 3b 20 5c 0d 0a 20 20 7d  DER BY x; \..  }
0f10: 0d 0a 0d 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63  ....  unset -noc
0f20: 6f 6d 70 6c 61 69 6e 20 72 65 73 75 6c 74 73 20  omplain results 
0f30: 65 72 72 6f 72 73 0d 0a 0d 0a 20 20 73 65 74 20  errors....  set 
0f40: 63 6f 64 65 20 5b 63 6f 6d 70 69 6c 65 43 53 68  code [compileCSh
0f50: 61 72 70 57 69 74 68 20 5b 73 75 62 73 74 20 7b  arpWith [subst {
0f60: 0d 0a 20 20 20 20 75 73 69 6e 67 20 53 79 73 74  ..    using Syst
0f70: 65 6d 3b 0d 0a 20 20 20 20 75 73 69 6e 67 20 53  em;..    using S
0f80: 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e  ystem.Collection
0f90: 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 20 20 20 20  s.Generic;..    
0fa0: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74  using System.Dat
0fb0: 61 2e 53 51 4c 69 74 65 3b 0d 0a 20 20 20 20 75  a.SQLite;..    u
0fc0: 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61 67  sing System.Diag
0fd0: 6e 6f 73 74 69 63 73 3b 0d 0a 20 20 20 20 75 73  nostics;..    us
0fe0: 69 6e 67 20 53 79 73 74 65 6d 2e 54 68 72 65 61  ing System.Threa
0ff0: 64 69 6e 67 3b 0d 0a 20 20 20 20 75 73 69 6e 67  ding;..    using
1000: 20 45 61 67 6c 65 2e 5f 43 6f 6e 74 61 69 6e 65   Eagle._Containe
1010: 72 73 2e 50 75 62 6c 69 63 3b 0d 0a 0d 0a 20 20  rs.Public;....  
1020: 20 20 6e 61 6d 65 73 70 61 63 65 20 5f 44 79 6e    namespace _Dyn
1030: 61 6d 69 63 24 7b 69 64 7d 0d 0a 20 20 20 20 7b  amic${id}..    {
1040: 0d 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20 73  ..      public s
1050: 74 61 74 69 63 20 63 6c 61 73 73 20 54 65 73 74  tatic class Test
1060: 24 7b 69 64 7d 0d 0a 20 20 20 20 20 20 7b 0d 0a  ${id}..      {..
1070: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
1080: 74 61 74 69 63 20 4c 6f 6e 67 4c 69 73 74 20 52  tatic LongList R
1090: 75 6e 54 65 73 74 54 68 72 65 61 64 73 28 29 0d  unTestThreads().
10a0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
10b0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
10c0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69      // NOTE: Thi
10d0: 73 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  s is the total n
10e0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 20 62 79  umber of data by
10f0: 74 65 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20  tes seen in the 
1100: 73 65 63 6f 6e 64 0d 0a 20 20 20 20 20 20 20 20  second..        
1110: 20 20 2f 2f 20 20 20 20 20 20 20 63 6f 6c 75 6d    //       colum
1120: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 72  n of the query r
1130: 65 73 75 6c 74 20 72 6f 77 73 20 73 65 65 6e 20  esult rows seen 
1140: 62 79 20 61 6c 6c 20 74 65 73 74 20 74 68 72 65  by all test thre
1150: 61 64 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ads...          
1160: 2f 2f 20 20 20 20 20 20 20 54 68 69 73 20 76 61  //       This va
1170: 6c 75 65 20 77 69 6c 6c 20 76 61 72 79 20 67 72  lue will vary gr
1180: 65 61 74 6c 79 20 62 61 73 65 64 20 75 70 6f 6e  eatly based upon
1190: 20 68 6f 77 20 6d 61 6e 79 20 6c 6f 6f 70 0d 0a   how many loop..
11a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
11b0: 20 20 20 69 74 65 72 61 74 69 6f 6e 73 20 61 72     iterations ar
11c0: 65 20 70 65 72 66 6f 72 6d 65 64 20 70 72 69 6f  e performed prio
11d0: 72 20 74 6f 20 65 61 63 68 20 74 65 73 74 20 74  r to each test t
11e0: 68 72 65 61 64 20 62 65 69 6e 67 0d 0a 20 20 20  hread being..   
11f0: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
1200: 61 62 6f 72 74 65 64 2e 0d 0a 20 20 20 20 20 20  aborted...      
1210: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1220: 20 20 6c 6f 6e 67 20 73 75 6d 20 3d 20 30 3b 0d    long sum = 0;.
1230: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  ...          //.
1240: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f  .          // NO
1250: 54 45 3a 20 54 68 69 73 20 69 73 20 74 68 65 20  TE: This is the 
1260: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1270: 71 75 65 72 79 20 72 65 73 75 6c 74 20 72 6f 77  query result row
1280: 73 20 73 65 65 6e 20 62 79 20 61 6c 6c 0d 0a 20  s seen by all.. 
1290: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
12a0: 20 20 74 68 65 20 74 65 73 74 20 74 68 72 65 61    the test threa
12b0: 64 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2f  ds...          /
12c0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  /..          lon
12d0: 67 20 72 6f 77 73 20 3d 20 30 3b 0d 0a 0d 0a 20  g rows = 0;.... 
12e0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
12f0: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
1300: 54 68 69 73 20 69 73 20 74 68 65 20 74 6f 74 61  This is the tota
1310: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 63 65  l number of exce
1320: 70 74 69 6f 6e 73 20 63 61 75 67 68 74 20 62 79  ptions caught by
1330: 20 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20   all the..      
1340: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 65 73      //       tes
1350: 74 20 74 68 72 65 61 64 73 2e 0d 0a 20 20 20 20  t threads...    
1360: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
1370: 20 20 20 20 6c 6f 6e 67 20 65 72 72 6f 72 73 20      long errors 
1380: 3d 20 30 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  = 0;....        
1390: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
13a0: 2f 2f 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73  // NOTE: This is
13b0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
13c0: 72 20 6f 66 20 74 65 73 74 20 74 68 72 65 61 64  r of test thread
13d0: 73 20 74 6f 20 63 72 65 61 74 65 2e 0d 0a 20 20  s to create...  
13e0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
13f0: 20 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20        int count 
1400: 3d 20 24 7b 63 6f 75 6e 74 28 31 29 7d 3b 0d 0a  = ${count(1)};..
1410: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a  ..          //..
1420: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
1430: 45 3a 20 43 72 65 61 74 65 20 74 68 65 20 61 72  E: Create the ar
1440: 72 61 79 20 6f 66 20 74 68 72 65 61 64 20 6f 62  ray of thread ob
1450: 6a 65 63 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  jects...        
1460: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1470: 54 68 72 65 61 64 5c 5b 5c 5d 20 74 68 72 65 61  Thread\[\] threa
1480: 64 20 3d 20 6e 65 77 20 54 68 72 65 61 64 5c 5b  d = new Thread\[
1490: 63 6f 75 6e 74 5c 5d 3b 0d 0a 0d 0a 20 20 20 20  count\];....    
14a0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
14b0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65      // NOTE: Cre
14c0: 61 74 65 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d  ate a random num
14d0: 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 73 75  ber generator su
14e0: 69 74 61 62 6c 65 20 66 6f 72 20 77 61 69 74 69  itable for waiti
14f0: 6e 67 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20  ng a..          
1500: 2f 2f 20 20 20 20 20 20 20 72 61 6e 64 6f 6d 20  //       random 
1510: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
1520: 65 63 6f 6e 64 73 20 62 65 74 77 65 65 6e 20 65  econds between e
1530: 61 63 68 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  ach loop iterati
1540: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  on..          //
1550: 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 6e 20         and then 
1560: 73 65 6c 65 63 74 69 6e 67 20 61 20 72 61 6e 64  selecting a rand
1570: 6f 6d 20 74 68 72 65 61 64 20 69 6e 64 65 78 2e  om thread index.
1580: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a  ..          //..
1590: 20 20 20 20 20 20 20 20 20 20 52 61 6e 64 6f 6d            Random
15a0: 20 72 61 6e 64 6f 6d 20 3d 20 6e 65 77 20 52 61   random = new Ra
15b0: 6e 64 6f 6d 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  ndom();....     
15c0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
15d0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65 61     // NOTE: Crea
15e0: 74 65 20 74 68 65 20 65 76 65 6e 74 20 74 68 61  te the event tha
15f0: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1600: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 6c  o synchronize al
1610: 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  l the..         
1620: 20 2f 2f 20 20 20 20 20 20 20 63 72 65 61 74 65   //       create
1630: 64 20 74 68 72 65 61 64 73 20 73 6f 20 74 68 61  d threads so tha
1640: 74 20 74 68 65 79 20 73 74 61 72 74 20 64 6f 69  t they start doi
1650: 6e 67 20 74 68 65 69 72 20 61 63 74 75 61 6c 20  ng their actual 
1660: 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  test..          
1670: 2f 2f 20 20 20 20 20 20 20 22 77 6f 72 6b 22 20  //       "work" 
1680: 61 74 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79  at approximately
1690: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
16a0: 20 54 68 69 73 20 69 73 20 61 6c 73 6f 20 75 73   This is also us
16b0: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  ed..          //
16c0: 20 20 20 20 20 20 20 74 6f 20 6d 61 6b 65 20 73         to make s
16d0: 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 65 73  ure that all tes
16e0: 74 20 74 68 72 65 61 64 73 20 61 72 65 20 69 6e  t threads are in
16f0: 73 69 64 65 20 6f 66 20 61 20 74 72 79 0d 0a 20  side of a try.. 
1700: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1710: 20 20 62 6c 6f 63 6b 20 62 65 66 6f 72 65 20 61    block before a
1720: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 62 6f  ttempting to abo
1730: 72 74 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20  rt them...      
1740: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1750: 20 20 75 73 69 6e 67 20 28 4d 61 6e 75 61 6c 52    using (ManualR
1760: 65 73 65 74 45 76 65 6e 74 20 67 6f 45 76 65 6e  esetEvent goEven
1770: 74 20 3d 20 6e 65 77 20 4d 61 6e 75 61 6c 52 65  t = new ManualRe
1780: 73 65 74 45 76 65 6e 74 28 66 61 6c 73 65 29 29  setEvent(false))
1790: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
17a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
17b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
17c0: 54 45 3a 20 43 72 65 61 74 65 20 61 20 28 72 65  TE: Create a (re
17d0: 75 73 61 62 6c 65 29 20 64 65 6c 65 67 61 74 65  usable) delegate
17e0: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 61   that will conta
17f0: 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20  in the code..   
1800: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1810: 20 20 74 68 61 74 20 6d 6f 73 74 20 6f 66 20 74    that most of t
1820: 68 65 20 63 72 65 61 74 65 64 20 74 65 73 74 20  he created test 
1830: 74 68 72 65 61 64 73 20 61 72 65 20 74 6f 20 65  threads are to e
1840: 78 65 63 75 74 65 2e 0d 0a 20 20 20 20 20 20 20  xecute...       
1850: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 54 68       //       Th
1860: 69 73 20 63 6f 64 65 20 77 69 6c 6c 20 6f 70 65  is code will ope
1870: 6e 2c 20 75 73 65 2c 20 61 6e 64 20 63 6c 6f 73  n, use, and clos
1880: 65 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  e a single datab
1890: 61 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ase..           
18a0: 20 2f 2f 20 20 20 20 20 20 20 63 6f 6e 6e 65 63   //       connec
18b0: 74 69 6f 6e 2e 20 20 4d 75 6c 74 69 70 6c 65 20  tion.  Multiple 
18c0: 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 64 61 74  commands and dat
18d0: 61 20 72 65 61 64 65 72 73 20 77 69 6c 6c 20 61  a readers will a
18e0: 6c 73 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lso..           
18f0: 20 2f 2f 20 20 20 20 20 20 20 62 65 20 75 73 65   //       be use
1900: 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
1910: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
1920: 54 68 72 65 61 64 53 74 61 72 74 20 74 68 72 65  ThreadStart thre
1930: 61 64 53 74 61 72 74 31 20 3d 20 64 65 6c 65 67  adStart1 = deleg
1940: 61 74 65 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ate()..         
1950: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1960: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
1970: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1980: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
19a0: 20 4e 4f 54 45 3a 20 57 61 69 74 20 66 6f 72 65   NOTE: Wait fore
19b0: 76 65 72 20 66 6f 72 20 74 68 65 20 22 47 4f 22  ver for the "GO"
19c0: 20 73 69 67 6e 61 6c 20 73 6f 20 74 68 61 74 20   signal so that 
19d0: 61 6c 6c 20 74 68 72 65 61 64 73 0d 0a 20 20 20  all threads..   
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
19f0: 20 20 20 20 20 20 63 61 6e 20 73 74 61 72 74 20        can start 
1a00: 77 6f 72 6b 69 6e 67 20 61 74 20 61 70 70 72 6f  working at appro
1a10: 78 69 6d 61 74 65 6c 79 20 74 68 65 20 73 61 6d  ximately the sam
1a20: 65 20 74 69 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e time...       
1a30: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1a40: 20 20 54 68 69 73 20 69 73 20 61 6c 73 6f 20 75    This is also u
1a50: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
1a60: 20 74 68 61 74 20 61 6c 6c 20 74 65 73 74 20 74   that all test t
1a70: 68 72 65 61 64 73 0d 0a 20 20 20 20 20 20 20 20  hreads..        
1a80: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
1a90: 20 61 72 65 20 69 6e 73 69 64 65 20 6f 66 20 61   are inside of a
1aa0: 20 74 72 79 20 62 6c 6f 63 6b 20 62 65 66 6f 72   try block befor
1ab0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1ac0: 61 62 6f 72 74 0d 0a 20 20 20 20 20 20 20 20 20  abort..         
1ad0: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
1ae0: 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20 20 20 20  them...         
1af0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
1b00: 20 20 20 20 20 20 20 20 20 20 20 67 6f 45 76 65             goEve
1b10: 6e 74 2e 57 61 69 74 4f 6e 65 28 29 3b 0d 0a 0d  nt.WaitOne();...
1b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b30: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
1b40: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 72       // NOTE: Cr
1b50: 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6e 6e 65  eate a new conne
1b60: 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 20 20 57  ction object.  W
1b70: 65 20 70 75 72 70 6f 73 65 6c 79 20 61 76 6f 69  e purposely avoi
1b80: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
1b90: 20 20 20 2f 2f 20 20 20 20 20 20 20 70 75 74 74     //       putt
1ba0: 69 6e 67 20 74 68 69 73 20 69 6e 73 69 64 65 20  ing this inside 
1bb0: 61 20 22 75 73 69 6e 67 22 20 62 6c 6f 63 6b 20  a "using" block 
1bc0: 74 6f 20 68 65 6c 70 20 74 65 73 74 20 6f 75 72  to help test our
1bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1be0: 20 20 2f 2f 20 20 20 20 20 20 20 63 6c 65 61 6e    //       clean
1bf0: 75 70 20 76 69 61 20 74 68 65 20 67 61 72 62 61  up via the garba
1c00: 67 65 20 63 6f 6c 6c 65 63 74 6f 72 2e 0d 0a 20  ge collector... 
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c20: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
1c30: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
1c40: 69 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d  ion connection =
1c50: 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65   new SQLiteConne
1c60: 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20  ction(..        
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 22 44 61 74              "Dat
1c80: 61 20 53 6f 75 72 63 65 3d 24 7b 64 61 74 61 53  a Source=${dataS
1c90: 6f 75 72 63 65 7d 3b 22 29 3b 0d 0a 0d 0a 20 20  ource};");....  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cc0: 20 20 2f 2f 20 4e 4f 54 45 3a 20 4f 70 65 6e 20    // NOTE: Open 
1cd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  the connection. 
1ce0: 20 41 66 74 65 72 20 74 68 69 73 20 70 6f 69 6e   After this poin
1cf0: 74 2c 20 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79  t, native memory
1d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d10: 20 20 2f 2f 20 20 20 20 20 20 20 61 6e 64 20 72    //       and r
1d20: 65 73 6f 75 72 63 65 73 20 68 61 76 65 20 62 65  esources have be
1d30: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  en allocated by 
1d40: 74 68 69 73 20 74 68 72 65 61 64 2e 0d 0a 20 20  this thread...  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d70: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 4f 70 65    connection.Ope
1d80: 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n();....        
1d90: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
1db0: 4f 54 45 3a 20 4c 6f 6f 70 20 66 6f 72 65 76 65  OTE: Loop foreve
1dc0: 72 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  r until the firs
1dd0: 74 20 74 68 72 65 61 64 20 73 69 67 6e 61 6c 73  t thread signals
1de0: 20 75 73 20 74 6f 20 73 74 6f 70 0d 0a 20 20 20   us to stop..   
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
1e00: 20 20 20 20 20 20 76 69 61 20 63 61 6c 6c 69 6e        via callin
1e10: 67 20 54 68 72 65 61 64 2e 41 62 6f 72 74 28 29  g Thread.Abort()
1e20: 20 6d 65 74 68 6f 64 20 6f 6e 20 6f 75 72 20 61   method on our a
1e30: 73 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20  ssociated..     
1e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
1e50: 20 20 20 20 74 68 72 65 61 64 20 6f 62 6a 65 63      thread objec
1e60: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
1e70: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1e80: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 74          while (t
1e90: 72 75 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  rue)..          
1ea0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 2f 2f 20 4e 4f 54 45 3a 20 43 72 65 61 74 65   // NOTE: Create
1ee0: 20 61 20 64 69 63 74 69 6f 6e 61 72 79 20 74 6f   a dictionary to
1ef0: 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   temporarily hol
1f00: 64 20 74 68 65 20 76 61 6c 75 65 73 0d 0a 20 20  d the values..  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 2f 2f 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68  //       from th
1f30: 65 20 64 61 74 61 20 72 65 61 64 65 72 20 66 6f  e data reader fo
1f40: 72 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72  r this loop iter
1f50: 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ation...        
1f60: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 44 69 63 74 69 6f 6e 61 72 79 3c 6c 6f 6e 67 2c  Dictionary<long,
1f90: 20 62 79 74 65 5c 5b 5c 5d 3e 20 72 65 73 75 6c   byte\[\]> resul
1fa0: 74 73 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20  ts =..          
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20              new 
1fc0: 44 69 63 74 69 6f 6e 61 72 79 3c 6c 6f 6e 67 2c  Dictionary<long,
1fd0: 20 62 79 74 65 5c 5b 5c 5d 3e 28 29 3b 0d 0a 0d   byte\[\]>();...
1fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ff0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2000: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
2010: 3a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  : Create a new c
2020: 6f 6d 6d 61 6e 64 20 6f 62 6a 65 63 74 20 75 73  ommand object us
2030: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
2040: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
2050: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f        //       o
2060: 62 6a 65 63 74 20 66 6f 72 20 74 68 69 73 20 74  bject for this t
2070: 68 72 65 61 64 2e 20 20 41 67 61 69 6e 2c 20 61  hread.  Again, a
2080: 76 6f 69 64 20 70 75 74 74 69 6e 67 20 74 68 69  void putting thi
2090: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
20a0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 69 6e       //       in
20b0: 73 69 64 65 20 61 20 22 75 73 69 6e 67 22 20 62  side a "using" b
20c0: 6c 6f 63 6b 20 74 6f 20 68 65 6c 70 20 74 65 73  lock to help tes
20d0: 74 20 6f 75 72 20 63 6c 65 61 6e 75 70 20 76 69  t our cleanup vi
20e0: 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a..             
20f0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68       //       th
2100: 65 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  e garbage collec
2110: 74 6f 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  tor...          
2120: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2140: 4c 69 74 65 43 6f 6d 6d 61 6e 64 20 63 6f 6d 6d  LiteCommand comm
2150: 61 6e 64 20 3d 20 6e 65 77 20 53 51 4c 69 74 65  and = new SQLite
2160: 43 6f 6d 6d 61 6e 64 28 22 24 7b 73 71 6c 7d 22  Command("${sql}"
2170: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2180: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
2190: 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ion);....       
21a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 2f 2f 20 4e 4f 54 45 3a 20 45 78 65 63 75 74   // NOTE: Execut
21d0: 65 20 74 68 65 20 71 75 65 72 79 20 61 6e 64 20  e the query and 
21e0: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 69 6e  get the resultin
21f0: 67 20 64 61 74 61 20 72 65 61 64 65 72 0d 0a 20  g data reader.. 
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 2f 2f 20 20 20 20 20 20 20 6f 62 6a 65 63 74   //       object
2220: 2e 20 20 41 67 61 69 6e 2c 20 61 76 6f 69 64 20  .  Again, avoid 
2230: 70 75 74 74 69 6e 67 20 74 68 69 73 20 69 6e 73  putting this ins
2240: 69 64 65 20 61 20 22 75 73 69 6e 67 22 0d 0a 20  ide a "using".. 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 2f 2f 20 20 20 20 20 20 20 62 6c 6f 63 6b 20   //       block 
2270: 74 6f 20 68 65 6c 70 20 74 65 73 74 20 6f 75 72  to help test our
2280: 20 63 6c 65 61 6e 75 70 20 76 69 61 20 74 68 65   cleanup via the
2290: 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20   garbage..      
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
22b0: 20 20 20 20 20 63 6f 6c 6c 65 63 74 6f 72 2e 0d       collector..
22c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
22e0: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 44           SQLiteD
22f0: 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72  ataReader reader
2300: 20 3d 20 63 6f 6d 6d 61 6e 64 2e 45 78 65 63 75   = command.Execu
2310: 74 65 52 65 61 64 65 72 28 29 3b 0d 0a 0d 0a 20  teReader();.... 
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
2340: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
2350: 53 74 61 72 74 20 70 72 6f 63 65 73 73 69 6e 67  Start processing
2360: 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 20   each available 
2370: 71 75 65 72 79 20 72 65 73 75 6c 74 20 72 6f 77  query result row
2380: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2390: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 54 68       //       Th
23a0: 69 73 20 70 72 6f 63 65 73 73 69 6e 67 20 28 6f  is processing (o
23b0: 72 20 61 6e 79 20 6f 66 20 74 68 65 20 61 62 6f  r any of the abo
23c0: 76 65 20 70 72 6f 63 65 73 73 69 6e 67 29 0d 0a  ve processing)..
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 2f 2f 20 20 20 20 20 20 20 6d 61 79 20 62    //       may b
23f0: 65 20 73 74 6f 70 70 65 64 20 61 74 20 61 6e 79  e stopped at any
2400: 20 74 69 6d 65 20 64 75 65 20 74 6f 20 74 68 69   time due to thi
2410: 73 20 74 65 73 74 20 74 68 72 65 61 64 0d 0a 20  s test thread.. 
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 2f 2f 20 20 20 20 20 20 20 62 65 69 6e 67 20   //       being 
2440: 61 62 6f 72 74 65 64 2e 0d 0a 20 20 20 20 20 20  aborted...      
2450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 77 68 69 6c 65 20 28 72 65 61 64 65 72 2e    while (reader.
2480: 52 65 61 64 28 29 29 0d 0a 20 20 20 20 20 20 20  Read())..       
2490: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 72 65 73 75 6c 74 73 2e 41 64 64 28 28 6c    results.Add((l
24c0: 6f 6e 67 29 72 65 61 64 65 72 5c 5b 22 78 22 5c  ong)reader\["x"\
24d0: 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ],..            
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
24f0: 65 72 5c 5b 22 79 22 5c 5d 20 61 73 20 62 79 74  er\["y"\] as byt
2500: 65 5c 5b 5c 5d 29 3b 0d 0a 0d 0a 20 20 20 20 20  e\[\]);....     
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
2520: 6e 74 65 72 6c 6f 63 6b 65 64 2e 41 64 64 28 72  nterlocked.Add(r
2530: 65 66 20 73 75 6d 2c 0d 0a 20 20 20 20 20 20 20  ef sum,..       
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 72 65 73 75 6c 74 73 5c 5b 28 6c 6f 6e 67 29   results\[(long)
2560: 72 65 61 64 65 72 5c 5b 22 78 22 5c 5d 5c 5d 2e  reader\["x"\]\].
2570: 4c 65 6e 67 74 68 29 3b 0d 0a 0d 0a 20 20 20 20  Length);....    
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 49 6e 74 65 72 6c 6f 63 6b 65 64 2e 49 6e 63 72  Interlocked.Incr
25a0: 65 6d 65 6e 74 28 72 65 66 20 72 6f 77 73 29 3b  ement(ref rows);
25b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
25d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 2f 2f 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20   // NOTE: Close 
2600: 74 68 65 20 64 61 74 61 20 72 65 61 64 65 72 20  the data reader 
2610: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 69 74  for this loop it
2620: 65 72 61 74 69 6f 6e 20 61 73 20 77 65 0d 0a 20  eration as we.. 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 2f 2f 20 20 20 20 20 20 20 61 72 65 20 64 6f   //       are do
2650: 6e 65 20 77 69 74 68 20 69 74 2e 0d 0a 20 20 20  ne with it...   
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2670: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
2680: 20 20 20 20 20 72 65 61 64 65 72 2e 43 6c 6f 73       reader.Clos
2690: 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e();..          
26a0: 20 20 20 20 20 20 20 20 72 65 61 64 65 72 20 3d          reader =
26b0: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 2f 2f 20 4e 4f 54 45 3a 20 44 69 73 70 6f    // NOTE: Dispo
26f0: 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 66  se the command f
2700: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 69 74 65  or this loop ite
2710: 72 61 74 69 6f 6e 20 61 73 20 77 65 0d 0a 20 20  ration as we..  
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 2f 2f 20 20 20 20 20 20 20 61 72 65 20 64 6f 6e  //       are don
2740: 65 20 77 69 74 68 20 69 74 2e 0d 0a 20 20 20 20  e with it...    
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2770: 20 20 20 20 63 6f 6d 6d 61 6e 64 2e 44 69 73 70      command.Disp
2780: 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ose();..        
2790: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e            comman
27a0: 64 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  d = null;..     
27b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
27e0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43 6c 6f      // NOTE: Clo
27f0: 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
2800: 6e 20 66 6f 72 20 74 68 69 73 20 74 65 73 74 20  n for this test 
2810: 74 68 72 65 61 64 20 61 73 20 77 65 20 61 72 65  thread as we are
2820: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2830: 20 20 2f 2f 20 20 20 20 20 20 20 64 6f 6e 65 20    //       done 
2840: 77 69 74 68 20 69 74 2e 20 20 53 69 6e 63 65 20  with it.  Since 
2850: 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20 69  the above loop i
2860: 73 20 69 6e 66 69 6e 69 74 65 2c 20 69 74 0d 0a  s infinite, it..
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 2f 2f 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20  //       should 
2890: 6f 6e 6c 79 20 62 65 20 65 78 69 74 65 64 20 76  only be exited v
28a0: 69 61 20 74 68 69 73 20 74 65 73 74 20 74 68 72  ia this test thr
28b0: 65 61 64 20 62 65 69 6e 67 0d 0a 20 20 20 20 20  ead being..     
28c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
28d0: 20 20 20 20 61 62 6f 72 74 65 64 3b 20 74 68 65      aborted; the
28e0: 72 65 66 6f 72 65 2c 20 65 78 65 63 75 74 69 6f  refore, executio
28f0: 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 72  n should never r
2900: 65 61 63 68 20 74 68 69 73 0d 0a 20 20 20 20 20  each this..     
2910: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
2920: 20 20 20 20 70 6f 69 6e 74 2e 0d 0a 20 20 20 20      point...    
2930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 43 6c 6f 73 65  connection.Close
2960: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
2970: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
2980: 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20  = null;..       
2990: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
29a0: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
29b0: 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20  xception e)..   
29c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
29e0: 74 65 72 6c 6f 63 6b 65 64 2e 49 6e 63 72 65 6d  terlocked.Increm
29f0: 65 6e 74 28 72 65 66 20 65 72 72 6f 72 73 29 3b  ent(ref errors);
2a00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a10: 20 20 54 72 61 63 65 2e 57 72 69 74 65 4c 69 6e    Trace.WriteLin
2a20: 65 28 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  e(e);..         
2a30: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2a40: 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20      };....      
2a50: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2a60: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 43        // NOTE: C
2a70: 72 65 61 74 65 20 61 20 28 72 65 75 73 61 62 6c  reate a (reusabl
2a80: 65 29 20 64 65 6c 65 67 61 74 65 20 74 68 61 74  e) delegate that
2a90: 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68   will contain th
2aa0: 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  e code..        
2ab0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68 61      //       tha
2ac0: 74 20 68 61 6c 66 20 74 68 65 20 63 72 65 61 74  t half the creat
2ad0: 65 64 20 74 68 72 65 61 64 73 20 61 72 65 20 74  ed threads are t
2ae0: 6f 20 65 78 65 63 75 74 65 2e 20 20 54 68 69 73  o execute.  This
2af0: 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20   code..         
2b00: 20 20 20 2f 2f 20 20 20 20 20 20 20 77 69 6c 6c     //       will
2b10: 20 72 65 70 65 61 74 65 64 6c 79 20 63 61 6c 6c   repeatedly call
2b20: 20 74 68 65 20 54 68 72 65 61 64 2e 41 62 6f 72   the Thread.Abor
2b30: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6c  t() method on al
2b40: 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  l the..         
2b50: 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 74 68 65     //       othe
2b60: 72 20 74 65 73 74 20 74 68 72 65 61 64 73 20 75  r test threads u
2b70: 6e 74 69 6c 20 74 68 65 79 20 61 6c 6c 20 61 70  ntil they all ap
2b80: 70 65 61 72 20 74 6f 20 62 65 20 64 65 61 64 2e  pear to be dead.
2b90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
2ba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 68  ..            Th
2bb0: 72 65 61 64 53 74 61 72 74 20 74 68 72 65 61 64  readStart thread
2bc0: 53 74 61 72 74 32 20 3d 20 64 65 6c 65 67 61 74  Start2 = delegat
2bd0: 65 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e()..           
2be0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2bf0: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
2c00: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
2c10: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
2c30: 4f 54 45 3a 20 57 61 69 74 20 66 6f 72 65 76 65  OTE: Wait foreve
2c40: 72 20 66 6f 72 20 74 68 65 20 22 47 4f 22 20 73  r for the "GO" s
2c50: 69 67 6e 61 6c 20 73 6f 20 74 68 61 74 20 61 6c  ignal so that al
2c60: 6c 20 74 68 72 65 61 64 73 0d 0a 20 20 20 20 20  l threads..     
2c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
2c80: 20 20 20 20 63 61 6e 20 73 74 61 72 74 20 77 6f      can start wo
2c90: 72 6b 69 6e 67 20 61 74 20 61 70 70 72 6f 78 69  rking at approxi
2ca0: 6d 61 74 65 6c 79 20 74 68 65 20 73 61 6d 65 20  mately the same 
2cb0: 74 69 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  time...         
2cc0: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
2cd0: 54 68 69 73 20 69 73 20 61 6c 73 6f 20 75 73 65  This is also use
2ce0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
2cf0: 68 61 74 20 61 6c 6c 20 74 65 73 74 20 74 68 72  hat all test thr
2d00: 65 61 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20  eads..          
2d10: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61        //       a
2d20: 72 65 20 69 6e 73 69 64 65 20 6f 66 20 61 20 74  re inside of a t
2d30: 72 79 20 62 6c 6f 63 6b 20 62 65 66 6f 72 65 20  ry block before 
2d40: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 62  attempting to ab
2d50: 6f 72 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ort..           
2d60: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 68       //       th
2d70: 65 6d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  em...           
2d80: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2d90: 20 20 20 20 20 20 20 20 20 67 6f 45 76 65 6e 74           goEvent
2da0: 2e 57 61 69 74 4f 6e 65 28 29 3b 0d 0a 0d 0a 20  .WaitOne();.... 
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dc0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
2dd0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 69 76 65     // NOTE: Give
2de0: 20 74 68 65 20 6f 74 68 65 72 20 74 65 73 74 20   the other test 
2df0: 74 68 72 65 61 64 73 20 61 20 73 6c 69 67 68 74  threads a slight
2e00: 20 68 65 61 64 20 73 74 61 72 74 20 74 6f 0d 0a   head start to..
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 2f 2f 20 20 20 20 20 20 20 6d 61 6b 65 20 73 75  //       make su
2e30: 72 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65  re that they are
2e40: 20 66 75 6c 6c 79 20 61 6c 69 76 65 20 70 72 69   fully alive pri
2e50: 6f 72 20 74 6f 20 74 72 79 69 6e 67 0d 0a 20 20  or to trying..  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2e70: 20 20 20 20 20 20 20 74 6f 20 61 62 6f 72 74 20         to abort 
2e80: 61 6e 79 20 6f 66 20 74 68 65 6d 2e 0d 0a 20 20  any of them...  
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2eb0: 20 20 54 68 72 65 61 64 2e 53 6c 65 65 70 28 24    Thread.Sleep($
2ec0: 7b 63 6f 75 6e 74 28 32 29 7d 29 3b 0d 0a 0d 0a  {count(2)});....
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
2ef0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4c 6f 6f      // NOTE: Loo
2f00: 70 20 66 6f 72 65 76 65 72 20 75 6e 74 69 6c 20  p forever until 
2f10: 61 6c 6c 20 74 65 73 74 20 74 68 72 65 61 64 73  all test threads
2f20: 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 64 65   appear to be de
2f30: 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ad...           
2f40: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2f50: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28           while (
2f60: 74 72 75 65 29 0d 0a 20 20 20 20 20 20 20 20 20  true)..         
2f70: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 61 69 74 20    // NOTE: Wait 
2fb0: 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  a random number 
2fc0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  of milliseconds,
2fd0: 20 75 70 20 74 6f 20 61 20 66 75 6c 6c 0d 0a 20   up to a full.. 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 2f 2f 20 20 20 20 20 20 20 73 65 63 6f 6e 64   //       second
3000: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3010: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3020: 20 20 20 20 20 20 20 20 20 20 20 54 68 72 65 61             Threa
3030: 64 2e 53 6c 65 65 70 28 72 61 6e 64 6f 6d 2e 4e  d.Sleep(random.N
3040: 65 78 74 28 30 2c 20 24 7b 63 6f 75 6e 74 28 33  ext(0, ${count(3
3050: 29 7d 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  )}));....       
3060: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 2f 2f 20 4e 4f 54 45 3a 20 53 65 6c 65 63 74   // NOTE: Select
3090: 20 61 20 72 61 6e 64 6f 6d 20 74 68 72 65 61 64   a random thread
30a0: 20 74 6f 20 61 62 6f 72 74 2e 0d 0a 20 20 20 20   to abort...    
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
30c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
30d0: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 20 3d 20      int index = 
30e0: 72 61 6e 64 6f 6d 2e 4e 65 78 74 28 31 2c 20 63  random.Next(1, c
30f0: 6f 75 6e 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ount);....      
3100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74 68    // NOTE: If th
3130: 65 20 74 68 72 65 61 64 20 61 70 70 65 61 72 73  e thread appears
3140: 20 74 6f 20 62 65 20 61 6c 69 76 65 2c 20 74 72   to be alive, tr
3150: 79 20 74 6f 20 61 62 6f 72 74 0d 0a 20 20 20 20  y to abort..    
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
3170: 20 20 20 20 20 20 20 69 74 2e 0d 0a 20 20 20 20         it...    
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
3190: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
31a0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
31b0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 69 66 20 28 74 68 72 65 61 64 5c 5b 69 6e    if (thread\[in
31e0: 64 65 78 5c 5d 2e 49 73 41 6c 69 76 65 29 0d 0a  dex\].IsAlive)..
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 20 20 20 74 68 72 65 61 64 5c 5b 69 6e        thread\[in
3210: 64 65 78 5c 5d 2e 41 62 6f 72 74 28 29 3b 0d 0a  dex\].Abort();..
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
3240: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78         catch (Ex
3250: 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20  ception e)..    
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
3270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3280: 20 20 20 20 20 54 72 61 63 65 2e 57 72 69 74 65       Trace.Write
3290: 4c 69 6e 65 28 65 29 3b 0d 0a 20 20 20 20 20 20  Line(e);..      
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
32b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32c0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
32d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
32e0: 3a 20 49 66 20 61 6c 6c 20 74 68 65 20 6f 74 68  : If all the oth
32f0: 65 72 20 74 68 72 65 61 64 73 20 61 72 65 20 64  er threads are d
3300: 65 61 64 2c 20 70 72 65 73 75 6d 61 62 6c 79 20  ead, presumably 
3310: 64 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  due..           
3320: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
3330: 74 6f 20 62 65 69 6e 67 20 61 62 6f 72 74 65 64  to being aborted
3340: 2c 20 73 74 6f 70 20 6e 6f 77 2e 20 20 54 68 69  , stop now.  Thi
3350: 73 20 63 68 65 63 6b 20 69 73 20 73 69 6d 70 6c  s check is simpl
3360: 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er,..           
3370: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
3380: 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6d 6f 72  and possibly mor
3390: 65 20 72 65 6c 69 61 62 6c 65 2c 20 74 68 61 6e  e reliable, than
33a0: 20 63 68 65 63 6b 69 6e 67 20 69 66 20 61 6e 79   checking if any
33b0: 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 20   of..           
33c0: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
33d0: 74 68 65 20 74 65 73 74 20 74 68 72 65 61 64 73  the test threads
33e0: 20 61 72 65 20 73 74 69 6c 6c 20 61 6c 69 76 65   are still alive
33f0: 20 76 69 61 20 74 68 65 69 72 20 49 73 41 6c 69   via their IsAli
3400: 76 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ve..            
3410: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 70        //       p
3420: 72 6f 70 65 72 74 79 2e 0d 0a 20 20 20 20 20 20  roperty...      
3430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 69 66 20 28 49 6e 74 65 72 6c 6f 63 6b 65    if (Interlocke
3460: 64 2e 49 6e 63 72 65 6d 65 6e 74 28 72 65 66 20  d.Increment(ref 
3470: 65 72 72 6f 72 73 29 20 3d 3d 20 63 6f 75 6e 74  errors) == count
3480: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
3490: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
34c0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72             Inter
34d0: 6c 6f 63 6b 65 64 2e 44 65 63 72 65 6d 65 6e 74  locked.Decrement
34e0: 28 72 65 66 20 65 72 72 6f 72 73 29 3b 0d 0a 20  (ref errors);.. 
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3510: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
3520: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
3530: 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  n e)..          
3540: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3550: 20 20 20 20 20 20 20 49 6e 74 65 72 6c 6f 63 6b         Interlock
3560: 65 64 2e 49 6e 63 72 65 6d 65 6e 74 28 72 65 66  ed.Increment(ref
3570: 20 65 72 72 6f 72 73 29 3b 0d 0a 20 20 20 20 20   errors);..     
3580: 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
3590: 2e 57 72 69 74 65 4c 69 6e 65 28 65 29 3b 0d 0a  .WriteLine(e);..
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
35b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0d  .            };.
35c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
35d0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
35e0: 2f 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 65  / NOTE: Create e
35f0: 61 63 68 20 6f 66 20 74 68 65 20 74 65 73 74 20  ach of the test 
3600: 74 68 72 65 61 64 73 20 77 69 74 68 20 61 20 73  threads with a s
3610: 75 69 74 61 62 6c 65 20 73 74 61 63 6b 0d 0a 20  uitable stack.. 
3620: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
3630: 20 20 20 20 73 69 7a 65 2e 20 20 57 65 20 6d 75      size.  We mu
3640: 73 74 20 73 70 65 63 69 66 79 20 61 20 73 74 61  st specify a sta
3650: 63 6b 20 73 69 7a 65 20 68 65 72 65 20 62 65 63  ck size here bec
3660: 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20  ause the..      
3670: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 64        //       d
3680: 65 66 61 75 6c 74 20 6f 6e 65 20 66 6f 72 20 74  efault one for t
3690: 68 65 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  he process would
36a0: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
36b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
36c0: 20 2f 2f 20 20 20 20 20 20 20 70 61 72 65 6e 74   //       parent
36d0: 20 65 78 65 63 75 74 61 62 6c 65 20 28 74 68 65   executable (the
36e0: 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 2c 20 77   Eagle shell), w
36f0: 68 69 63 68 20 69 73 20 31 36 4d 42 2c 0d 0a 20  hich is 16MB,.. 
3700: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
3710: 20 20 20 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f      too large to
3720: 20 62 65 20 75 73 65 66 75 6c 2e 0d 0a 20 20 20   be useful...   
3730: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
3740: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e           for (in
3750: 74 20 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64  t index = 0; ind
3760: 65 78 20 3c 20 63 6f 75 6e 74 3b 20 69 6e 64 65  ex < count; inde
3770: 78 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20  x++)..          
3780: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
3790: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
37a0: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 46 69       // NOTE: Fi
37b0: 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 6b 69  gure out what ki
37c0: 6e 64 20 6f 66 20 74 68 72 65 61 64 20 74 6f 20  nd of thread to 
37d0: 63 72 65 61 74 65 20 28 69 2e 65 2e 20 6f 6e 65  create (i.e. one
37e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
37f0: 2f 2f 20 20 20 20 20 20 20 74 68 61 74 20 75 73  //       that us
3800: 65 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  es a connection 
3810: 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6c 6c  or one that call
3820: 73 20 74 68 65 20 47 43 29 2e 0d 0a 20 20 20 20  s the GC)...    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
3840: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 72 65              Thre
3850: 61 64 53 74 61 72 74 20 74 68 72 65 61 64 53 74  adStart threadSt
3860: 61 72 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  art;....        
3870: 20 20 20 20 20 20 69 66 20 28 69 6e 64 65 78 20        if (index 
3880: 3d 3d 20 30 29 0d 0a 20 20 20 20 20 20 20 20 20  == 0)..         
3890: 20 20 20 20 20 20 20 74 68 72 65 61 64 53 74 61         threadSta
38a0: 72 74 20 3d 20 74 68 72 65 61 64 53 74 61 72 74  rt = threadStart
38b0: 32 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
38c0: 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
38d0: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 53 74          threadSt
38e0: 61 72 74 20 3d 20 74 68 72 65 61 64 53 74 61 72  art = threadStar
38f0: 74 31 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t1;....         
3900: 20 20 20 20 20 74 68 72 65 61 64 5c 5b 69 6e 64       thread\[ind
3910: 65 78 5c 5d 20 3d 20 6e 65 77 20 54 68 72 65 61  ex\] = new Threa
3920: 64 28 74 68 72 65 61 64 53 74 61 72 74 2c 20 31  d(threadStart, 1
3930: 30 34 38 35 37 36 29 3b 0d 0a 0d 0a 20 20 20 20  048576);....    
3940: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
3950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
3960: 4f 54 45 3a 20 4e 61 6d 65 20 65 61 63 68 20 74  OTE: Name each t
3970: 68 72 65 61 64 20 66 6f 72 20 61 20 62 65 74 74  hread for a bett
3980: 65 72 20 64 65 62 75 67 67 69 6e 67 20 65 78 70  er debugging exp
3990: 65 72 69 65 6e 63 65 2e 0d 0a 20 20 20 20 20 20  erience...      
39a0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
39b0: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
39c0: 5c 5b 69 6e 64 65 78 5c 5d 2e 4e 61 6d 65 20 3d  \[index\].Name =
39d0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
39e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
39f0: 20 20 20 22 5b 66 69 6c 65 20 72 6f 6f 74 6e 61     "[file rootna
3a00: 6d 65 20 24 7b 66 69 6c 65 4e 61 6d 65 7d 5d 20  me ${fileName}] 
3a10: 23 7b 30 7d 22 2c 20 69 6e 64 65 78 29 3b 0d 0a  #{0}", index);..
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
3a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
3a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3a50: 4e 4f 54 45 3a 20 53 74 61 72 74 20 61 6c 6c 20  NOTE: Start all 
3a60: 74 68 65 20 74 68 72 65 61 64 73 20 6e 6f 77 2e  the threads now.
3a70: 20 20 54 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f    They should no
3a80: 74 20 61 63 74 75 61 6c 6c 79 20 64 6f 0d 0a 20  t actually do.. 
3a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
3aa0: 20 20 20 20 61 6e 79 20 6f 66 20 74 68 65 20 74      any of the t
3ab0: 65 73 74 20 22 77 6f 72 6b 22 20 75 6e 74 69 6c  est "work" until
3ac0: 20 77 65 20 73 69 67 6e 61 6c 20 74 68 65 20 65   we signal the e
3ad0: 76 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  vent...         
3ae0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
3af0: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64 65     for (int inde
3b00: 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20 63  x = 0; index < c
3b10: 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a  ount; index++)..
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
3b30: 72 65 61 64 5c 5b 69 6e 64 65 78 5c 5d 2e 53 74  read\[index\].St
3b40: 61 72 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  art();....      
3b50: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3b60: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 53        // NOTE: S
3b70: 65 6e 64 20 74 68 65 20 73 69 67 6e 61 6c 20 74  end the signal t
3b80: 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hat all threads 
3b90: 73 68 6f 75 6c 64 20 73 74 61 72 74 20 64 6f 69  should start doi
3ba0: 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng..            
3bb0: 2f 2f 20 20 20 20 20 20 20 74 68 65 69 72 20 74  //       their t
3bc0: 65 73 74 20 22 77 6f 72 6b 22 20 6e 6f 77 2e 0d  est "work" now..
3bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
3be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 45  .            goE
3bf0: 76 65 6e 74 2e 53 65 74 28 29 3b 20 2f 2a 20 47  vent.Set(); /* G
3c00: 4f 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  O */....        
3c10: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
3c20: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 61 69      // NOTE: Wai
3c30: 74 20 66 6f 72 65 76 65 72 20 66 6f 72 20 65 61  t forever for ea
3c40: 63 68 20 74 68 72 65 61 64 20 74 6f 20 66 69 6e  ch thread to fin
3c50: 69 73 68 20 69 74 73 20 74 65 73 74 20 22 77 6f  ish its test "wo
3c60: 72 6b 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rk"..           
3c70: 20 2f 2f 20 20 20 20 20 20 20 61 6e 64 20 74 68   //       and th
3c80: 65 6e 20 64 69 65 2e 0d 0a 20 20 20 20 20 20 20  en die...       
3c90: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3ca0: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e       for (int in
3cb0: 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c  dex = 0; index <
3cc0: 20 63 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29   count; index++)
3cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3ce0: 74 68 72 65 61 64 5c 5b 69 6e 64 65 78 5c 5d 2e  thread\[index\].
3cf0: 4a 6f 69 6e 28 29 3b 0d 0a 20 20 20 20 20 20 20  Join();..       
3d00: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
3d10: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
3d20: 2f 2f 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20  // NOTE: Return 
3d30: 61 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  a list of intege
3d40: 72 73 20 77 69 74 68 20 74 6f 74 61 6c 20 6e 75  rs with total nu
3d50: 6d 62 65 72 20 6f 66 20 64 61 74 61 20 62 79 74  mber of data byt
3d60: 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  es..          //
3d70: 20 20 20 20 20 20 20 73 65 65 6e 2c 20 74 6f 74         seen, tot
3d80: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65  al number of que
3d90: 72 79 20 72 65 73 75 6c 74 20 72 6f 77 73 20 73  ry result rows s
3da0: 65 65 6e 2c 20 61 6e 64 20 74 68 65 20 74 6f 74  een, and the tot
3db0: 61 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  al..          //
3dc0: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
3dd0: 20 65 78 63 65 70 74 69 6f 6e 73 20 63 61 75 67   exceptions caug
3de0: 68 74 20 62 79 20 61 6c 6c 20 74 68 65 20 74 65  ht by all the te
3df0: 73 74 20 74 68 72 65 61 64 73 2e 0d 0a 20 20 20  st threads...   
3e00: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
3e10: 20 20 20 20 20 4c 6f 6e 67 4c 69 73 74 20 63 6f       LongList co
3e20: 75 6e 74 73 20 3d 20 6e 65 77 20 4c 6f 6e 67 4c  unts = new LongL
3e30: 69 73 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ist();....      
3e40: 20 20 20 20 63 6f 75 6e 74 73 2e 41 64 64 28 73      counts.Add(s
3e50: 75 6d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  um);..          
3e60: 63 6f 75 6e 74 73 2e 41 64 64 28 72 6f 77 73 29  counts.Add(rows)
3e70: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 75  ;..          cou
3e80: 6e 74 73 2e 41 64 64 28 65 72 72 6f 72 73 29 3b  nts.Add(errors);
3e90: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
3ea0: 74 75 72 6e 20 63 6f 75 6e 74 73 3b 0d 0a 20 20  turn counts;..  
3eb0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3ec0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
3ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
3f10: 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61        public sta
3f20: 74 69 63 20 76 6f 69 64 20 4d 61 69 6e 28 29 0d  tic void Main().
3f30: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
3f40: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
3f50: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ing...        }.
3f60: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
3f70: 0a 20 20 7d 5d 20 74 72 75 65 20 74 72 75 65 20  .  }] true true 
3f80: 74 72 75 65 20 72 65 73 75 6c 74 73 20 65 72 72  true results err
3f90: 6f 72 73 20 5b 6c 69 73 74 20 53 79 73 74 65 6d  ors [list System
3fa0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
3fb0: 20 45 61 67 6c 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a   Eagle.dll]]....
3fc0: 20 20 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65    list $code $re
3fd0: 73 75 6c 74 73 20 5c 0d 0a 20 20 20 20 20 20 5b  sults \..      [
3fe0: 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73  expr {[info exis
3ff0: 74 73 20 65 72 72 6f 72 73 5d 20 3f 20 24 65 72  ts errors] ? $er
4000: 72 6f 72 73 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20  rors : ""}] \.. 
4010: 20 20 20 20 20 5b 65 78 70 72 20 7b 24 63 6f 64       [expr {$cod
4020: 65 20 65 71 20 22 4f 6b 22 20 3f 20 5b 63 61 74  e eq "Ok" ? [cat
4030: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
4040: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5f 44 79 6e  ject invoke _Dyn
4050: 61 6d 69 63 24 7b 69 64 7d 2e 54 65 73 74 24 7b  amic${id}.Test${
4060: 69 64 7d 20 52 75 6e 54 65 73 74 54 68 72 65 61  id} RunTestThrea
4070: 64 73 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75  ds..      } resu
4080: 6c 74 5d 20 3a 20 5b 73 65 74 20 72 65 73 75 6c  lt] : [set resul
4090: 74 20 22 22 5d 7d 5d 20 24 72 65 73 75 6c 74 20  t ""]}] $result 
40a0: 5c 0d 0a 20 20 20 20 20 20 5b 63 6f 6c 6c 65 63  \..      [collec
40b0: 74 47 61 72 62 61 67 65 20 24 74 65 73 74 5f 63  tGarbage $test_c
40c0: 68 61 6e 6e 65 6c 5d 20 5c 0d 0a 20 20 20 20 20  hannel] \..     
40d0: 20 5b 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65   [reportSQLiteRe
40e0: 73 6f 75 72 63 65 73 20 24 74 65 73 74 5f 63 68  sources $test_ch
40f0: 61 6e 6e 65 6c 20 74 72 75 65 5d 0d 0a 7d 20 2d  annel true]..} -
4100: 63 6c 65 61 6e 75 70 20 7b 0d 0a 20 20 63 6c 65  cleanup {..  cle
4110: 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  anupDb $fileName
4120: 0d 0a 0d 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63  ....  unset -noc
4130: 6f 6d 70 6c 61 69 6e 20 72 65 73 75 6c 74 20 72  omplain result r
4140: 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20 63 6f  esults errors co
4150: 64 65 20 73 71 6c 20 64 61 74 61 53 6f 75 72 63  de sql dataSourc
4160: 65 20 69 64 20 64 62 20 66 69 6c 65 4e 61 6d 65  e id db fileName
4170: 0d 0a 7d 20 2d 74 69 6d 65 20 74 72 75 65 20 2d  ..} -time true -
4180: 63 6f 6e 73 74 72 61 69 6e 74 73 20 7b 65 61 67  constraints {eag
4190: 6c 65 20 6d 6f 6e 6f 42 75 67 32 38 20 63 6f 6d  le monoBug28 com
41a0: 6d 61 6e 64 2e 73 71 6c 20 63 6f 6d 70 69 6c 65  mand.sql compile
41b0: 2e 44 41 54 41 20 53 51 4c 69 74 65 5c 0d 0a 53  .DATA SQLite\..S
41c0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
41d0: 65 7d 20 2d 6d 61 74 63 68 20 72 65 67 65 78 70  e} -match regexp
41e0: 20 2d 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64   -result [append
41f0: 41 72 67 73 20 22 5e 4f 6b 5c 0d 0a 53 79 73 74  Args "^Ok\..Syst
4200: 65 6d 23 43 6f 64 65 44 6f 6d 23 43 6f 6d 70 69  em#CodeDom#Compi
4210: 6c 65 72 23 43 6f 6d 70 69 6c 65 72 52 65 73 75  ler#CompilerResu
4220: 6c 74 73 23 5c 5c 64 2b 20 5c 5c 7b 5c 5c 7d 20  lts#\\d+ \\{\\} 
4230: 30 20 5c 5c 7b 5c 5c 64 2b 20 5c 5c 64 2b 20 22  0 \\{\\d+ \\d+ "
4240: 20 24 63 6f 75 6e 74 28 31 29 20 5c 0d 0a 22 5c   $count(1) \.."\
4250: 5c 7d 20 5c 5c 7b 5c 5c 7d 20 22 20 24 6d 65 6d  \} \\{\\} " $mem
4260: 6f 72 79 5f 75 73 65 64 20 5c 24 5d 7d 0d 0a 0d  ory_used \$]}...
4270: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
4280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
42a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
42b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
42c0: 0d 0a 0d 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ....unset -nocom
42d0: 70 6c 61 69 6e 20 63 6f 75 6e 74 0d 0a 0d 0a 23  plain count....#
42e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
42f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
4330: 0d 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  ..unset -nocompl
4340: 61 69 6e 20 6d 65 6d 6f 72 79 5f 75 73 65 64 0d  ain memory_used.
4350: 0a 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  ...#############
4360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
43a0: 23 23 0d 0a 0d 0a 72 75 6e 53 51 4c 69 74 65 54  ##....runSQLiteT
43b0: 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a 72 75 6e  estEpilogue..run
43c0: 54 65 73 74 45 70 69 6c 6f 67 75 65 0d 0a        TestEpilogue..