input_linux.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package door
  2. import (
  3. "log"
  4. "sync/atomic"
  5. "syscall"
  6. )
  7. func Reader(handle int, d *Door) {
  8. // I don't need the select anymore. Let the read block.
  9. // defer d.wg.Done()
  10. defer func() {
  11. log.Printf("~Reader2\n")
  12. if d.ReaderCanClose {
  13. d.wg.Done()
  14. }
  15. }()
  16. defer func() {
  17. if err := recover(); err != nil {
  18. log.Printf("Reader: %#v\n", err)
  19. }
  20. }()
  21. buffer := make([]byte, 1)
  22. for {
  23. read, err := syscall.Read(handle, buffer)
  24. if err != nil {
  25. log.Printf("Reader ERR: %#v\n", err)
  26. close(d.readerChannel)
  27. if !d.Disconnect() {
  28. log.Println("Reader close writerChannel")
  29. // d.Disconnected = true
  30. atomic.StoreInt32(&d.Disconnected, 1)
  31. d.closeChannel <- true
  32. // close(d.writerChannel)
  33. return
  34. }
  35. // break
  36. return
  37. }
  38. if read == 1 {
  39. d.readerChannel <- buffer[0]
  40. } else {
  41. log.Printf("READ FAILED %d\n", read)
  42. close(d.readerChannel)
  43. if !d.Disconnect() {
  44. log.Println("Reader close writerChannel")
  45. // d.Disconnected = true
  46. atomic.StoreInt32(&d.Disconnected, 1)
  47. d.closeChannel <- true
  48. //close(d.writerChannel)
  49. return
  50. }
  51. // break
  52. return
  53. }
  54. }
  55. }
  56. /*
  57. func Reader(handle int, readerChannel *chan byte) {
  58. // I don't need the select anymore. Let the read block.
  59. defer func() {
  60. if err := recover(); err != nil {
  61. log.Printf("Reader: %#v\n", err)
  62. }
  63. }()
  64. buffer := make([]byte, 1)
  65. for {
  66. // blocking read in go routine
  67. // why doesn't this end when I close the handle?
  68. read, err := syscall.Read(handle, buffer)
  69. if err != nil {
  70. log.Printf("Reader ERR: %#v\n", err)
  71. close(*readerChannel)
  72. break
  73. }
  74. if read == 1 {
  75. *readerChannel <- buffer[0]
  76. } else {
  77. log.Printf("READ FAILED %d\n", read)
  78. close(*readerChannel)
  79. break
  80. }
  81. }
  82. }
  83. // This doesn't work. Closing the handle does not unblock the syscall.Read above.
  84. func CloseReader(handle int) {
  85. defer func() {
  86. if err := recover(); err != nil {
  87. log.Printf("CloseReader: %#v\n", err)
  88. }
  89. }()
  90. syscall.Close(handle)
  91. }
  92. */