@@ -47,11 +47,6 @@ type uringPoll struct {
4747 hups []func (p Poll ) error
4848}
4949
50- type epollEvent struct {
51- events uint32
52- userdata * FDOperator
53- }
54-
5550// Wait implements Poll.
5651func (p * uringPoll ) Wait () error {
5752 // init
@@ -62,7 +57,7 @@ func (p *uringPoll) Wait() error {
6257 if n == p .size && p .size < 128 * 1024 {
6358 p .reset (p .size << 1 , caps )
6459 }
65- n : = p .uring .PeekBatchCQE (p .cqes )
60+ n = p .uring .PeekBatchCQE (p .cqes )
6661 if n == 0 {
6762 continue
6863 }
@@ -76,7 +71,7 @@ func (p *uringPoll) Wait() error {
7671// Close implements Poll.
7772func (p * uringPoll ) Close () error {
7873 var userData uint64
79- * (* * epollEvent )(unsafe .Pointer (& userData )) = & epollEvent { userdata : & FDOperator {FD : p .uring .Fd (), state : - 1 } }
74+ * (* * FDOperator )(unsafe .Pointer (& userData )) = & FDOperator {FD : p .uring .Fd (), state : - 1 }
8075 err := p .trig (userData )
8176 return err
8277}
@@ -87,46 +82,58 @@ func (p *uringPoll) Trigger() error {
8782 return nil
8883 }
8984 var userData uint64
90- * (* * epollEvent )(unsafe .Pointer (& userData )) = & epollEvent { userdata : & FDOperator {FD : p .uring .Fd ()} }
85+ * (* * FDOperator )(unsafe .Pointer (& userData )) = & FDOperator {FD : p .uring .Fd ()}
9186 err := p .trig (userData )
9287 return err
9388}
9489
9590// Control implements Poll.
96- func (p * uringPoll ) Control (operator * FDOperator , event PollEvent ) error {
97- var op Op
91+ func (p * uringPoll ) Control (operator * FDOperator , event PollEvent ) ( err error ) {
92+ var ctlOp , pollOp Op
9893 var userData uint64
99- evt := & epollEvent {}
94+ var evt epollevent
95+ * (* * FDOperator )(unsafe .Pointer (& evt .data )) = operator
10096 switch event {
10197 case PollReadable :
10298 operator .inuse ()
103- evt .userdata , evt .events = operator , syscall .EPOLLIN | syscall .EPOLLRDHUP | syscall .EPOLLERR
104- op = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_ADD , unsafe .Pointer (& evt ))
99+ evt .events = syscall .EPOLLIN | syscall .EPOLLRDHUP | syscall .EPOLLERR
100+ ctlOp = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_ADD , unsafe .Pointer (& evt ))
101+ pollOp = PollAdd (uintptr (operator .FD ), evt .events )
105102 case PollModReadable :
106103 operator .inuse ()
107- evt .userdata , evt .events = operator , syscall .EPOLLIN | syscall .EPOLLRDHUP | syscall .EPOLLERR
108- op = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_MOD , unsafe .Pointer (& evt ))
104+ evt .events = syscall .EPOLLIN | syscall .EPOLLRDHUP | syscall .EPOLLERR
105+ ctlOp = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_MOD , unsafe .Pointer (& evt ))
106+ pollOp = PollAdd (uintptr (operator .FD ), evt .events )
109107 case PollDetach :
110- evt .userdata , evt .events = operator , syscall .EPOLLIN | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR
111- op = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_DEL , unsafe .Pointer (& evt ))
108+ evt .events = syscall .EPOLLIN | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR
109+ ctlOp = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_DEL , unsafe .Pointer (& evt ))
110+ pollOp = PollAdd (uintptr (operator .FD ), evt .events )
112111 case PollWritable :
113112 operator .inuse ()
114- evt .userdata , evt .events = operator , EPOLLET | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR
115- op = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_ADD , unsafe .Pointer (& evt ))
113+ evt .events = EPOLLET | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR
114+ ctlOp = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_ADD , unsafe .Pointer (& evt ))
115+ pollOp = PollAdd (uintptr (operator .FD ), evt .events )
116116 case PollR2RW :
117- evt .userdata , evt .events = operator , syscall .EPOLLIN | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR
118- op = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_MOD , unsafe .Pointer (& evt ))
117+ evt .events = syscall .EPOLLIN | syscall .EPOLLOUT | syscall .EPOLLRDHUP | syscall .EPOLLERR
118+ ctlOp = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_MOD , unsafe .Pointer (& evt ))
119+ pollOp = PollAdd (uintptr (operator .FD ), evt .events )
119120 case PollRW2R :
120- evt .userdata , evt .events = operator , syscall .EPOLLIN | syscall .EPOLLRDHUP | syscall .EPOLLERR
121- op = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_MOD , unsafe .Pointer (& evt ))
121+ evt .events = syscall .EPOLLIN | syscall .EPOLLRDHUP | syscall .EPOLLERR
122+ ctlOp = URingEpollCtl (uintptr (operator .FD ), uintptr (p .uring .Fd ()), syscall .EPOLL_CTL_MOD , unsafe .Pointer (& evt ))
123+ pollOp = PollAdd (uintptr (operator .FD ), evt .events )
122124 }
123125
124- * (* * epollEvent )(unsafe .Pointer (& userData )) = evt
126+ * (* * FDOperator )(unsafe .Pointer (& userData )) = operator
125127
126- err : = p .uring .Queue (op , 0 , userData )
128+ err = p .uring .Queue (pollOp , 0 , userData )
127129 if err != nil {
128130 panic (err )
129131 }
132+ err = p .uring .Queue (ctlOp , 0 , userData )
133+ if err != nil {
134+ panic (err )
135+ }
136+
130137 _ , err = p .uring .Submit ()
131138 return err
132139}
@@ -142,9 +149,7 @@ func (p *uringPoll) reset(size, caps int) {
142149
143150func (p * uringPoll ) handler (cqes []* URingCQE ) (closed bool ) {
144151 for i := range cqes {
145- var epoll = * (* * epollEvent )(unsafe .Pointer (& cqes [i ].UserData ))
146- var operator = epoll .userdata
147-
152+ var operator = * (* * FDOperator )(unsafe .Pointer (& cqes [i ].UserData ))
148153 // trigger or exit gracefully
149154 if operator .FD == p .uring .Fd () {
150155 // must clean trigger first
@@ -162,7 +167,7 @@ func (p *uringPoll) handler(cqes []*URingCQE) (closed bool) {
162167 continue
163168 }
164169
165- var events = epoll . events
170+ var events = cqes [ i ]. Res
166171 // check poll in
167172 if events & syscall .EPOLLIN != 0 {
168173 if operator .OnRead != nil {
0 commit comments