write_linux.go 1.5 KB

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