@@ -93,7 +93,6 @@ func (d *PacketFilter) Start() {
93
93
94
94
func (d * PacketFilter ) loop () {
95
95
var buf []byte
96
- next:
97
96
for {
98
97
buf = bufPool .Get ().([]byte )
99
98
n , addr , err := d .conn .ReadFrom (buf )
@@ -104,33 +103,39 @@ next:
104
103
buf : buf [:n ],
105
104
}
106
105
107
- d .mut .Lock ()
108
- conns := d .conns
109
- d .mut .Unlock ()
110
-
111
106
if err != nil {
112
- for _ , conn := range conns {
107
+ d .mut .Lock ()
108
+ for _ , conn := range d .conns {
113
109
select {
114
110
case conn .recvBuffer <- pkt :
115
111
default :
116
112
atomic .AddUint64 (& d .overflow , 1 )
117
113
}
118
114
}
115
+ d .mut .Unlock ()
119
116
return
120
117
}
121
118
122
- for _ , conn := range conns {
123
- if conn .filter == nil || conn .filter .ClaimIncoming (pkt .buf , pkt .addr ) {
124
- select {
125
- case conn .recvBuffer <- pkt :
126
- default :
127
- bufPool .Put (pkt .buf [:maxPacketSize ])
128
- atomic .AddUint64 (& d .overflow , 1 )
129
- }
130
- goto next
131
- }
119
+ d .mut .Lock ()
120
+ sent := d .sendPacketLocked (pkt )
121
+ d .mut .Unlock ()
122
+ if ! sent {
123
+ atomic .AddUint64 (& d .dropped , 1 )
132
124
}
133
125
bufPool .Put (pkt .buf [:maxPacketSize ])
134
- atomic .AddUint64 (& d .dropped , 1 )
135
126
}
136
127
}
128
+
129
+ func (d * PacketFilter ) sendPacketLocked (pkt packet ) bool {
130
+ for _ , conn := range d .conns {
131
+ if conn .filter == nil || conn .filter .ClaimIncoming (pkt .buf , pkt .addr ) {
132
+ select {
133
+ case conn .recvBuffer <- pkt :
134
+ default :
135
+ atomic .AddUint64 (& d .overflow , 1 )
136
+ }
137
+ return true
138
+ }
139
+ }
140
+ return false
141
+ }
0 commit comments