|
@@ -3,8 +3,58 @@ package door
|
|
|
import (
|
|
|
"log"
|
|
|
"syscall"
|
|
|
+ "sync/atomic"
|
|
|
)
|
|
|
|
|
|
+func Reader2(handle int, d *Door) {
|
|
|
+
|
|
|
+
|
|
|
+ defer func() {
|
|
|
+ log.Printf("~Reader2\n")
|
|
|
+ d.wg.Done()
|
|
|
+ }()
|
|
|
+ defer func() {
|
|
|
+ if err := recover(); err != nil {
|
|
|
+ log.Printf("Reader: %#v\n", err)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ buffer := make([]byte, 1)
|
|
|
+ for {
|
|
|
+ read, err := syscall.Read(handle, buffer)
|
|
|
+ if err != nil {
|
|
|
+ log.Printf("Reader ERR: %#v\n", err)
|
|
|
+ close(d.readerChannel)
|
|
|
+ if ! d.Disconnect() {
|
|
|
+ log.Println("Reader close writerChannel")
|
|
|
+
|
|
|
+ atomic.StoreInt32(&d.Disconnected, 1)
|
|
|
+ d.closeChannel <- true
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if read == 1 {
|
|
|
+ d.readerChannel <- buffer[0]
|
|
|
+ } else {
|
|
|
+ log.Printf("READ FAILED %d\n", read)
|
|
|
+ close(d.readerChannel)
|
|
|
+ if ! d.Disconnect() {
|
|
|
+ log.Println("Reader close writerChannel")
|
|
|
+
|
|
|
+ atomic.StoreInt32(&d.Disconnected, 1)
|
|
|
+ d.closeChannel <- true
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func Reader(handle int, readerChannel *chan byte) {
|
|
|
|
|
|
defer func() {
|
|
@@ -15,6 +65,8 @@ func Reader(handle int, readerChannel *chan byte) {
|
|
|
|
|
|
buffer := make([]byte, 1)
|
|
|
for {
|
|
|
+
|
|
|
+
|
|
|
read, err := syscall.Read(handle, buffer)
|
|
|
if err != nil {
|
|
|
log.Printf("Reader ERR: %#v\n", err)
|
|
@@ -32,5 +84,11 @@ func Reader(handle int, readerChannel *chan byte) {
|
|
|
}
|
|
|
|
|
|
func CloseReader(handle int) {
|
|
|
+ defer func() {
|
|
|
+ if err := recover(); err != nil {
|
|
|
+ log.Printf("CloseReader: %#v\n", err)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
syscall.Close(handle)
|
|
|
}
|