write_linux.go 1.7 KB

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