input_linux.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package door
  2. import (
  3. "log"
  4. "syscall"
  5. "time"
  6. )
  7. var ReaderInterval = time.Duration(200) * time.Millisecond
  8. var ReaderTimeval syscall.Timeval = syscall.Timeval{0, 200}
  9. func clearAll(fdSetPtr *syscall.FdSet) {
  10. for index := range (*fdSetPtr).Bits {
  11. (*fdSetPtr).Bits[index] = 0
  12. }
  13. }
  14. func set(fdSetPtr *syscall.FdSet, fd int) {
  15. (*fdSetPtr).Bits[fd/64] |= 1 << uint64(fd%64)
  16. }
  17. func Reader(d *Door) {
  18. // I need non-blocking reads here.
  19. // I'm not really using either of these things.
  20. // d.readerFile = os.NewFile(uintptr(d.READFD), "Door FD")
  21. // d.runereader = bufio.NewReaderSize(d.readerFile, 1)
  22. defer func() {
  23. log.Printf("~Reader\n")
  24. if d.ReaderCanClose {
  25. d.wg.Done()
  26. }
  27. }()
  28. defer func() {
  29. if err := recover(); err != nil {
  30. log.Printf("Reader: %#v\n", err)
  31. }
  32. }()
  33. var fdset syscall.FdSet
  34. for {
  35. clearAll(&fdset)
  36. set(&fdset, d.READFD)
  37. v, err := syscall.Select(d.READFD+1, &fdset, nil, nil, &ReaderTimeval)
  38. if err == syscall.EINTR {
  39. continue
  40. }
  41. // log.Printf("Select: %#v / %#v\n", v, err)
  42. if v == -1 {
  43. log.Printf("Reader ERR: %#v\n", err)
  44. d.readerMutex.Lock()
  45. if !d.ReaderClosed {
  46. d.ReaderClosed = true
  47. close(d.readerChannel)
  48. }
  49. return
  50. }
  51. if v == 0 {
  52. // timeout
  53. continue
  54. }
  55. // d.readerFile.SetReadDeadline(time.Now().Add(ReaderInterval))
  56. // not on a os.File you won't. :P
  57. // r, _, err := d.runereader.ReadRune()
  58. buffer := make([]byte, 1)
  59. r, err := syscall.Read(d.READFD, buffer)
  60. if r == -1 {
  61. log.Println("Read -1 (closed)")
  62. d.readerMutex.Lock()
  63. defer d.readerMutex.Unlock()
  64. if !d.ReaderClosed {
  65. d.ReaderClosed = true
  66. d.Disconnected = true
  67. close(d.readerChannel)
  68. }
  69. return
  70. }
  71. if r != 1 {
  72. log.Printf("Select said ready, but: %#v %#v\n", r, err)
  73. d.readerMutex.Lock()
  74. defer d.readerMutex.Unlock()
  75. if !d.ReaderClosed {
  76. d.ReaderClosed = true
  77. d.Disconnected = true
  78. close(d.readerChannel)
  79. }
  80. return
  81. }
  82. if DEBUG_INPUT {
  83. log.Printf("Reader (byte): %#v\n", buffer[0])
  84. }
  85. d.readerChannel <- rune(buffer[0])
  86. /*
  87. if r == unicode.ReplacementChar {
  88. _ = d.runereader.UnreadRune()
  89. b, _ := d.runereader.ReadByte()
  90. if DEBUG_INPUT {
  91. log.Printf("Reader (byte): %#v\n", b)
  92. }
  93. d.readerChannel <- rune(b)
  94. continue
  95. }
  96. if err == nil {
  97. if DEBUG_INPUT {
  98. log.Printf("Reader (rune): %#v\n", r)
  99. }
  100. d.readerChannel <- r
  101. continue
  102. }
  103. */
  104. // I'm not sure I care what the error is we're getting here...
  105. /*
  106. if e, ok := err.(net.Error); ok && e.Timeout() {
  107. } else {
  108. }
  109. */
  110. /*
  111. log.Printf("Reader ERR: %#v\n", err)
  112. d.ReaderClosed = true
  113. close(d.readerChannel)
  114. return
  115. */
  116. }
  117. }
  118. /*
  119. func Reader(handle int, readerChannel *chan byte) {
  120. // I don't need the select anymore. Let the read block.
  121. defer func() {
  122. if err := recover(); err != nil {
  123. log.Printf("Reader: %#v\n", err)
  124. }
  125. }()
  126. buffer := make([]byte, 1)
  127. for {
  128. // blocking read in go routine
  129. // why doesn't this end when I close the handle?
  130. read, err := syscall.Read(handle, buffer)
  131. if err != nil {
  132. log.Printf("Reader ERR: %#v\n", err)
  133. close(*readerChannel)
  134. break
  135. }
  136. if read == 1 {
  137. *readerChannel <- buffer[0]
  138. } else {
  139. log.Printf("READ FAILED %d\n", read)
  140. close(*readerChannel)
  141. break
  142. }
  143. }
  144. }
  145. // This doesn't work. Closing the handle does not unblock the syscall.Read above.
  146. func CloseReader(handle int) {
  147. defer func() {
  148. if err := recover(); err != nil {
  149. log.Printf("CloseReader: %#v\n", err)
  150. }
  151. }()
  152. syscall.Close(handle)
  153. }
  154. */