Tcl Source Code

Hex Artifact Content
Login

Artifact 6df6a7c51076b6860ced2a4f36309bdc9cab830794b51b6f9773dabd52e67388:

Attachment "refchan-async-test.tcl" to ticket [de232b49f2] added by apnadkarni 2024-03-31 15:59:35.
0000: 73 65 74 20 3a 3a 6e 75 6d 42 79 74 65 73 57 72  set ::numBytesWr
0010: 69 74 74 65 6e 20 30 0d 0a 0d 0a 6e 61 6d 65 73  itten 0....names
0020: 70 61 63 65 20 65 76 61 6c 20 72 65 66 63 68 61  pace eval refcha
0030: 6e 20 7b 0d 0a 20 20 20 20 6e 61 6d 65 73 70 61  n {..    namespa
0040: 63 65 20 65 6e 73 65 6d 62 6c 65 20 63 72 65 61  ce ensemble crea
0050: 74 65 0d 0a 20 20 20 20 6e 61 6d 65 73 70 61 63  te..    namespac
0060: 65 20 65 78 70 6f 72 74 20 2a 0d 0a 0d 0a 0d 0a  e export *......
0070: 20 20 20 20 70 72 6f 63 20 66 69 6e 61 6c 69 7a      proc finaliz
0080: 65 20 7b 63 68 61 6e 20 61 72 67 73 7d 20 7b 0d  e {chan args} {.
0090: 0a 20 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61  .        namespa
00a0: 63 65 20 64 65 6c 65 74 65 20 63 5f 24 63 68 61  ce delete c_$cha
00b0: 6e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  n..    }....    
00c0: 70 72 6f 63 20 69 6e 69 74 69 61 6c 69 7a 65 20  proc initialize 
00d0: 7b 63 68 61 6e 20 61 72 67 73 7d 20 7b 0d 0a 20  {chan args} {.. 
00e0: 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63 65         namespace
00f0: 20 65 76 61 6c 20 63 5f 24 63 68 61 6e 20 7b 7d   eval c_$chan {}
0100: 0d 0a 20 20 20 20 20 20 20 20 6e 61 6d 65 73 70  ..        namesp
0110: 61 63 65 20 75 70 76 61 72 20 63 5f 24 63 68 61  ace upvar c_$cha
0120: 6e 20 77 61 74 63 68 69 6e 67 20 77 61 74 63 68  n watching watch
0130: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ing..        set
0140: 20 77 61 74 63 68 69 6e 67 20 7b 7d 0d 0a 20 20   watching {}..  
0150: 20 20 20 20 20 20 6c 69 73 74 20 66 69 6e 61 6c        list final
0160: 69 7a 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  ize initialize s
0170: 65 65 6b 20 77 61 74 63 68 20 77 72 69 74 65 0d  eek watch write.
0180: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 72  .    }....    pr
0190: 6f 63 20 77 61 74 63 68 20 7b 63 68 61 6e 20 61  oc watch {chan a
01a0: 72 67 73 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  rgs} {..        
01b0: 6e 61 6d 65 73 70 61 63 65 20 75 70 76 61 72 20  namespace upvar 
01c0: 63 5f 24 63 68 61 6e 20 77 61 74 63 68 69 6e 67  c_$chan watching
01d0: 20 77 61 74 63 68 69 6e 67 0d 0a 20 20 20 20 20   watching..     
01e0: 20 20 20 66 6f 72 65 61 63 68 20 61 72 67 20 24     foreach arg $
01f0: 61 72 67 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  args {..        
0200: 20 20 20 20 73 77 69 74 63 68 20 24 61 72 67 20      switch $arg 
0210: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
0220: 20 20 20 77 72 69 74 65 20 7b 0d 0a 20 20 20 20     write {..    
0230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0240: 69 66 20 7b 24 61 72 67 20 6e 69 20 24 77 61 74  if {$arg ni $wat
0250: 63 68 69 6e 67 7d 20 7b 0d 0a 20 20 20 20 20 20  ching} {..      
0260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0270: 20 20 6c 61 70 70 65 6e 64 20 77 61 74 63 68 69    lappend watchi
0280: 6e 67 20 24 61 72 67 0d 0a 20 20 20 20 20 20 20  ng $arg..       
0290: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02b0: 20 20 20 20 61 66 74 65 72 20 69 64 6c 65 20 61      after idle a
02c0: 66 74 65 72 20 30 20 63 68 61 6e 20 70 6f 73 74  fter 0 chan post
02d0: 65 76 65 6e 74 20 24 63 68 61 6e 20 24 61 72 67  event $chan $arg
02e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
02f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
0300: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
0310: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 72 6f 63     }....    proc
0320: 20 77 72 69 74 65 20 7b 63 68 61 6e 20 61 72 67   write {chan arg
0330: 73 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 6e  s} {..        in
0340: 63 72 20 3a 3a 63 6f 75 6e 74 65 72 0d 0a 20 20  cr ::counter..  
0350: 20 20 20 20 20 20 61 66 74 65 72 20 69 64 6c 65        after idle
0360: 20 61 66 74 65 72 20 30 20 63 68 61 6e 20 70 6f   after 0 chan po
0370: 73 74 65 76 65 6e 74 20 24 63 68 61 6e 20 77 72  stevent $chan wr
0380: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ite..        ret
0390: 75 72 6e 20 31 0d 0a 20 20 20 20 7d 0d 0a 7d 0d  urn 1..    }..}.
03a0: 0a 0d 0a 73 65 74 20 66 20 5b 63 68 61 6e 20 63  ...set f [chan c
03b0: 72 65 61 74 65 20 77 20 5b 6e 61 6d 65 73 70 61  reate w [namespa
03c0: 63 65 20 77 68 69 63 68 20 72 65 66 63 68 61 6e  ce which refchan
03d0: 5d 5d 0d 0a 63 68 61 6e 20 63 6f 6e 66 69 67 75  ]]..chan configu
03e0: 72 65 20 24 66 20 2d 62 6c 6f 63 6b 69 6e 67 20  re $f -blocking 
03f0: 30 0d 0a 63 68 61 6e 20 65 76 65 6e 74 20 24 66  0..chan event $f
0400: 20 77 72 69 74 61 62 6c 65 20 5b 6e 61 6d 65 73   writable [names
0410: 70 61 63 65 20 63 6f 64 65 20 7b 0d 0a 20 20 20  pace code {..   
0420: 20 70 75 74 73 20 24 66 20 58 0d 0a 7d 5d 0d 0a   puts $f X..}]..
0430: 0d 0a 70 72 6f 63 20 65 76 65 72 79 31 20 7b 7d  ..proc every1 {}
0440: 20 7b 0d 0a 20 20 20 20 61 66 74 65 72 20 69 64   {..    after id
0450: 6c 65 20 61 66 74 65 72 20 31 30 30 30 20 65 76  le after 1000 ev
0460: 65 72 79 31 0d 0a 20 20 20 20 70 75 74 73 20 5b  ery1..    puts [
0470: 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a  clock seconds]..
0480: 7d 0d 0a 0d 0a 65 76 65 72 79 31 0d 0a 0d 0a 76  }....every1....v
0490: 77 61 69 74 20 66 6f 72 65 76 65 72 0d 0a 0d 0a  wait forever....
04a0: 0d 0a                                            ..