input_linux.go 1.8 KB

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