MCPcopy Index your code
hub / github.com/cloudwego/netpoll / handler

Method handler

poll_default_linux.go:117–219  ·  view source on GitHub ↗
(events []epollevent)

Source from the content-addressed store, hash-verified

115}
116
117func (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) {

Callers

nothing calls this directly

Calls 14

getOperatorMethod · 0.95
appendHupMethod · 0.95
onhupsMethod · 0.95
ioreadFunction · 0.85
readallFunction · 0.85
iosendFunction · 0.85
GetDataPtrMethod · 0.80
doMethod · 0.80
doneMethod · 0.80
OnReadMethod · 0.80
IsMethod · 0.80
ErrorMethod · 0.80

Tested by

no test coverage detected