Просмотр исходного кода

NCDInterfaceMonitor: allow pausing and resuming events

ambrop7 15 лет назад
Родитель
Сommit
9a86a58ebd
2 измененных файлов с 33 добавлено и 3 удалено
  1. 31 3
      ncd/NCDInterfaceMonitor.c
  2. 2 0
      ncd/NCDInterfaceMonitor.h

+ 31 - 3
ncd/NCDInterfaceMonitor.c

@@ -53,6 +53,9 @@ void netlink_fd_handler (NCDInterfaceMonitor *o, int events)
         return;
     }
     
+    // stop receiving fd events
+    BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, 0);
+    
     // set buffer
     o->buf_nh = (struct nlmsghdr *)o->buf;
     o->buf_left = len;
@@ -103,6 +106,9 @@ void process_buffer (NCDInterfaceMonitor *o)
             continue;
         }
         
+        // finish this message
+        o->buf_nh = NLMSG_NEXT(o->buf_nh, o->buf_left);
+        
         // schedule more job
         BPending_Set(&o->more_job);
         
@@ -113,6 +119,9 @@ void process_buffer (NCDInterfaceMonitor *o)
     
     // set no buffer
     o->buf_left = -1;
+    
+    // continue receiving fd events
+    BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, BREACTOR_READ);
 }
 
 void more_job_handler (NCDInterfaceMonitor *o)
@@ -120,9 +129,6 @@ void more_job_handler (NCDInterfaceMonitor *o)
     DebugObject_Access(&o->d_obj);
     ASSERT(o->buf_left >= 0)
     
-    // finish this message
-    o->buf_nh = NLMSG_NEXT(o->buf_nh, o->buf_left);
-    
     // process buffer
     process_buffer(o);
     return;
@@ -194,3 +200,25 @@ void NCDInterfaceMonitor_Free (NCDInterfaceMonitor *o)
     // close netlink fd
     close(o->netlink_fd);
 }
+
+void NCDInterfaceMonitor_Pause (NCDInterfaceMonitor *o)
+{
+    DebugObject_Access(&o->d_obj);
+    
+    if (o->buf_left >= 0) {
+        BPending_Unset(&o->more_job);
+    } else {
+        BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, 0);
+    }
+}
+
+void NCDInterfaceMonitor_Continue (NCDInterfaceMonitor *o)
+{
+    DebugObject_Access(&o->d_obj);
+    
+    if (o->buf_left >= 0) {
+        BPending_Set(&o->more_job);
+    } else {
+        BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, BREACTOR_READ);
+    }
+}

+ 2 - 0
ncd/NCDInterfaceMonitor.h

@@ -49,5 +49,7 @@ typedef struct {
 
 int NCDInterfaceMonitor_Init (NCDInterfaceMonitor *o, BReactor *reactor, NCDInterfaceMonitor_handler handler, void *user) WARN_UNUSED;
 void NCDInterfaceMonitor_Free (NCDInterfaceMonitor *o);
+void NCDInterfaceMonitor_Pause (NCDInterfaceMonitor *o);
+void NCDInterfaceMonitor_Continue (NCDInterfaceMonitor *o);
 
 #endif