write_linux.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package door
  2. import (
  3. "log"
  4. "strings"
  5. "syscall"
  6. )
  7. // https://go101.org/article/channel-closing.html
  8. func Writer(d *Door) {
  9. var handle int = d.Config.Comm_handle
  10. log.Println("Writer")
  11. defer d.wg.Done()
  12. for {
  13. /*
  14. select {
  15. case <-d.closeChannel:
  16. if !d.WriterClosed {
  17. d.WriterClosed = true
  18. close(d.writerChannel)
  19. }
  20. log.Println("~Writer")
  21. return
  22. default:
  23. }
  24. */
  25. select {
  26. /*
  27. case <-d.closeChannel:
  28. // Not safe from data races -- not synced
  29. if !d.WriterClosed {
  30. d.WriterClosed = true
  31. close(d.writerChannel)
  32. }
  33. // close(d.writerChannel)
  34. log.Println("~Writer")
  35. return
  36. */
  37. case output, ok := <-d.writerChannel:
  38. if !ok {
  39. log.Println("closeChannel")
  40. // Safe from data races, writerChannel unbuffered
  41. d.WriterClosed = true
  42. close(d.writerChannel)
  43. /*
  44. if !d.Disconnect() {
  45. // d.Disconnected = true
  46. // atomic.StoreInt32(&d.Disconnected, 1)
  47. // if !ok, the channel is already closed...
  48. // close(d.writerChannel)
  49. }
  50. */
  51. log.Println("~Writer")
  52. return
  53. // d.closeChannel <- true
  54. // continue
  55. } else {
  56. // log.Println("output")
  57. /* Handle cases where we're updating a portion of the screen.
  58. When we SavePos, also save/restore the last color set.
  59. */
  60. if output == "" {
  61. // Close Channel
  62. /*
  63. if !d.WriterClosed {
  64. d.WriterClosed = true
  65. close(d.writerChannel)
  66. }
  67. */
  68. d.SafeWriterClose()
  69. log.Println("~Writer")
  70. return
  71. }
  72. if strings.HasSuffix(output, RestorePos) {
  73. output += Color(d.LastColor...)
  74. } else {
  75. d.UpdateLastColor(output, &d.LastColor)
  76. }
  77. // log.Println("write output")
  78. buffer := []byte(output)
  79. n, err := syscall.Write(handle, buffer)
  80. if (err != nil) || (n != len(buffer)) {
  81. log.Println("closeChannel")
  82. d.SafeWriterClose()
  83. /*
  84. d.WriterClosed = true
  85. close(d.writerChannel)
  86. */
  87. /*
  88. if !d.Disconnect() {
  89. // d.Disconnected = true
  90. // atomic.StoreInt32(&d.Disconnected, 1)
  91. close(d.writerChannel)
  92. }
  93. */
  94. log.Println("~Writer")
  95. return
  96. }
  97. }
  98. }
  99. }
  100. }
  101. /*
  102. func Writer(handle int, writerChannel *chan string) {
  103. for output := range *writerChannel {
  104. buffer := []byte(output)
  105. n, err := syscall.Write(handle, buffer)
  106. if (err != nil) || (n != len(buffer)) {
  107. close(*writerChannel)
  108. break
  109. }
  110. }
  111. }
  112. */