]> Zhao Yanbai Git Server - minix.git/commitdiff
Graceful exiting for USBD
authorWojciech Zajac <wzajac@jpembedded.eu>
Wed, 18 Jun 2014 10:17:01 +0000 (12:17 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:54 +0000 (17:05 +0200)
drivers/usbd/base/usbd.c

index 1925a5269f5db3892e37de22dc7f442cf5b486be..f45929cba6ae7b90cacbef922d8dd4c1ac941d15 100755 (executable)
  *    Local declarations                                                     *
  *===========================================================================*/
 static int usbd_sef_handler(int, sef_init_info_t *);
+static void usbd_signal_handler(int);
 static int usbd_start(void);
 static void usbd_init(void);
 static void usbd_server_thread(void *);
 
 /* TODO: No headers for these... */
-extern void ddekit_minix_wait_exit(void); /* dde.c */
+extern void ddekit_minix_wait_exit(void);      /* dde.c */
+extern void ddekit_shutdown(void);             /* dde.c */
 
 
 /*===========================================================================*
@@ -94,6 +96,24 @@ usbd_sef_handler(int type, sef_init_info_t * UNUSED(info))
 }
 
 
+/*===========================================================================*
+ *    usbd_signal_handler                                                    *
+ *===========================================================================*/
+static void
+usbd_signal_handler(int UNUSED(signo))
+{
+       DEBUG_DUMP;
+
+       USB_MSG("Signal received, exiting USBD...");
+
+       /* Try graceful DDEKit exit */
+       ddekit_shutdown();
+
+       /* Unreachable, when ddekit_shutdown works correctly */
+       USB_ASSERT(0, "Calling ddekit_shutdown failed!");
+}
+
+
 /*===========================================================================*
  *    usbd_start                                                             *
  *===========================================================================*/
@@ -133,6 +153,7 @@ usbd_init(void)
        sef_setcb_init_fresh(usbd_sef_handler);
        sef_setcb_init_lu(usbd_sef_handler);
        sef_setcb_init_restart(usbd_sef_handler);
+       sef_setcb_signal_handler(usbd_signal_handler);
 
        /* Initialize DDEkit (involves sef_startup()) */
        ddekit_init();