write_linux.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. var Closed bool = false
  13. for {
  14. /*
  15. select {
  16. case <-d.closeChannel:
  17. if !d.WriterClosed {
  18. d.WriterClosed = true
  19. close(d.writerChannel)
  20. }
  21. log.Println("~Writer")
  22. return
  23. default:
  24. }
  25. */
  26. select {
  27. /*
  28. case <-d.closeChannel:
  29. // Not safe from data races -- not synced
  30. if !d.WriterClosed {
  31. d.WriterClosed = true
  32. close(d.writerChannel)
  33. }
  34. // close(d.writerChannel)
  35. log.Println("~Writer")
  36. return
  37. */
  38. case output, ok := <-d.writerChannel:
  39. if !ok {
  40. log.Println("closeChannel")
  41. d.writerMutex.Lock()
  42. if !d.WriterClosed {
  43. // Safe from data races, writerChannel unbuffered
  44. d.WriterClosed = true
  45. // close(d.writerChannel)
  46. }
  47. d.writerMutex.Unlock()
  48. /*
  49. if !d.Disconnect() {
  50. // d.Disconnected = true
  51. // atomic.StoreInt32(&d.Disconnected, 1)
  52. // if !ok, the channel is already closed...
  53. // close(d.writerChannel)
  54. }
  55. */
  56. log.Println("~Writer")
  57. return
  58. // d.closeChannel <- true
  59. // continue
  60. } else {
  61. // log.Println("output")
  62. /* Handle cases where we're updating a portion of the screen.
  63. When we SavePos, also save/restore the last color set.
  64. */
  65. if output == "" {
  66. // Close Channel
  67. /*
  68. if !d.WriterClosed {
  69. d.WriterClosed = true
  70. close(d.writerChannel)
  71. }
  72. */
  73. /*
  74. d.writerMutex.Lock()
  75. if !d.WriterClosed {
  76. d.WriterClosed = true
  77. close(d.writerChannel)
  78. //
  79. }
  80. */
  81. Closed = true
  82. // d.SafeWriterClose()
  83. // log.Println("~Writer")
  84. // return
  85. continue
  86. }
  87. if Closed {
  88. log.Println("ignoring write output.")
  89. continue
  90. }
  91. if strings.HasSuffix(output, RestorePos) {
  92. output += Color(d.LastColor...)
  93. } else {
  94. d.UpdateLastColor(output, &d.LastColor)
  95. }
  96. // log.Println("write output")
  97. buffer := []byte(output)
  98. n, err := syscall.Write(handle, buffer)
  99. if (err != nil) || (n != len(buffer)) {
  100. log.Println("closeChannel")
  101. Closed = true
  102. d.writerMutex.Lock()
  103. if !d.WriterClosed {
  104. d.WriterClosed = true
  105. // close(d.writerChannel)
  106. }
  107. d.writerMutex.Unlock()
  108. //d.SafeWriterClose()
  109. /*
  110. d.WriterClosed = true
  111. close(d.writerChannel)
  112. */
  113. /*
  114. if !d.Disconnect() {
  115. // d.Disconnected = true
  116. // atomic.StoreInt32(&d.Disconnected, 1)
  117. close(d.writerChannel)
  118. }
  119. */
  120. // log.Println("~Writer")
  121. // return
  122. }
  123. }
  124. }
  125. }
  126. }
  127. /*
  128. func Writer(handle int, writerChannel *chan string) {
  129. for output := range *writerChannel {
  130. buffer := []byte(output)
  131. n, err := syscall.Write(handle, buffer)
  132. if (err != nil) || (n != len(buffer)) {
  133. close(*writerChannel)
  134. break
  135. }
  136. }
  137. }
  138. */