123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- package door
- import (
- "log"
- "strings"
- "syscall"
- )
- func Writer(d *Door) {
- var handle int = d.Config.Comm_handle
- log.Println("Writer")
- defer d.wg.Done()
- var Closed bool = false
- for {
-
- select {
-
- case output, ok := <-d.writerChannel:
- if !ok {
- log.Println("closeChannel")
- d.writerMutex.Lock()
- if !d.WriterClosed {
-
- d.WriterClosed = true
-
- }
- d.writerMutex.Unlock()
-
- log.Println("~Writer")
- return
-
-
- } else {
-
-
- if output == "" {
-
-
-
- Closed = true
-
-
-
- continue
- }
- if Closed {
- log.Println("ignoring write output.")
- continue
- }
- 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")
- Closed = true
- d.writerMutex.Lock()
- if !d.WriterClosed {
- d.WriterClosed = true
-
- }
- d.writerMutex.Unlock()
-
-
-
-
-
- }
- }
- }
- }
- }
|