[24455] in Source-Commits

home help back first fref pref prev next nref lref last post

/svn/athena r24046 - trunk/debathena/debathena/metrics/debathena/metrics

daemon@ATHENA.MIT.EDU (Evan Broder)
Sun Oct 4 22:08:59 2009

Date: Sun, 4 Oct 2009 22:08:47 -0400
From: Evan Broder <broder@MIT.EDU>
Message-Id: <200910050208.n9528lQP003622@drugstore.mit.edu>
To: source-commits@mit.edu
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Author: broder
Date: 2009-10-04 22:08:47 -0400 (Sun, 04 Oct 2009)
New Revision: 24046

Modified:
   trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx
Log:
In the metrics connector interface, don't use a potentially blocking
loop if we get an event we don't know about.



Modified: trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx
===================================================================
--- trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx	2009-10-05 02:03:37 UTC (rev 24045)
+++ trunk/debathena/debathena/metrics/debathena/metrics/connector.pyx	2009-10-05 02:08:47 UTC (rev 24046)
@@ -85,6 +85,11 @@
             self.exit_signal)
 
 
+cdef class UnknownProcEvent(ProcEvent):
+    def __repr__(self):
+        return "<UnknownProcEvent what=%d>" % self.what
+
+
 cdef class Connector:
     cdef int sock
     cdef public object closed
@@ -147,51 +152,50 @@
         cdef proc_event *ev
         cdef object ret
 
-        while True:
-            from_addr.nl_family = AF_NETLINK
-            from_addr.nl_groups = CN_IDX_PROC
-            from_addr.nl_pid = 1
-            s = sizeof(from_addr)
+        from_addr.nl_family = AF_NETLINK
+        from_addr.nl_groups = CN_IDX_PROC
+        from_addr.nl_pid = 1
+        s = sizeof(from_addr)
 
-            if recvfrom(self.sock, buf, sizeof(buf), 0,
-                        <sockaddr *>&from_addr, &s) == -1:
-                raise IOError(errno, strerror(errno))
+        if recvfrom(self.sock, buf, sizeof(buf), 0,
+                    <sockaddr *>&from_addr, &s) == -1:
+            raise IOError(errno, strerror(errno))
 
-            ev = <proc_event *>((<cn_msg *>NLMSG_DATA(buf)).data)
+        ev = <proc_event *>((<cn_msg *>NLMSG_DATA(buf)).data)
 
-            if ev.what == PROC_EVENT_FORK:
-                ret = ForkProcEvent()
-                ret.parent_pid = ev.event_data.fork.parent_pid
-                ret.parent_tgid = ev.event_data.fork.parent_tgid
-                ret.child_pid = ev.event_data.fork.child_pid
-                ret.child_tgid = ev.event_data.fork.child_tgid
-            elif ev.what == PROC_EVENT_EXEC:
-                ret = ExecProcEvent()
-                ret.process_pid = ev.event_data.exec_.process_pid
-                ret.process_tgid = ev.event_data.exec_.process_tgid
-            elif ev.what == PROC_EVENT_UID:
-                ret = UidProcEvent()
-                ret.process_pid = ev.event_data.id_.process_pid
-                ret.process_tgid = ev.event_data.id_.process_tgid
-                ret.ruid = ev.event_data.id_.r.ruid
-                ret.euid = ev.event_data.id_.e.euid
-            elif ev.what == PROC_EVENT_GID:
-                ret = GidProcEvent()
-                ret.process_pid = ev.event_data.id_.process_pid
-                ret.process_tgid = ev.event_data.id_.process_tgid
-                ret.rgid = ev.event_data.id_.r.rgid
-                ret.egid = ev.event_data.id_.e.egid
-            elif ev.what == PROC_EVENT_EXIT:
-                ret = ExitProcEvent()
-                ret.process_pid = ev.event_data.exit_.process_pid
-                ret.process_tgid = ev.event_data.exit_.process_tgid
-                ret.exit_code = ev.event_data.exit_.exit_code
-                ret.exit_signal = ev.event_data.exit_.exit_signal
-            else:
-                continue
+        if ev.what == PROC_EVENT_FORK:
+            ret = ForkProcEvent()
+            ret.parent_pid = ev.event_data.fork.parent_pid
+            ret.parent_tgid = ev.event_data.fork.parent_tgid
+            ret.child_pid = ev.event_data.fork.child_pid
+            ret.child_tgid = ev.event_data.fork.child_tgid
+        elif ev.what == PROC_EVENT_EXEC:
+            ret = ExecProcEvent()
+            ret.process_pid = ev.event_data.exec_.process_pid
+            ret.process_tgid = ev.event_data.exec_.process_tgid
+        elif ev.what == PROC_EVENT_UID:
+            ret = UidProcEvent()
+            ret.process_pid = ev.event_data.id_.process_pid
+            ret.process_tgid = ev.event_data.id_.process_tgid
+            ret.ruid = ev.event_data.id_.r.ruid
+            ret.euid = ev.event_data.id_.e.euid
+        elif ev.what == PROC_EVENT_GID:
+            ret = GidProcEvent()
+            ret.process_pid = ev.event_data.id_.process_pid
+            ret.process_tgid = ev.event_data.id_.process_tgid
+            ret.rgid = ev.event_data.id_.r.rgid
+            ret.egid = ev.event_data.id_.e.egid
+        elif ev.what == PROC_EVENT_EXIT:
+            ret = ExitProcEvent()
+            ret.process_pid = ev.event_data.exit_.process_pid
+            ret.process_tgid = ev.event_data.exit_.process_tgid
+            ret.exit_code = ev.event_data.exit_.exit_code
+            ret.exit_signal = ev.event_data.exit_.exit_signal
+        else:
+            ret = UnknownProcEvent()
 
-            ret.what = ev.what
-            ret.cpu = ev.cpu
-            ret.timestamp_ns = ev.timestamp_ns
+        ret.what = ev.what
+        ret.cpu = ev.cpu
+        ret.timestamp_ns = ev.timestamp_ns
 
-            return ret
+        return ret


home help back first fref pref prev next nref lref last post