@@ -69,6 +69,20 @@ def simple_subprocess(testcase):
69
69
testcase .assertEqual (72 << 8 , status )
70
70
71
71
72
+ def close_server (server ):
73
+ server .server_close ()
74
+
75
+ if hasattr (server , 'active_children' ):
76
+ # ForkingMixIn: Manually reap all child processes, since server_close()
77
+ # calls waitpid() in non-blocking mode using the WNOHANG flag.
78
+ for pid in server .active_children .copy ():
79
+ try :
80
+ os .waitpid (pid , 0 )
81
+ except ChildProcessError :
82
+ pass
83
+ server .active_children .clear ()
84
+
85
+
72
86
@unittest .skipUnless (threading , 'Threading required for this test.' )
73
87
class SocketServerTest (unittest .TestCase ):
74
88
"""Test all socket servers."""
@@ -118,7 +132,7 @@ def make_server(self, addr, svrcls, hdlrbase):
118
132
class MyServer (svrcls ):
119
133
def handle_error (self , request , client_address ):
120
134
self .close_request (request )
121
- self . server_close ( )
135
+ close_server ( self )
122
136
raise
123
137
124
138
class MyHandler (hdlrbase ):
@@ -158,7 +172,7 @@ def run_server(self, svrcls, hdlrbase, testfunc):
158
172
if verbose : print "waiting for server"
159
173
server .shutdown ()
160
174
t .join ()
161
- server . server_close ( )
175
+ close_server ( server )
162
176
self .assertRaises (socket .error , server .socket .fileno )
163
177
if verbose : print "done"
164
178
@@ -314,6 +328,7 @@ class MyHandler(SocketServer.StreamRequestHandler):
314
328
s .shutdown ()
315
329
for t , s in threads :
316
330
t .join ()
331
+ close_server (s )
317
332
318
333
def test_tcpserver_bind_leak (self ):
319
334
# Issue #22435: the server socket wouldn't be closed if bind()/listen()
@@ -347,7 +362,7 @@ def shutdown_request(self, request):
347
362
s .close ()
348
363
server .handle_request ()
349
364
self .assertEqual (server .shutdown_called , 1 )
350
- server . server_close ( )
365
+ close_server ( server )
351
366
352
367
353
368
def test_main ():
0 commit comments