@@ -35,15 +35,16 @@ import (
35
35
)
36
36
37
37
type eventloop struct {
38
- ln * listener // listener
39
- idx int // loop index in the server loops list
40
- svr * server // server in loop
41
- poller * netpoll.Poller // epoll or kqueue
42
- buffer []byte // read packet buffer whose capacity is set by user, default value is 64KB
43
- connCount int32 // number of active connections in event-loop
44
- udpSockets map [int ]* conn // UDP socket map: fd -> conn
45
- connections map [int ]* conn // TCP connection map: fd -> conn
46
- eventHandler EventHandler // user eventHandler
38
+ ln * listener // listener
39
+ idx int // loop index in the server loops list
40
+ svr * server // server in loop
41
+ poller * netpoll.Poller // epoll or kqueue
42
+ buffer []byte // read packet buffer whose capacity is set by user, default value is 64KB
43
+ connCount int32 // number of active connections in event-loop
44
+ connections map [int ]* conn // TCP connection map: fd -> conn
45
+ eventHandler EventHandler // user eventHandler
46
+ clientUDPSockets map [int ]* conn // client-side UDP socket map: fd -> conn
47
+ serverUDPSockets map [unix.Sockaddr ]* conn // server-side UDP socket map: Sockaddr -> conn
47
48
}
48
49
49
50
func (el * eventloop ) getLogger () logging.Logger {
@@ -58,11 +59,17 @@ func (el *eventloop) loadConn() int32 {
58
59
return atomic .LoadInt32 (& el .connCount )
59
60
}
60
61
61
- func (el * eventloop ) closeAllConns () {
62
+ func (el * eventloop ) closeAllSockets () {
62
63
// Close loops and all outstanding connections
63
64
for _ , c := range el .connections {
64
65
_ = el .loopCloseConn (c , nil )
65
66
}
67
+ for _ , c := range el .clientUDPSockets {
68
+ c .releaseUDP ()
69
+ }
70
+ for _ , c := range el .serverUDPSockets {
71
+ c .releaseUDP ()
72
+ }
66
73
}
67
74
68
75
func (el * eventloop ) loopRegister (itf interface {}) error {
@@ -76,7 +83,7 @@ func (el *eventloop) loopRegister(itf interface{}) error {
76
83
c .releaseUDP ()
77
84
return err
78
85
}
79
- el .udpSockets [c .fd ] = c
86
+ el .clientUDPSockets [c .fd ] = c
80
87
return nil
81
88
}
82
89
if err := el .poller .AddRead (c .pollAttachment ); err != nil {
@@ -277,11 +284,15 @@ func (el *eventloop) loopReadUDP(fd int) error {
277
284
return fmt .Errorf ("failed to read UDP packet from fd=%d in event-loop(%d), %v" ,
278
285
fd , el .idx , os .NewSyscallError ("recvfrom" , err ))
279
286
}
280
- c := el .udpSockets [fd ]
281
- var oneOff bool
282
- if c == nil {
283
- c = newUDPConn (fd , el , el .ln .lnaddr , sa , false )
284
- oneOff = true
287
+ var c * conn
288
+ if fd == el .ln .fd {
289
+ c = el .serverUDPSockets [sa ]
290
+ if c == nil {
291
+ c = newUDPConn (fd , el , el .ln .lnaddr , sa , false )
292
+ el .serverUDPSockets [sa ] = c
293
+ }
294
+ } else {
295
+ c = el .clientUDPSockets [fd ]
285
296
}
286
297
out , action := el .eventHandler .React (el .buffer [:n ], c )
287
298
if out != nil {
@@ -290,9 +301,5 @@ func (el *eventloop) loopReadUDP(fd int) error {
290
301
if action == Shutdown {
291
302
return gerrors .ErrServerShutdown
292
303
}
293
- if oneOff {
294
- c .releaseUDP ()
295
- }
296
-
297
304
return nil
298
305
}
0 commit comments