Posted to tcl by sebres at Fri Apr 26 16:24:23 GMT 2019view pretty

### --------------------------------------------------------------
### part of test-cases for bug-b9bfaf5fdb
### (here my class-architecture and test-suite are used, but I hope it is approximately clear)
### --------------------------------------------------------------

## === before fix of bug-[b9bfaf5fdb]:

  method read {ch size} {
    while 1 {
      ## returns buffer read from channel (or "" for eof), or throws EAGAIN if no data currently:
      set buf [::fcgi::readb [$this . reqid] $size]
      ## if no data, we will signal the higher layers that EOF has been reached on the channel:
      if {![set len [string length $buf]] && ![fcgi::eof [$this . reqid]]} {
        ## todo: correct this tcl-error (see [b9bfaf5fdb]): 
        ##       reflected channel should also accept return code EAGAIN in blocking mode also
        ##       (and wait in the main worker processing channel or in core, but not in this thread) ...
        if {[$this . blocking : 0]} {
          ## main channel is in blocking mode, don't return - vwait here for read
          ## (caution, we can process another request in this fcgi-thread, so don't really block)...
          vwait [$this . reqid]
          continue
        }
        ## not eof, retry later:
        return -code error EAGAIN
      }
      return $buf
    }
  }

## === after fix of bug-[b9bfaf5fdb]:

  method read {ch size} {
    while 1 {
      ## returns buffer read from channel (or "" for eof), or throws EAGAIN if no data currently:
      set buf [::fcgi::readb [$this . reqid] $size]
      ## if no data, we will signal the higher layers that EOF has been reached on the channel:
      if {![set len [string length $buf]] && ![fcgi::eof [$this . reqid]]} {
        ## not eof, retry later:
        return -code error EAGAIN
      }
      return $buf
    }
  }

Comments

Posted by sebres at Fri Apr 26 17:15:27 GMT 2019 [text] [code]

basically I forgot to remove "while 1 {" in my test-cases here (after fix), there is no cycle in second case: either it throws EGAIN or it returns a buffer (or even "" for EOF).