1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package door
- import (
- "log"
- "strings"
- "sync/atomic"
- "syscall"
- )
- func Writer(handle int, d *Door) {
- log.Println("Writer2")
- defer d.wg.Done()
- for {
- select {
- case <-d.closeChannel:
- close(d.writerChannel)
- log.Println("~Writer")
- return
- default:
- }
- select {
- case <-d.closeChannel:
- close(d.writerChannel)
- log.Println("~Writer")
- return
- case output, ok := <-d.writerChannel:
- if !ok {
- log.Println("closeChannel")
- if !d.Disconnect() {
-
- atomic.StoreInt32(&d.Disconnected, 1)
-
-
- }
- log.Println("~Writer")
- return
-
-
- } else {
-
-
- if strings.HasSuffix(output, RestorePos) {
- output += Color(d.LastColor...)
- } else {
- d.UpdateLastColor(output, &d.LastColor)
- }
-
- buffer := []byte(output)
- n, err := syscall.Write(handle, buffer)
- if (err != nil) || (n != len(buffer)) {
- log.Println("closeChannel")
- if !d.Disconnect() {
-
- atomic.StoreInt32(&d.Disconnected, 1)
- close(d.writerChannel)
- }
- log.Println("~Writer")
- return
- }
- }
- }
- }
- }
|