(events []epollevent)
| 115 | } |
| 116 | |
| 117 | func (p *defaultPoll) handler(events []epollevent) (closed bool) { |
| 118 | var triggerRead, triggerWrite, triggerHup, triggerError bool |
| 119 | var err error |
| 120 | for i := range events { |
| 121 | operator := p.getOperator(0, events[i].GetDataPtr()) |
| 122 | if operator == nil || !operator.do() { |
| 123 | continue |
| 124 | } |
| 125 | |
| 126 | var totalRead int |
| 127 | evt := events[i].Events |
| 128 | triggerRead = evt&syscall.EPOLLIN != 0 |
| 129 | triggerWrite = evt&syscall.EPOLLOUT != 0 |
| 130 | triggerHup = evt&(syscall.EPOLLHUP|syscall.EPOLLRDHUP) != 0 |
| 131 | triggerError = evt&syscall.EPOLLERR != 0 |
| 132 | |
| 133 | // trigger or exit gracefully |
| 134 | if operator.FD == p.wop.FD { |
| 135 | // must clean trigger first |
| 136 | syscall.Read(p.wop.FD, p.buf) |
| 137 | atomic.StoreUint32(&p.trigger, 0) |
| 138 | // if closed & exit |
| 139 | if p.buf[0] > 0 { |
| 140 | syscall.Close(p.wop.FD) |
| 141 | syscall.Close(p.fd) |
| 142 | operator.done() |
| 143 | return true |
| 144 | } |
| 145 | operator.done() |
| 146 | continue |
| 147 | } |
| 148 | |
| 149 | if triggerRead { |
| 150 | if operator.OnRead != nil { |
| 151 | // for non-connection |
| 152 | operator.OnRead(p) |
| 153 | } else if operator.Inputs != nil { |
| 154 | // for connection |
| 155 | bs := operator.Inputs(p.barriers[i].bs) |
| 156 | if len(bs) > 0 { |
| 157 | n, err := ioread(operator.FD, bs, p.barriers[i].ivs) |
| 158 | operator.InputAck(n) |
| 159 | totalRead += n |
| 160 | if err != nil { |
| 161 | p.appendHup(operator) |
| 162 | continue |
| 163 | } |
| 164 | } |
| 165 | } else { |
| 166 | logger.Printf("NETPOLL: operator has critical problem! event=%d operator=%v", evt, operator) |
| 167 | } |
| 168 | } |
| 169 | if triggerHup { |
| 170 | if triggerRead && operator.Inputs != nil { |
| 171 | // read all left data if peer send and close |
| 172 | var leftRead int |
| 173 | // read all left data if peer send and close |
| 174 | if leftRead, err = readall(operator, p.barriers[i]); err != nil && !errors.Is(err, ErrEOF) { |
nothing calls this directly
no test coverage detected