]> granicus.if.org Git - python/commitdiff
Introduce a lock to fix a race condition which caused an exception in the test.
authorNeal Norwitz <nnorwitz@gmail.com>
Sun, 9 Mar 2008 19:03:42 +0000 (19:03 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Sun, 9 Mar 2008 19:03:42 +0000 (19:03 +0000)
Some buildbots were consistently failing (e.g., amd64).
Also remove a couple of semi-colons.

Lib/test/test_ssl.py

index a82aa6da187c3b7835bae0e8266366e34d390ef9..f5ae0266bce8ac89eada81d7b5cb6b497edff3ec 100644 (file)
@@ -337,6 +337,7 @@ else:
                 # we assume the certfile contains both private key and certificate
                 self.certfile = certfile
                 self.active = False
+                self.active_lock = threading.Lock()
                 self.allow_reuse_address = True
 
             def get_request (self):
@@ -361,23 +362,32 @@ else:
                 # We want this to run in a thread, so we use a slightly
                 # modified version of "forever".
                 self.active = True
-                while self.active:
+                while 1:
                     try:
-                        self.handle_request()
+                        # We need to lock while handling the request.
+                        # Another thread can close the socket after self.active
+                        # has been checked and before the request is handled.
+                        # This causes an exception when using the closed socket.
+                        with self.active_lock:
+                            if not self.active:
+                                break
+                            self.handle_request()
                     except socket.timeout:
                         pass
                     except KeyboardInterrupt:
                         self.server_close()
                         return
                     except:
-                        sys.stdout.write(''.join(traceback.format_exception(*sys.exc_info())));
+                        sys.stdout.write(''.join(traceback.format_exception(*sys.exc_info())))
+                        break
 
             def server_close(self):
                 # Again, we want this to run in a thread, so we need to override
                 # close to clear the "active" flag, so that serve_forever() will
                 # terminate.
-                HTTPServer.server_close(self)
-                self.active = False
+                with self.active_lock:
+                    HTTPServer.server_close(self)
+                    self.active = False
 
         class RootedHTTPRequestHandler(SimpleHTTPRequestHandler):
 
@@ -664,7 +674,7 @@ else:
                         not in cert['subject']):
                         raise test_support.TestFailed(
                             "Missing or invalid 'organizationName' field in certificate subject; "
-                            "should be 'Python Software Foundation'.");
+                            "should be 'Python Software Foundation'.")
                     s.close()
             finally:
                 server.stop()