input_linux.go 2.1 KB

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