|
@@ -1,16 +1,77 @@
|
|
-package door
|
|
|
|
-
|
|
|
|
-import (
|
|
|
|
- "syscall"
|
|
|
|
-)
|
|
|
|
-
|
|
|
|
-func Writer(handle int, writerChannel *chan string) {
|
|
|
|
- for output := range *writerChannel {
|
|
|
|
- buffer := []byte(output)
|
|
|
|
- n, err := syscall.Write(handle, buffer)
|
|
|
|
- if (err != nil) || (n != len(buffer)) {
|
|
|
|
- close(*writerChannel)
|
|
|
|
- break
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
|
|
+package door
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "log"
|
|
|
|
+ "strings"
|
|
|
|
+ "syscall"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// https://go101.org/article/channel-closing.html
|
|
|
|
+func Writer2(handle int, d *Door) {
|
|
|
|
+ log.Println("Writer2")
|
|
|
|
+ defer d.wg.Done()
|
|
|
|
+ for {
|
|
|
|
+ select {
|
|
|
|
+ case <-d.closeChannel:
|
|
|
|
+ // close((*d).writerChannel)
|
|
|
|
+ log.Println("~Writer2")
|
|
|
|
+ return
|
|
|
|
+ default:
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ select {
|
|
|
|
+ case <-d.closeChannel:
|
|
|
|
+ // close((*d).writerChannel)
|
|
|
|
+ log.Println("~Writer2")
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ case output, ok := <-d.writerChannel:
|
|
|
|
+ if !ok {
|
|
|
|
+ // (*d).writerChannel = nil
|
|
|
|
+ log.Println("closeChannel")
|
|
|
|
+ // close(d.closeChannel)
|
|
|
|
+ d.Disconnected = true
|
|
|
|
+ close(d.writerChannel)
|
|
|
|
+ log.Println("~Writer2")
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+// d.closeChannel <- true
|
|
|
|
+// continue
|
|
|
|
+ } else {
|
|
|
|
+ // log.Println("output")
|
|
|
|
+ if strings.HasSuffix(output, RestorePos) {
|
|
|
|
+ output += Color(d.LastColor...)
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ d.UpdateLastColor(output, &d.LastColor)
|
|
|
|
+ }
|
|
|
|
+ // log.Println("write output")
|
|
|
|
+ buffer := []byte(output)
|
|
|
|
+ n, err := syscall.Write(handle, buffer)
|
|
|
|
+ if (err != nil) || (n != len(buffer)) {
|
|
|
|
+ // close((*d).writerChannel)
|
|
|
|
+ // (*d).writerChannel = nil
|
|
|
|
+ log.Println("closeChannel")
|
|
|
|
+ // close(d.closeChannel)
|
|
|
|
+ d.Disconnected = true
|
|
|
|
+ close(d.writerChannel)
|
|
|
|
+ log.Println("~Writer2")
|
|
|
|
+ return
|
|
|
|
+// d.closeChannel <- true
|
|
|
|
+// continue
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func Writer(handle int, writerChannel *chan string) {
|
|
|
|
+ for output := range *writerChannel {
|
|
|
|
+ buffer := []byte(output)
|
|
|
|
+ n, err := syscall.Write(handle, buffer)
|
|
|
|
+ if (err != nil) || (n != len(buffer)) {
|
|
|
|
+ close(*writerChannel)
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|