@@ -24,20 +24,18 @@ const (
2424)
2525
2626type PacketReactor struct {
27- ctx context.Context
28- cancel context.CancelFunc
29- channelPoller * ChannelPoller
30- fdPoller * FDPoller
31- fdPollerOnce sync.Once
32- fdPollerErr error
27+ ctx context.Context
28+ cancel context.CancelFunc
29+ fdPoller * FDPoller
30+ fdPollerOnce sync.Once
31+ fdPollerErr error
3332}
3433
3534func NewPacketReactor (ctx context.Context ) * PacketReactor {
3635 ctx , cancel := context .WithCancel (ctx )
3736 return & PacketReactor {
38- ctx : ctx ,
39- cancel : cancel ,
40- channelPoller : NewChannelPoller (ctx ),
37+ ctx : ctx ,
38+ cancel : cancel ,
4139 }
4240}
4341
@@ -50,14 +48,10 @@ func (r *PacketReactor) getFDPoller() (*FDPoller, error) {
5048
5149func (r * PacketReactor ) Close () error {
5250 r .cancel ()
53- var errs []error
54- if r .channelPoller != nil {
55- errs = append (errs , r .channelPoller .Close ())
56- }
5751 if r .fdPoller != nil {
58- errs = append ( errs , r .fdPoller .Close () )
52+ return r .fdPoller .Close ()
5953 }
60- return E . Errors ( errs ... )
54+ return nil
6155}
6256
6357type reactorConnection struct {
@@ -80,6 +74,7 @@ type reactorStream struct {
8074 destination N.PacketWriter
8175 originSource N.PacketReader
8276
77+ pushable N.PacketPushable
8378 pollable N.PacketPollable
8479 options N.ReadWaitOptions
8580 readWaiter N.PacketReadWaiter
@@ -159,7 +154,9 @@ func (r *PacketReactor) prepareStream(conn *reactorConnection, source N.PacketRe
159154 stream .readWaiter .InitializeReadWaiter (stream .options )
160155 }
161156
162- if pollable , ok := source .(N.PacketPollable ); ok {
157+ if pushable , ok := source .(N.PacketPushable ); ok {
158+ stream .pushable = pushable
159+ } else if pollable , ok := source .(N.PacketPollable ); ok {
163160 stream .pollable = pollable
164161 } else if creator , ok := source .(N.PacketPollableCreator ); ok {
165162 stream .pollable , _ = creator .CreatePacketPollable ()
@@ -169,25 +166,32 @@ func (r *PacketReactor) prepareStream(conn *reactorConnection, source N.PacketRe
169166}
170167
171168func (r * PacketReactor ) registerStream (stream * reactorStream ) {
169+ if stream .pushable != nil {
170+ stream .pushable .SetOnDataReady (func () {
171+ if stream .state .CompareAndSwap (stateIdle , stateActive ) {
172+ go stream .runActiveLoop (nil )
173+ }
174+ })
175+ if stream .pushable .HasPendingData () {
176+ if stream .state .CompareAndSwap (stateIdle , stateActive ) {
177+ go stream .runActiveLoop (nil )
178+ }
179+ }
180+ return
181+ }
182+
172183 if stream .pollable == nil {
173184 go stream .runLegacyCopy ()
174185 return
175186 }
176187
177- switch stream .pollable .PollMode () {
178- case N .PacketPollModeChannel :
179- r .channelPoller .Add (stream , stream .pollable .PacketChannel ())
180- case N .PacketPollModeFD :
181- fdPoller , err := r .getFDPoller ()
182- if err != nil {
183- go stream .runLegacyCopy ()
184- return
185- }
186- err = fdPoller .Add (stream , stream .pollable .FD ())
187- if err != nil {
188- go stream .runLegacyCopy ()
189- }
190- default :
188+ fdPoller , err := r .getFDPoller ()
189+ if err != nil {
190+ go stream .runLegacyCopy ()
191+ return
192+ }
193+ err = fdPoller .Add (stream , stream .pollable .FD ())
194+ if err != nil {
191195 go stream .runLegacyCopy ()
192196 }
193197}
@@ -259,9 +263,18 @@ func (s *reactorStream) runActiveLoop(firstPacket *N.PacketBuffer) {
259263 if setter , ok := s .source .(interface { SetReadDeadline (time.Time ) error }); ok {
260264 setter .SetReadDeadline (time.Time {})
261265 }
262- if s .state .CompareAndSwap (stateActive , stateIdle ) {
263- s .returnToPool ()
266+ if ! s .state .CompareAndSwap (stateActive , stateIdle ) {
267+ return
268+ }
269+ if s .pushable != nil {
270+ if s .pushable .HasPendingData () {
271+ if s .state .CompareAndSwap (stateIdle , stateActive ) {
272+ continue
273+ }
274+ }
275+ return
264276 }
277+ s .returnToPool ()
265278 return
266279 }
267280 if ! notFirstTime {
@@ -310,30 +323,18 @@ func (s *reactorStream) returnToPool() {
310323 return
311324 }
312325
313- if s .pollable == nil {
326+ if s .pollable == nil || s . connection . reactor . fdPoller == nil {
314327 return
315328 }
316329
317- switch s .pollable .PollMode () {
318- case N .PacketPollModeChannel :
319- channel := s .pollable .PacketChannel ()
320- s .connection .reactor .channelPoller .Add (s , channel )
321- if s .state .Load () != stateIdle {
322- s .connection .reactor .channelPoller .Remove (channel )
323- }
324- case N .PacketPollModeFD :
325- if s .connection .reactor .fdPoller == nil {
326- return
327- }
328- fd := s .pollable .FD ()
329- err := s .connection .reactor .fdPoller .Add (s , fd )
330- if err != nil {
331- s .closeWithError (err )
332- return
333- }
334- if s .state .Load () != stateIdle {
335- s .connection .reactor .fdPoller .Remove (fd )
336- }
330+ fd := s .pollable .FD ()
331+ err := s .connection .reactor .fdPoller .Add (s , fd )
332+ if err != nil {
333+ s .closeWithError (err )
334+ return
335+ }
336+ if s .state .Load () != stateIdle {
337+ s .connection .reactor .fdPoller .Remove (fd )
337338 }
338339}
339340
@@ -385,15 +386,8 @@ func (c *reactorConnection) removeFromPollers() {
385386}
386387
387388func (c * reactorConnection ) removeStreamFromPoller (stream * reactorStream ) {
388- if stream == nil || stream .pollable == nil {
389+ if stream == nil || stream .pollable == nil || c . reactor . fdPoller == nil {
389390 return
390391 }
391- switch stream .pollable .PollMode () {
392- case N .PacketPollModeChannel :
393- c .reactor .channelPoller .Remove (stream .pollable .PacketChannel ())
394- case N .PacketPollModeFD :
395- if c .reactor .fdPoller != nil {
396- c .reactor .fdPoller .Remove (stream .pollable .FD ())
397- }
398- }
392+ c .reactor .fdPoller .Remove (stream .pollable .FD ())
399393}
0 commit comments