[svn] commit: r3149 - in /branches/trac352/src: bin/cmdctl/cmdctl.py.in bin/xfrout/xfrout.py.in lib/python/isc/utils/serve_mixin.py lib/python/isc/utils/tests/serve_mixin_test.py

BIND 10 source code commits bind10-changes at lists.isc.org
Sat Oct 9 03:22:09 UTC 2010


Author: zhanglikun
Date: Sat Oct  9 03:22:09 2010
New Revision: 3149

Log:
Change the code according jinmei's review result in trac352: 1. change class ServeMixIn's class variables to instance variable. 2. change 'localhost' to '127.0.0.1' to avoid undesireable block. 3. add some documentation for class ServeMixIn.

Modified:
    branches/trac352/src/bin/cmdctl/cmdctl.py.in
    branches/trac352/src/bin/xfrout/xfrout.py.in
    branches/trac352/src/lib/python/isc/utils/serve_mixin.py
    branches/trac352/src/lib/python/isc/utils/tests/serve_mixin_test.py

Modified: branches/trac352/src/bin/cmdctl/cmdctl.py.in
==============================================================================
--- branches/trac352/src/bin/cmdctl/cmdctl.py.in (original)
+++ branches/trac352/src/bin/cmdctl/cmdctl.py.in Sat Oct  9 03:22:09 2010
@@ -441,7 +441,9 @@
 
         return (keyfile, certfile, accountsfile)
 
-class SecureHTTPServer(serve_mixin.ServeMixIn, socketserver.ThreadingMixIn, http.server.HTTPServer):
+class SecureHTTPServer(serve_mixin.ServeMixIn, 
+                       socketserver.ThreadingMixIn, 
+                       http.server.HTTPServer):
     '''Make the server address can be reused.'''
     allow_reuse_address = True
 
@@ -449,6 +451,7 @@
                  CommandControlClass,
                  idle_timeout = 1200, verbose = False):
         '''idle_timeout: the max idle time for login'''
+        serve_mixin.ServeMixIn.__init__(self)
         try:
             http.server.HTTPServer.__init__(self, server_address, RequestHandlerClass)
         except socket.error as err:

Modified: branches/trac352/src/bin/xfrout/xfrout.py.in
==============================================================================
--- branches/trac352/src/bin/xfrout/xfrout.py.in (original)
+++ branches/trac352/src/bin/xfrout/xfrout.py.in Sat Oct  9 03:22:09 2010
@@ -297,6 +297,7 @@
     def __init__(self, sock_file, handle_class, shutdown_event, config_data, cc, log):
         self._remove_unused_sock_file(sock_file)
         self._sock_file = sock_file
+        serve_mixin.ServeMixIn.__init__(self)
         ThreadingUnixStreamServer.__init__(self, sock_file, handle_class)
         self._lock = threading.Lock()
         self._transfers_counter = 0

Modified: branches/trac352/src/lib/python/isc/utils/serve_mixin.py
==============================================================================
--- branches/trac352/src/lib/python/isc/utils/serve_mixin.py (original)
+++ branches/trac352/src/lib/python/isc/utils/serve_mixin.py Sat Oct  9 03:22:09 2010
@@ -17,44 +17,54 @@
 import socket
 import select
 
+SOCK_DATA = b'somedata'
 class ServeMixIn:
     '''Mix-In class to override the function serve_forever()
-    and shutdown() in class socketserver. 
+    and shutdown() in class socketserver.TCPServer. 
+      ServeMixIn should be used together with socketserver.TCPServer
+    or some derived classes of it, and ServeMixIn must be the first 
+    base class in multiple inheritance, eg. MyClass(ServeMixIn, 
+    socketserver.TCPServer). ServeMixIn.__init__() should be called
+    explicitely in derived class.
     '''
-    _serving = False
-    _is_shut_down = threading.Event()
-    _read_sock, _write_sock = socket.socketpair()
+    def __init__(self):
+        self.__serving = False
+        self.__is_shut_down = threading.Event()
+        self.__read_sock, self.__write_sock = socket.socketpair()
 
     def serve_forever(self, poll_interval=0.5):
-        ''' Override the serve_forever() in class BaseServer.
-        use one socket pair to wake up the select when shutdown()
-        is called in anther thread.
+        ''' Override the serve_forever([poll_interval]) in class 
+        socketserver.TCPServer. use one socket pair to wake up 
+        the select when shutdown() is called in anther thread.
+          Note, parameter 'poll_interval' is just used to keep the
+        interface, it's never used in this function.
         '''        
-        self._serving = True
-        self._is_shut_down.clear()
-        while self._serving:
-            # block until the self.socket or self._read_sock is readable 
+        self.__serving = True
+        self.__is_shut_down.clear()
+        while self.__serving:
+            # block until the self.socket or self.__read_sock is readable 
             try:
-                r, w, e = select.select([self, self._read_sock], [], [])
+                r, w, e = select.select([self, self.__read_sock], [], [])
             except select.error as err:
                 if err.args[0] != EINTR:
                     raise
                 else:
                     continue
             if r:
-                if self._read_sock in r:
+                if (self.__read_sock in r) and \
+                   (self.__read_sock.recv(len(SOCK_DATA)) == SOCK_DATA):
                     break
                 else:
                     self._handle_request_noblock()
 
-        self._is_shut_down.set()
+        self.__is_shut_down.set()
 
     def shutdown(self):
         '''Stops the serve_forever loop.
         Blocks until the loop has finished, the function should be called
         in another thread when serve_forever is running, or it will block.
         '''
-        self._serving = False
-        self._write_sock.send(b'anydata') # make self._read_sock readable.
-        self._is_shut_down.wait()
+        self.__serving = False
+        self.__write_sock.send(SOCK_DATA) # make self.__read_sock readable.
+        self.__is_shut_down.wait()
 

Modified: branches/trac352/src/lib/python/isc/utils/tests/serve_mixin_test.py
==============================================================================
--- branches/trac352/src/lib/python/isc/utils/tests/serve_mixin_test.py (original)
+++ branches/trac352/src/lib/python/isc/utils/tests/serve_mixin_test.py Sat Oct  9 03:22:09 2010
@@ -28,8 +28,10 @@
 class MyServer(ServeMixIn, 
                socketserver.ThreadingMixIn,
                socketserver.TCPServer):
-    pass
 
+    def __init__(self, server_addr, handler_class):
+        ServeMixIn.__init__(self)
+        socketserver.TCPServer.__init__(self, server_addr, handler_class)
 
 def send_and_get_reply(ip, port, msg):
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -42,7 +44,7 @@
 class TestServeMixIn(unittest.TestCase):
     def test_serve_forever(self):
         # use port 0 to select an arbitrary unused port.
-        server = MyServer(('localhost', 0), MyHandler)
+        server = MyServer(('127.0.0.1', 0), MyHandler)
         ip, port = server.server_address
         server_thread = threading.Thread(target=server.serve_forever)
         server_thread.setDaemon(True)




More information about the bind10-changes mailing list