]> Zhao Yanbai Git Server - minix.git/commitdiff
SEF: add sef_cancel()
authorDavid van Moolenbroek <david@minix3.org>
Mon, 9 Apr 2012 14:35:57 +0000 (16:35 +0200)
committerDavid van Moolenbroek <david@minix3.org>
Mon, 9 Apr 2012 14:35:57 +0000 (16:35 +0200)
This function allows the caller to cancel receiving a message from a
SEF callback. The receive function will then return EINTR.

include/minix/sef.h
lib/libsys/sef.c

index 13f4debcb983ceaf8885fff7ee32b8c0a88b6ebf..d36d67bead290511ea1e496a09e60fe0fbf83254 100644 (file)
@@ -8,6 +8,7 @@
 /* SEF entry points for system processes. */
 void sef_startup(void);
 int sef_receive_status(endpoint_t src, message *m_ptr, int *status_ptr);
+void sef_cancel(void);
 void sef_exit(int status);
 #define sef_receive(src, m_ptr) sef_receive_status(src, m_ptr, NULL)
 
index 27f0aab0e746a96b5b1caeaa5a475b635e785104..f1bc4eee82772d9f8be6a2952a1fa4e95d4a7ad6 100644 (file)
@@ -12,6 +12,7 @@ char sef_self_name[SEF_SELF_NAME_MAXLEN];
 endpoint_t sef_self_endpoint;
 int sef_self_priv_flags;
 int sef_self_first_receive_done;
+int sef_self_receiving;
 
 /* Debug. */
 #if SEF_INIT_DEBUG || SEF_LU_DEBUG || SEF_PING_DEBUG || SEF_SIGNAL_DEBUG
@@ -119,7 +120,14 @@ int sef_receive_status(endpoint_t src, message *m_ptr, int *status_ptr)
 /* SEF receive() interface for system services. */
   int r, status;
 
+  sef_self_receiving = TRUE;
+
   while(TRUE) {
+      /* If the caller indicated that it no longer wants to receive a message,
+       * return now.
+       */
+      if (!sef_self_receiving)
+          return EINTR;
 
 #if INTERCEPT_SEF_LU_REQUESTS
       /* Handle SEF Live update before receive events. */
@@ -180,6 +188,20 @@ int sef_receive_status(endpoint_t src, message *m_ptr, int *status_ptr)
   return r;
 }
 
+/*===========================================================================*
+ *                             sef_cancel                                   *
+ *===========================================================================*/
+void sef_cancel(void)
+{
+/* Cancel receiving a message. This function be called from a callback invoked
+ * from within sef_receive_status(), which will then return an EINTR error
+ * code. In particular, this function can be used to exit from the main receive
+ * loop when a signal handler causes the process to want to shut down.
+ */
+
+  sef_self_receiving = FALSE;
+}
+
 /*===========================================================================*
  *                               sef_exit                                   *
  *===========================================================================*/