Readiness implements socket.Socket.Readiness.
(mask waiter.EventMask)
| 262 | |
| 263 | // Readiness implements socket.Socket.Readiness. |
| 264 | func (s *socketOperations) Readiness(mask waiter.EventMask) waiter.EventMask { |
| 265 | var events waiter.EventMask |
| 266 | |
| 267 | evInfo := &s.eventInfo |
| 268 | iomask := mask & (waiter.EventIn | waiter.EventOut) |
| 269 | |
| 270 | // Fast path condition: |
| 271 | // 1. The event needed has been reported by plugin stack io-thread; or |
| 272 | // 2. POLLIN or POLLOUT event has been reported by io-thread. |
| 273 | // Directly report current event without invoking cgo Readiness again. |
| 274 | if evInfo.Ready&iomask == iomask { |
| 275 | events = evInfo.Ready & mask |
| 276 | // Clear plugin stack eventInfo record after consuming IN/OUT event. |
| 277 | evInfo.Ready &= ^iomask |
| 278 | } else { |
| 279 | events = waiter.EventMask(cgo.Readiness(s.fd, uint64(mask))) |
| 280 | } |
| 281 | |
| 282 | return events |
| 283 | } |
| 284 | |
| 285 | // Epollable implements socket.Socket.Epollable. |
| 286 | func (s *socketOperations) Epollable() bool { |
no test coverage detected