Fossil

Hex Artifact Content
Login

Artifact bd6f62946ae2105e737e3b1f2869be622a54d08e1352fd6fea6857d2bc66fc5e:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 68  #!/usr/bin/tclsh
0010: 0a 23 0a 23 20 52 75 6e 20 74 68 69 73 20 73 63  .#.# Run this sc
0020: 72 69 70 74 2c 20 67 69 76 69 6e 67 20 74 68 65  ript, giving the
0030: 20 75 72 6c 20 6f 66 20 61 20 46 6f 73 73 69 6c   url of a Fossil
0040: 20 73 65 72 76 65 72 20 69 6e 73 74 61 6e 63 65   server instance
0050: 73 20 61 73 20 74 68 65 0a 23 20 61 72 67 75 6d  s as the.# argum
0060: 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 73 63  ent, and this sc
0070: 72 69 70 74 20 77 69 6c 6c 20 73 74 61 72 74 20  ript will start 
0080: 73 65 6e 64 69 6e 67 20 48 54 54 50 20 72 65 71  sending HTTP req
0090: 75 65 73 74 73 20 69 6e 74 6f 20 74 68 65 0a 23  uests into the.#
00a0: 20 74 68 61 74 20 73 65 72 76 65 72 20 69 6e 73   that server ins
00b0: 74 61 6e 63 65 20 61 73 20 66 61 73 74 20 61 73  tance as fast as
00c0: 20 69 74 20 63 61 6e 2c 20 61 73 20 61 20 73 74   it can, as a st
00d0: 72 65 73 73 20 74 65 73 74 20 66 6f 72 20 74 68  ress test for th
00e0: 65 0a 23 20 73 65 72 76 65 72 20 69 6d 70 6c 65  e.# server imple
00f0: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 23 0a 73 65 74  mentation..#.set
0100: 20 6e 74 68 72 65 61 64 20 31 30 0a 66 6f 72 20   nthread 10.for 
0110: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 5b 6c  {set i 0} {$i<[l
0120: 6c 65 6e 67 74 68 20 24 61 72 67 76 5d 7d 20 7b  length $argv]} {
0130: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20  incr i} {.  set 
0140: 78 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20  x [lindex $argv 
0150: 24 69 5d 0a 20 20 69 66 20 7b 5b 72 65 67 65 78  $i].  if {[regex
0160: 70 20 7b 5e 2d 2d 5b 61 2d 7a 5d 7d 20 24 78 5d  p {^--[a-z]} $x]
0170: 7d 20 7b 0a 20 20 20 20 73 65 74 20 78 20 5b 73  } {.    set x [s
0180: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 78 20 31  tring range $x 1
0190: 20 65 6e 64 5d 0a 20 20 7d 0a 20 20 69 66 20 7b   end].  }.  if {
01a0: 24 78 3d 3d 22 2d 74 68 72 65 61 64 73 22 7d 20  $x=="-threads"} 
01b0: 7b 0a 20 20 20 20 69 6e 63 72 20 69 0a 20 20 20  {.    incr i.   
01c0: 20 73 65 74 20 6e 74 68 72 65 61 64 20 5b 6c 69   set nthread [li
01d0: 6e 64 65 78 20 24 61 72 67 76 20 24 69 5d 0a 20  ndex $argv $i]. 
01e0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69   } elseif {[stri
01f0: 6e 67 20 69 6e 64 65 78 20 24 78 20 30 5d 3d 3d  ng index $x 0]==
0200: 22 2d 22 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72  "-"} {.    error
0210: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
0220: 20 5c 22 24 78 5c 22 22 0a 20 20 7d 20 65 6c 73   \"$x\"".  } els
0230: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
0240: 73 20 75 72 6c 5d 7d 20 7b 0a 20 20 20 20 65 72  s url]} {.    er
0250: 72 6f 72 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67  ror "unknown arg
0260: 6d 65 6e 74 20 5c 22 24 78 5c 22 22 0a 20 20 7d  ment \"$x\"".  }
0270: 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74 20   else {.    set 
0280: 75 72 6c 20 24 78 0a 20 20 7d 0a 7d 0a 69 66 20  url $x.  }.}.if 
0290: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 75  {![info exists u
02a0: 72 6c 5d 7d 20 7b 0a 20 20 65 72 72 6f 72 20 22  rl]} {.  error "
02b0: 55 73 61 67 65 3a 20 24 61 72 67 76 30 20 5b 2d  Usage: $argv0 [-
02c0: 74 68 72 65 61 64 73 20 4e 5d 20 55 52 4c 22 0a  threads N] URL".
02d0: 7d 0a 69 66 20 7b 21 5b 72 65 67 65 78 70 20 7b  }.if {![regexp {
02e0: 5e 68 74 74 70 73 3f 3a 2f 2f 28 5b 5e 2f 3a 5d  ^https?://([^/:]
02f0: 2b 29 28 3a 5c 64 2b 29 3f 28 2f 2e 2a 29 24 7d  +)(:\d+)?(/.*)$}
0300: 20 24 75 72 6c 20 61 6c 6c 20 64 6f 6d 61 69 6e   $url all domain
0310: 20 70 6f 72 74 20 70 61 74 68 5d 7d 20 7b 0a 20   port path]} {. 
0320: 20 65 72 72 6f 72 20 22 63 6f 75 6c 64 20 6e 6f   error "could no
0330: 74 20 70 61 72 73 65 20 74 68 65 20 55 52 4c 20  t parse the URL 
0340: 5b 6c 69 73 74 20 24 75 72 6c 5d 20 2d 2d 20 73  [list $url] -- s
0350: 68 6f 75 6c 64 20 62 65 20 6f 66 20 74 68 65 5c  hould be of the\
0360: 0a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 5c  .         form \
0370: 22 68 74 74 70 3a 2f 2f 64 6f 6d 61 69 6e 2f 70  "http://domain/p
0380: 61 74 68 5c 22 22 0a 7d 0a 73 65 74 20 75 73 65  ath\"".}.set use
0390: 72 61 67 65 6e 74 20 7b 4d 6f 7a 69 6c 6c 61 2f  ragent {Mozilla/
03a0: 35 2e 30 20 28 66 6f 73 73 69 6c 2d 73 74 72 65  5.0 (fossil-stre
03b0: 73 73 2e 74 63 6c 29 20 47 65 63 6b 6f 2f 32 30  ss.tcl) Gecko/20
03c0: 31 30 30 31 30 31 20 46 69 72 65 66 6f 78 2f 35  100101 Firefox/5
03d0: 37 2e 30 7d 0a 73 65 74 20 70 61 74 68 20 5b 73  7.0}.set path [s
03e0: 74 72 69 6e 67 20 74 72 69 6d 72 69 67 68 74 20  tring trimright 
03f0: 24 70 61 74 68 20 2f 5d 0a 73 65 74 20 70 6f 72  $path /].set por
0400: 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 6c 65  t [string trimle
0410: 66 74 20 24 70 6f 72 74 20 3a 5d 0a 69 66 20 7b  ft $port :].if {
0420: 24 70 6f 72 74 3d 3d 22 22 7d 20 7b 73 65 74 20  $port==""} {set 
0430: 70 6f 72 74 20 38 30 7d 0a 0a 70 72 6f 63 20 73  port 80}..proc s
0440: 65 6e 64 5f 6f 6e 65 5f 72 65 71 75 65 73 74 20  end_one_request 
0450: 7b 74 69 64 20 64 6f 6d 61 69 6e 20 70 6f 72 74  {tid domain port
0460: 20 70 61 74 68 7d 20 7b 0a 20 20 77 68 69 6c 65   path} {.  while
0470: 20 7b 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 73   {[catch {.    s
0480: 65 74 20 78 20 5b 73 6f 63 6b 65 74 20 24 64 6f  et x [socket $do
0490: 6d 61 69 6e 20 24 70 6f 72 74 5d 0a 20 20 20 20  main $port].    
04a0: 66 63 6f 6e 66 69 67 75 72 65 20 24 78 20 2d 74  fconfigure $x -t
04b0: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72  ranslation binar
04c0: 79 20 2d 62 6c 6f 63 6b 69 6e 67 20 30 0a 20 20  y -blocking 0.  
04d0: 20 20 70 75 74 73 20 24 78 20 22 47 45 54 20 24    puts $x "GET $
04e0: 70 61 74 68 20 48 54 54 50 2f 31 2e 30 5c 72 22  path HTTP/1.0\r"
04f0: 0a 20 20 20 20 69 66 20 7b 24 70 6f 72 74 3d 3d  .    if {$port==
0500: 38 30 7d 20 7b 0a 20 20 20 20 20 20 70 75 74 73  80} {.      puts
0510: 20 24 78 20 22 48 6f 73 74 3a 20 24 64 6f 6d 61   $x "Host: $doma
0520: 69 6e 5c 72 22 0a 20 20 20 20 7d 20 65 6c 73 65  in\r".    } else
0530: 20 7b 0a 20 20 20 20 20 20 70 75 74 73 20 24 78   {.      puts $x
0540: 20 22 48 6f 73 74 3a 20 24 64 6f 6d 61 69 6e 3a   "Host: $domain:
0550: 24 70 6f 72 74 5c 72 22 0a 20 20 20 20 7d 0a 20  $port\r".    }. 
0560: 20 20 20 70 75 74 73 20 24 78 20 22 55 73 65 72     puts $x "User
0570: 2d 41 67 65 6e 74 3a 20 24 3a 3a 75 73 65 72 61  -Agent: $::usera
0580: 67 65 6e 74 5c 72 22 0a 20 20 20 20 70 75 74 73  gent\r".    puts
0590: 20 24 78 20 22 41 63 63 65 70 74 3a 20 74 65 78   $x "Accept: tex
05a0: 74 2f 68 74 6d 6c 2c 71 3d 30 2e 39 2c 2a 2f 2a  t/html,q=0.9,*/*
05b0: 3b 71 3d 30 2e 38 5c 72 22 0a 20 20 20 20 70 75  ;q=0.8\r".    pu
05c0: 74 73 20 24 78 20 22 41 63 63 65 70 74 2d 4c 61  ts $x "Accept-La
05d0: 6e 67 75 61 67 65 3a 20 65 6e 2d 55 53 2c 65 6e  nguage: en-US,en
05e0: 3b 71 3d 30 2e 35 5c 72 22 0a 20 20 20 20 70 75  ;q=0.5\r".    pu
05f0: 74 73 20 24 78 20 22 43 6f 6e 6e 65 63 74 69 6f  ts $x "Connectio
0600: 6e 3a 20 63 6c 6f 73 65 5c 72 22 0a 20 20 20 20  n: close\r".    
0610: 70 75 74 73 20 24 78 20 22 5c 72 22 0a 20 20 7d  puts $x "\r".  }
0620: 20 6d 73 67 5d 7d 20 7b 0a 20 20 20 20 70 75 74   msg]} {.    put
0630: 73 20 22 45 52 52 4f 52 3a 20 24 6d 73 67 22 0a  s "ERROR: $msg".
0640: 20 20 20 20 61 66 74 65 72 20 31 30 30 30 0a 20      after 1000. 
0650: 20 7d 0a 20 20 67 6c 6f 62 61 6c 20 63 6e 74 20   }.  global cnt 
0660: 73 74 69 6d 65 20 74 68 72 65 61 64 69 64 0a 20  stime threadid. 
0670: 20 73 65 74 20 63 6e 74 28 24 78 29 20 30 0a 20   set cnt($x) 0. 
0680: 20 73 65 74 20 73 74 69 6d 65 28 24 78 29 20 5b   set stime($x) [
0690: 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0a 20  clock seconds]. 
06a0: 20 73 65 74 20 74 68 72 65 61 64 69 64 28 24 78   set threadid($x
06b0: 29 20 24 74 69 64 0a 20 20 66 6c 75 73 68 20 24  ) $tid.  flush $
06c0: 78 0a 20 20 66 69 6c 65 65 76 65 6e 74 20 24 78  x.  fileevent $x
06d0: 20 72 65 61 64 61 62 6c 65 20 5b 6c 69 73 74 20   readable [list 
06e0: 67 65 74 5f 72 65 70 6c 79 20 24 74 69 64 20 24  get_reply $tid $
06f0: 70 61 74 68 20 24 78 5d 0a 7d 0a 0a 70 72 6f 63  path $x].}..proc
0700: 20 63 6c 6f 73 65 5f 63 6f 6e 6e 65 63 74 69 6f   close_connectio
0710: 6e 20 7b 78 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c  n {x} {.  global
0720: 20 63 6e 74 20 73 74 69 6d 65 20 74 69 64 0a 20   cnt stime tid. 
0730: 20 63 6c 6f 73 65 20 24 78 0a 20 20 75 6e 73 65   close $x.  unse
0740: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 63 6e  t -nocomplain cn
0750: 74 28 24 78 29 0a 20 20 75 6e 73 65 74 20 2d 6e  t($x).  unset -n
0760: 6f 63 6f 6d 70 6c 61 69 6e 20 73 74 69 6d 65 28  ocomplain stime(
0770: 24 78 29 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63  $x).  unset -noc
0780: 6f 6d 70 6c 61 69 6e 20 74 68 72 65 61 64 69 64  omplain threadid
0790: 28 24 78 29 0a 7d 0a 0a 70 72 6f 63 20 67 65 74  ($x).}..proc get
07a0: 5f 72 65 70 6c 79 20 7b 74 69 64 20 69 6e 66 6f  _reply {tid info
07b0: 20 78 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 63   x} {.  global c
07c0: 6e 74 0a 20 20 69 66 20 7b 5b 65 6f 66 20 24 78  nt.  if {[eof $x
07d0: 5d 7d 20 7b 0a 20 20 20 20 70 75 74 73 20 22 5b  ]} {.    puts "[
07e0: 66 6f 72 6d 61 74 20 25 33 64 3a 20 24 74 69 64  format %3d: $tid
07f0: 5d 20 24 69 6e 66 6f 20 28 24 63 6e 74 28 24 78  ] $info ($cnt($x
0800: 29 20 62 79 74 65 73 29 22 0a 20 20 20 20 66 6c  ) bytes)".    fl
0810: 75 73 68 20 73 74 64 6f 75 74 0a 20 20 20 20 63  ush stdout.    c
0820: 6c 6f 73 65 5f 63 6f 6e 6e 65 63 74 69 6f 6e 20  lose_connection 
0830: 24 78 0a 20 20 20 20 73 74 61 72 74 5f 61 6e 6f  $x.    start_ano
0840: 74 68 65 72 5f 72 65 71 75 65 73 74 20 24 74 69  ther_request $ti
0850: 64 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  d.  } else {.   
0860: 20 69 6e 63 72 20 63 6e 74 28 24 78 29 20 5b 73   incr cnt($x) [s
0870: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b 72 65  tring length [re
0880: 61 64 20 24 78 5d 5d 0a 20 20 7d 0a 7d 0a 0a 73  ad $x]].  }.}..s
0890: 65 74 20 70 61 67 65 73 20 7b 0a 20 20 2f 74 69  et pages {.  /ti
08a0: 6d 65 6c 69 6e 65 3f 6e 3d 32 30 0a 20 20 2f 74  meline?n=20.  /t
08b0: 69 6d 65 6c 69 6e 65 3f 6e 3d 32 30 26 61 3d 31  imeline?n=20&a=1
08c0: 39 37 30 2d 30 31 2d 30 31 0a 20 20 2f 68 6f 6d  970-01-01.  /hom
08d0: 65 0a 20 20 2f 62 72 6c 69 73 74 0a 20 20 2f 69  e.  /brlist.  /i
08e0: 6e 66 6f 2f 74 72 75 6e 6b 0a 20 20 2f 69 6e 66  nfo/trunk.  /inf
08f0: 6f 2f 32 30 31 35 2d 30 31 2d 30 31 0a 20 20 2f  o/2015-01-01.  /
0900: 76 64 69 66 66 3f 66 72 6f 6d 3d 32 30 31 35 2d  vdiff?from=2015-
0910: 30 31 2d 30 31 26 74 6f 3d 74 72 75 6e 6b 26 64  01-01&to=trunk&d
0920: 69 66 66 3d 30 0a 20 20 2f 77 63 6f 6e 74 65 6e  iff=0.  /wconten
0930: 74 0a 20 20 2f 66 69 6c 65 61 67 65 0a 20 20 2f  t.  /fileage.  /
0940: 64 69 72 0a 20 20 2f 74 72 65 65 0a 20 20 2f 75  dir.  /tree.  /u
0950: 76 6c 69 73 74 0a 20 20 2f 73 74 61 74 0a 20 20  vlist.  /stat.  
0960: 2f 74 65 73 74 5f 65 6e 76 0a 20 20 2f 73 69 74  /test_env.  /sit
0970: 65 6d 61 70 0a 20 20 2f 68 61 73 68 2d 63 6f 6c  emap.  /hash-col
0980: 6c 69 73 69 6f 6e 73 0a 20 20 2f 61 72 74 69 66  lisions.  /artif
0990: 61 63 74 5f 73 74 61 74 73 0a 20 20 2f 62 6c 6f  act_stats.  /blo
09a0: 62 6c 69 73 74 0a 20 20 2f 62 69 67 62 6c 6f 62  blist.  /bigblob
09b0: 6c 69 73 74 0a 20 20 2f 77 69 6b 69 5f 72 75 6c  list.  /wiki_rul
09c0: 65 73 0a 20 20 2f 6d 64 5f 72 75 6c 65 73 0a 20  es.  /md_rules. 
09d0: 20 2f 68 65 6c 70 0a 20 20 2f 74 65 73 74 2d 61   /help.  /test-a
09e0: 6c 6c 2d 68 65 6c 70 0a 20 20 2f 74 69 6d 65 77  ll-help.  /timew
09f0: 61 72 70 73 0a 20 20 2f 74 61 67 6c 69 73 74 0a  arps.  /taglist.
0a00: 7d 0a 0a 73 65 74 20 70 61 67 65 69 64 78 20 30  }..set pageidx 0
0a10: 0a 70 72 6f 63 20 73 74 61 72 74 5f 61 6e 6f 74  .proc start_anot
0a20: 68 65 72 5f 72 65 71 75 65 73 74 20 7b 74 69 64  her_request {tid
0a30: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 70 61 67  } {.  global pag
0a40: 65 73 20 70 61 67 65 69 64 78 20 64 6f 6d 61 69  es pageidx domai
0a50: 6e 20 70 6f 72 74 20 70 61 74 68 0a 20 20 73 65  n port path.  se
0a60: 74 20 70 20 5b 6c 69 6e 64 65 78 20 24 70 61 67  t p [lindex $pag
0a70: 65 73 20 24 70 61 67 65 69 64 78 5d 0a 20 20 69  es $pageidx].  i
0a80: 6e 63 72 20 70 61 67 65 69 64 78 0a 20 20 69 66  ncr pageidx.  if
0a90: 20 7b 24 70 61 67 65 69 64 78 3e 3d 5b 6c 6c 65   {$pageidx>=[lle
0aa0: 6e 67 74 68 20 24 70 61 67 65 73 5d 7d 20 7b 73  ngth $pages]} {s
0ab0: 65 74 20 70 61 67 65 69 64 78 20 30 7d 0a 20 20  et pageidx 0}.  
0ac0: 73 65 6e 64 5f 6f 6e 65 5f 72 65 71 75 65 73 74  send_one_request
0ad0: 20 24 74 69 64 20 24 64 6f 6d 61 69 6e 20 24 70   $tid $domain $p
0ae0: 6f 72 74 20 24 70 61 74 68 24 70 0a 7d 0a 0a 70  ort $path$p.}..p
0af0: 72 6f 63 20 75 6e 68 61 6e 67 5f 73 74 61 6c 6c  roc unhang_stall
0b00: 65 64 5f 74 68 72 65 61 64 73 20 7b 7d 20 7b 0a  ed_threads {} {.
0b10: 20 20 67 6c 6f 62 61 6c 20 73 74 69 6d 65 20 74    global stime t
0b20: 68 72 65 61 64 69 64 0a 20 20 73 65 74 20 6e 6f  hreadid.  set no
0b30: 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  w [clock seconds
0b40: 5d 0a 20 20 23 20 70 75 74 73 20 22 63 68 65 63  ].  # puts "chec
0b50: 6b 69 6e 67 20 66 6f 72 20 73 74 61 6c 6c 65 64  king for stalled
0b60: 20 74 68 72 65 61 64 73 2e 2e 2e 2e 22 0a 20 20   threads....".  
0b70: 66 6f 72 65 61 63 68 20 78 20 5b 61 72 72 61 79  foreach x [array
0b80: 20 6e 61 6d 65 73 20 73 74 69 6d 65 5d 20 7b 0a   names stime] {.
0b90: 20 20 20 20 23 20 70 75 74 73 20 2d 6e 6f 6e 65      # puts -none
0ba0: 77 6c 69 6e 65 20 22 20 24 74 68 72 65 61 64 69  wline " $threadi
0bb0: 64 28 24 78 29 3d 5b 65 78 70 72 20 7b 24 6e 6f  d($x)=[expr {$no
0bc0: 77 2d 24 73 74 69 6d 65 28 24 78 29 7d 5d 22 0a  w-$stime($x)}]".
0bd0: 20 20 20 20 69 66 20 7b 24 73 74 69 6d 65 28 24      if {$stime($
0be0: 78 29 2b 30 3c 24 6e 6f 77 2d 31 30 7d 20 7b 0a  x)+0<$now-10} {.
0bf0: 20 20 20 20 20 20 73 65 74 20 74 20 24 74 68 72        set t $thr
0c00: 65 61 64 69 64 28 24 78 29 0a 20 20 20 20 20 20  eadid($x).      
0c10: 70 75 74 73 20 22 52 45 53 54 41 52 54 20 74 68  puts "RESTART th
0c20: 72 65 61 64 20 24 74 22 0a 20 20 20 20 20 20 66  read $t".      f
0c30: 6c 75 73 68 20 73 74 64 6f 75 74 0a 20 20 20 20  lush stdout.    
0c40: 20 20 63 6c 6f 73 65 5f 63 6f 6e 6e 65 63 74 69    close_connecti
0c50: 6f 6e 20 24 78 0a 20 20 20 20 20 20 73 74 61 72  on $x.      star
0c60: 74 5f 61 6e 6f 74 68 65 72 5f 72 65 71 75 65 73  t_another_reques
0c70: 74 20 24 74 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t $t.    }.  }. 
0c80: 20 23 20 70 75 74 73 20 22 22 0a 20 20 66 6c 75   # puts "".  flu
0c90: 73 68 20 73 74 64 6f 75 74 0a 20 20 61 66 74 65  sh stdout.  afte
0ca0: 72 20 31 30 30 30 30 20 75 6e 68 61 6e 67 5f 73  r 10000 unhang_s
0cb0: 74 61 6c 6c 65 64 5f 74 68 72 65 61 64 73 0a 7d  talled_threads.}
0cc0: 0a 0a 75 6e 68 61 6e 67 5f 73 74 61 6c 6c 65 64  ..unhang_stalled
0cd0: 5f 74 68 72 65 61 64 73 0a 66 6f 72 20 7b 73 65  _threads.for {se
0ce0: 74 20 69 20 31 7d 20 7b 24 69 3c 3d 24 6e 74 68  t i 1} {$i<=$nth
0cf0: 72 65 61 64 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  read} {incr i} {
0d00: 0a 20 20 73 74 61 72 74 5f 61 6e 6f 74 68 65 72  .  start_another
0d10: 5f 72 65 71 75 65 73 74 20 24 69 0a 7d 0a 76 77  _request $i.}.vw
0d20: 61 69 74 20 66 6f 72 65 76 65 72 0a              ait forever.