Posted to tcl by colin at Tue Oct 26 21:13:20 GMT 2010view raw

  1. # Basic I/O
  2. method read {mychan n} {
  3. set used [clock milliseconds]
  4. if {[catch {::chan read $chan $n} result eo]} {
  5. Debug.error {$mychan read $chan $n -> error $result ($eo)}
  6. } else {
  7. Debug.chan {$mychan read $chan $n -> [string length $result] bytes: [string map {\n \\n} "[string length $result] bytes '[string range $result 0 20]...[string range $result end-20 end]"]'}
  8. Debug.chan {$mychan read $chan eof = [chan eof $chan]}
  9. Debug.chan {$mychan read $chan blocked = [chan blocked $chan]}
  10. Debug.chan {$chan configured: ([chan configure $chan])}
  11.  
  12. # ![chan configure $chan -blocking] - optimization -> save the
  13. # -blocking information in a flag, as it passes through method
  14. # 'blocking'.
  15. set gone [catch {chan eof $socket} eof]
  16. if {![string length $result] &&
  17. !$gone && !$eof &&
  18. ![chan configure $chan -blocking]
  19. } {
  20. return -code error EAGAIN
  21. }
  22. }
  23. return $result
  24. }