@@ -22,6 +22,7 @@ import (
22
22
23
23
const (
24
24
cERROR_PIPE_BUSY = syscall .Errno (231 )
25
+ cERROR_NO_DATA = syscall .Errno (232 )
25
26
cERROR_PIPE_CONNECTED = syscall .Errno (535 )
26
27
cERROR_SEM_TIMEOUT = syscall .Errno (121 )
27
28
@@ -254,38 +255,57 @@ func (l *win32PipeListener) makeServerPipe() (*win32File, error) {
254
255
return f , nil
255
256
}
256
257
258
+ func (l * win32PipeListener ) makeConnectedServerPipe () (* win32File , error ) {
259
+ p , err := l .makeServerPipe ()
260
+ if err != nil {
261
+ return nil , err
262
+ }
263
+
264
+ // Wait for the client to connect.
265
+ ch := make (chan error )
266
+ go func (p * win32File ) {
267
+ ch <- connectPipe (p )
268
+ }(p )
269
+
270
+ select {
271
+ case err = <- ch :
272
+ if err != nil {
273
+ p .Close ()
274
+ p = nil
275
+ }
276
+ case <- l .closeCh :
277
+ // Abort the connect request by closing the handle.
278
+ p .Close ()
279
+ p = nil
280
+ err = <- ch
281
+ if err == nil || err == ErrFileClosed {
282
+ err = ErrPipeListenerClosed
283
+ }
284
+ }
285
+ return p , err
286
+ }
287
+
257
288
func (l * win32PipeListener ) listenerRoutine () {
258
289
closed := false
259
290
for ! closed {
260
291
select {
261
292
case <- l .closeCh :
262
293
closed = true
263
294
case responseCh := <- l .acceptCh :
264
- p , err := l .makeServerPipe ()
265
- if err == nil {
266
- // Wait for the client to connect.
267
- ch := make (chan error )
268
- go func (p * win32File ) {
269
- ch <- connectPipe (p )
270
- }(p )
271
- select {
272
- case err = <- ch :
273
- if err != nil {
274
- p .Close ()
275
- p = nil
276
- }
277
- case <- l .closeCh :
278
- // Abort the connect request by closing the handle.
279
- p .Close ()
280
- p = nil
281
- err = <- ch
282
- if err == nil || err == ErrFileClosed {
283
- err = ErrPipeListenerClosed
284
- }
285
- closed = true
295
+ var (
296
+ p * win32File
297
+ err error
298
+ )
299
+ for {
300
+ p , err = l .makeConnectedServerPipe ()
301
+ // If the connection was immediately closed by the client, try
302
+ // again.
303
+ if err != cERROR_NO_DATA {
304
+ break
286
305
}
287
306
}
288
307
responseCh <- acceptResponse {p , err }
308
+ closed = err == ErrPipeListenerClosed
289
309
}
290
310
}
291
311
syscall .Close (l .firstHandle )
0 commit comments