write_linux.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package door
  2. import (
  3. "log"
  4. "strings"
  5. "sync/atomic"
  6. "syscall"
  7. )
  8. // https://go101.org/article/channel-closing.html
  9. func Writer(handle int, d *Door) {
  10. log.Println("Writer2")
  11. defer d.wg.Done()
  12. for {
  13. select {
  14. case <-d.closeChannel:
  15. close(d.writerChannel)
  16. log.Println("~Writer")
  17. return
  18. default:
  19. }
  20. select {
  21. case <-d.closeChannel:
  22. close(d.writerChannel)
  23. log.Println("~Writer")
  24. return
  25. case output, ok := <-d.writerChannel:
  26. if !ok {
  27. log.Println("closeChannel")
  28. if !d.Disconnect() {
  29. // d.Disconnected = true
  30. atomic.StoreInt32(&d.Disconnected, 1)
  31. // if !ok, the channel is already closed...
  32. // close(d.writerChannel)
  33. }
  34. log.Println("~Writer")
  35. return
  36. // d.closeChannel <- true
  37. // continue
  38. } else {
  39. // log.Println("output")
  40. /* Handle cases where we're updating a portion of the screen.
  41. When we SavePos, also save/restore the last color set.
  42. */
  43. if strings.HasSuffix(output, RestorePos) {
  44. output += Color(d.LastColor...)
  45. } else {
  46. d.UpdateLastColor(output, &d.LastColor)
  47. }
  48. // log.Println("write output")
  49. buffer := []byte(output)
  50. n, err := syscall.Write(handle, buffer)
  51. if (err != nil) || (n != len(buffer)) {
  52. log.Println("closeChannel")
  53. if !d.Disconnect() {
  54. // d.Disconnected = true
  55. atomic.StoreInt32(&d.Disconnected, 1)
  56. close(d.writerChannel)
  57. }
  58. log.Println("~Writer")
  59. return
  60. }
  61. }
  62. }
  63. }
  64. }
  65. /*
  66. func Writer(handle int, writerChannel *chan string) {
  67. for output := range *writerChannel {
  68. buffer := []byte(output)
  69. n, err := syscall.Write(handle, buffer)
  70. if (err != nil) || (n != len(buffer)) {
  71. close(*writerChannel)
  72. break
  73. }
  74. }
  75. }
  76. */