]> Zhao Yanbai Git Server - minix.git/commitdiff
libdriver: allow driver to break out of message loop
authorDavid van Moolenbroek <david@minix3.org>
Sun, 1 Aug 2010 22:07:46 +0000 (22:07 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Sun, 1 Aug 2010 22:07:46 +0000 (22:07 +0000)
include/minix/driver.h
lib/libdriver/driver.c

index b5272b8101b2a54a363d1849e015469d4d7e4101..71b888a9caf56ec48ad76835d3c1e9fe4e37b8d9 100644 (file)
@@ -67,6 +67,7 @@ _PROTOTYPE( void driver_announce, (void) );
 _PROTOTYPE( int driver_receive, (endpoint_t src, message *m_ptr,
        int *status_ptr) );
 _PROTOTYPE( int driver_receive_mq, (message *m_ptr, int *status_ptr) );
+_PROTOTYPE( void driver_terminate, (void) );
 _PROTOTYPE( void driver_task, (struct driver *dr, int type) );
 _PROTOTYPE( int driver_mq_queue, (message *m_ptr, int status) );
 _PROTOTYPE( void driver_init_buffer, (void) );
index cb76558377b1e8ac5dfb98934c4cf7ee03c25f35..a6c3bfc8cae02e778ec9ba0366b82801ce2f0276 100644 (file)
@@ -65,6 +65,7 @@ int device_caller;
 PRIVATE mq_t *queue_head = NULL;
 PRIVATE int open_devs[MAX_NR_OPEN_DEVICES];
 PRIVATE int next_open_devs_slot = 0;
+PRIVATE int driver_running;
 
 /*===========================================================================*
  *                          clear_open_devs                                 *
@@ -324,6 +325,17 @@ int *status_ptr;
        return driver_receive(ANY, m_ptr, status_ptr);
 }
 
+/*===========================================================================*
+ *                             driver_terminate                             *
+ *===========================================================================*/
+PUBLIC void driver_terminate(void)
+{
+/* Break out of the main driver loop after finishing the current request.
+ */
+
+  driver_running = FALSE;
+}
+
 /*===========================================================================*
  *                             driver_task                                  *
  *===========================================================================*/
@@ -336,10 +348,12 @@ int type;         /* Driver type (DRIVER_STD or DRIVER_ASYN) */
   int r, proc_nr, ipc_status;
   message mess;
 
+  driver_running = TRUE;
+
   /* Here is the main loop of the disk task.  It waits for a message, carries
    * it out, and sends a reply.
    */
-  while (TRUE) {
+  while (driver_running) {
        if ((r=driver_receive_mq(&mess, &ipc_status)) != OK)
                panic("driver_receive_mq failed: %d", r);