Allow SIGINT to cancel BootManagerService jobs
authorJonathan Maw <jonathan.maw@codethink.co.uk>
Thu, 21 Jun 2012 14:41:25 +0000 (15:41 +0100)
committerJannis Pohlmann <jannis.pohlmann@codethink.co.uk>
Thu, 21 Jun 2012 15:49:44 +0000 (16:49 +0100)
The function boot_manager_service_cancel() allows any part of the boot
manager to cancel every job being started by the BootManagerService.
The SIGINT handler in the BootManagerApplication includes a call to
boot_manager_service_cancel().

boot-manager/boot-manager-application.c
boot-manager/boot-manager-service.c
boot-manager/boot-manager-service.h

index 349b228..b42e286 100644 (file)
@@ -250,6 +250,7 @@ boot_manager_application_int_handler (GApplication *app)
   BootManagerApplication *application = BOOT_MANAGER_APPLICATION (app);
 
   luc_starter_cancel (application->luc_starter);
+  boot_manager_service_cancel (application->boot_manager);
 
   return TRUE;
 }
index 4b2949e..094537a 100644 (file)
@@ -130,6 +130,9 @@ static void                   boot_manager_service_remember_job          (BootMa
                                                                           BootManagerServiceJob         *job);
 static void                   boot_manager_service_forget_job            (BootManagerService            *service,
                                                                           const gchar                   *job_name);
+static void                   boot_manager_service_cancel_task           (gpointer                       key,
+                                                                          GCancellable                  *cancellable,
+                                                                          gpointer                       user_data);
 
 
 
@@ -1003,6 +1006,16 @@ boot_manager_service_forget_job (BootManagerService *service,
 
 
 
+static void
+boot_manager_service_cancel_task (gpointer      key,
+                                  GCancellable *cancellable,
+                                  gpointer      user_data)
+{
+  g_cancellable_cancel (cancellable);
+}
+
+
+
 BootManagerService *
 boot_manager_service_new (GDBusConnection *connection,
                           SystemdManager  *systemd_manager)
@@ -1181,3 +1194,13 @@ boot_manager_service_list (BootManagerService            *service,
   systemd_manager_call_list_units (service->systemd_manager, cancellable,
                                    boot_manager_service_list_units_reply, job);
 }
+
+void
+boot_manager_service_cancel (BootManagerService *service)
+{
+  g_return_if_fail (BOOT_MANAGER_IS_SERVICE (service));
+
+  /* cancel all listed cancellables */
+  g_hash_table_foreach (service->cancellables,
+                        (GHFunc) boot_manager_service_cancel_task, NULL);
+}
index dfb6f38..6e86b36 100644 (file)
@@ -69,7 +69,8 @@ void                boot_manager_service_isolate  (BootManagerService
 void                boot_manager_service_list     (BootManagerService            *service,
                                                    GCancellable                  *cancellable,
                                                    BootManagerServiceListCallback list_callback,
-                                                   gpointer                       user_data); 
+                                                   gpointer                       user_data);
+void                boot_manager_service_cancel   (BootManagerService            *service);
 
 G_END_DECLS