Browse Source

[2922] Keep mapping from fd to lname

It'll be needed in the following work.
Michal 'vorner' Vaner 12 years ago
parent
commit
8c00b35f64
2 changed files with 17 additions and 2 deletions
  1. 4 1
      src/bin/msgq/msgq.py.in
  2. 13 1
      src/bin/msgq/tests/msgq_test.py

+ 4 - 1
src/bin/msgq/msgq.py.in

@@ -184,6 +184,7 @@ class MsgQ:
         self.hostname = socket.gethostname()
         self.hostname = socket.gethostname()
         self.subs = SubscriptionManager(self.cfgmgr_ready)
         self.subs = SubscriptionManager(self.cfgmgr_ready)
         self.lnames = {}
         self.lnames = {}
+        self.fd_to_lname = {}
         self.sendbuffs = {}
         self.sendbuffs = {}
         self.running = False
         self.running = False
         self.__cfgmgr_ready = None
         self.__cfgmgr_ready = None
@@ -328,6 +329,7 @@ class MsgQ:
         self.sockets[newsocket.fileno()] = newsocket
         self.sockets[newsocket.fileno()] = newsocket
         lname = self.newlname()
         lname = self.newlname()
         self.lnames[lname] = newsocket
         self.lnames[lname] = newsocket
+        self.fd_to_lname[newsocket.fileno()] = lname
 
 
         logger.debug(TRACE_BASIC, MSGQ_SOCKET_REGISTERED, newsocket.fileno(),
         logger.debug(TRACE_BASIC, MSGQ_SOCKET_REGISTERED, newsocket.fileno(),
                      lname)
                      lname)
@@ -346,7 +348,8 @@ class MsgQ:
             self.poller.unregister(sock)
             self.poller.unregister(sock)
 
 
         self.subs.unsubscribe_all(sock)
         self.subs.unsubscribe_all(sock)
-        lname = [ k for k, v in self.lnames.items() if v == sock ][0]
+        lname = self.fd_to_lname[fd]
+        del self.fd_to_lname[fd]
         del self.lnames[lname]
         del self.lnames[lname]
         sock.close()
         sock.close()
         del self.sockets[fd]
         del self.sockets[fd]

+ 13 - 1
src/bin/msgq/tests/msgq_test.py

@@ -421,12 +421,17 @@ class SendNonblock(unittest.TestCase):
         The write end is put into the message queue, so we can check it.
         The write end is put into the message queue, so we can check it.
         It returns (msgq, read_end, write_end). It is expected the sockets
         It returns (msgq, read_end, write_end). It is expected the sockets
         are closed by the caller afterwards.
         are closed by the caller afterwards.
+
+        Also check the sockets are registered correctly (eg. internal data
+        structures are there for them).
         '''
         '''
         msgq = MsgQ()
         msgq = MsgQ()
         # We do only partial setup, so we don't create the listening socket
         # We do only partial setup, so we don't create the listening socket
         msgq.setup_poller()
         msgq.setup_poller()
         (read, write) = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
         (read, write) = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
         msgq.register_socket(write)
         msgq.register_socket(write)
+        self.assertEqual(1, len(msgq.lnames))
+        self.assertEqual(write, msgq.lnames[msgq.fd_to_lname[write.fileno()]])
         return (msgq, read, write)
         return (msgq, read, write)
 
 
     def infinite_sender(self, sender):
     def infinite_sender(self, sender):
@@ -446,8 +451,15 @@ class SendNonblock(unittest.TestCase):
         # Explicitly close temporary socket pair as the Python
         # Explicitly close temporary socket pair as the Python
         # interpreter expects it.  It may not be 100% exception safe,
         # interpreter expects it.  It may not be 100% exception safe,
         # but since this is only for tests we prefer brevity.
         # but since this is only for tests we prefer brevity.
+        # Actually, the write end is often closed by the sender.
+        if write.fileno() != -1:
+            # Some of the senders passed here kill the socket internally.
+            # So kill it only if not yet done so. If the socket is closed,
+            # it gets -1 as fileno().
+            msgq.kill_socket(write.fileno(), write)
+        self.assertFalse(msgq.lnames)
+        self.assertFalse(msgq.fd_to_lname)
         read.close()
         read.close()
-        write.close()
 
 
     def test_infinite_sendmsg(self):
     def test_infinite_sendmsg(self):
         """
         """