package door import ( "log" "syscall" ) func Reader(handle int, d *Door) { // I don't need the select anymore. Let the read block. // defer d.wg.Done() defer func() { log.Printf("~Reader2\n") if d.ReaderCanClose { d.wg.Done() } }() defer func() { if err := recover(); err != nil { log.Printf("Reader: %#v\n", err) } }() var buffer []byte = make([]byte, 1) for { var read int var err error read, err = syscall.Read(handle, buffer) if err != nil { log.Printf("Reader ERR: %#v\n", err) d.ReaderClosed = true close(d.readerChannel) /* if !d.Disconnect() { log.Println("Reader close writerChannel") d.Disconnected = true // atomic.StoreInt32(&d.Disconnected, 1) d.closeChannel <- struct{}{} // close(d.writerChannel) return } // break */ return } if read == 1 { d.readerChannel <- buffer[0] } else { log.Printf("READ FAILED %d\n", read) d.ReaderClosed = true close(d.readerChannel) /* if !d.Disconnect() { log.Println("Reader close writerChannel") d.Disconnected = true // atomic.StoreInt32(&d.Disconnected, 1) d.closeChannel <- struct{}{} //close(d.writerChannel) return } // break */ return } } } /* func Reader(handle int, readerChannel *chan byte) { // I don't need the select anymore. Let the read block. defer func() { if err := recover(); err != nil { log.Printf("Reader: %#v\n", err) } }() buffer := make([]byte, 1) for { // blocking read in go routine // why doesn't this end when I close the handle? read, err := syscall.Read(handle, buffer) if err != nil { log.Printf("Reader ERR: %#v\n", err) close(*readerChannel) break } if read == 1 { *readerChannel <- buffer[0] } else { log.Printf("READ FAILED %d\n", read) close(*readerChannel) break } } } // This doesn't work. Closing the handle does not unblock the syscall.Read above. func CloseReader(handle int) { defer func() { if err := recover(); err != nil { log.Printf("CloseReader: %#v\n", err) } }() syscall.Close(handle) } */