diff options
author | Peng Huang <phuang@phuang.nay.redhat.com> | 2009-02-12 13:15:03 +0800 |
---|---|---|
committer | Peng Huang <phuang@phuang.nay.redhat.com> | 2009-02-12 13:15:03 +0800 |
commit | 5ae50478381f53431a04e662a78d9e9db91a540e (patch) | |
tree | 6f2dc522f70a48ec6d2abdc4ecb9d065540a6003 | |
parent | dcd4ceb33c2865ef3636565c68d97ee05ea6b1e3 (diff) | |
download | ibus-5ae50478381f53431a04e662a78d9e9db91a540e.tar.gz ibus-5ae50478381f53431a04e662a78d9e9db91a540e.tar.xz ibus-5ae50478381f53431a04e662a78d9e9db91a540e.zip |
Try to make all child processes finished before ibus-daemon exits.
-rw-r--r-- | bus/ibusimpl.c | 62 | ||||
-rw-r--r-- | bus/main.c | 6 |
2 files changed, 46 insertions, 22 deletions
diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c index e92b373..216de11 100644 --- a/bus/ibusimpl.c +++ b/bus/ibusimpl.c @@ -21,6 +21,7 @@ #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> +#include <signal.h> #include <stdlib.h> #include "ibusimpl.h" #include "dbusimpl.h" @@ -388,6 +389,41 @@ bus_ibus_impl_init (BusIBusImpl *ibus) static void bus_ibus_impl_destroy (BusIBusImpl *ibus) { + pid_t pid; + glong timeout; + gint status; + gboolean flag; + + bus_registry_stop_all_components (ibus->registry); + + pid = 0; + timeout = 0; + flag = FALSE; + while (1) { + while ((pid = waitpid (0, &status, WNOHANG)) > 0); + + if (pid == -1) { /* all children finished */ + break; + } + if (pid == 0) { /* no child status changed */ + usleep (1000); + timeout += 1000; + if (timeout >= G_USEC_PER_SEC) { + if (flag == FALSE) { + gpointer old; + old = signal (SIGTERM, SIG_IGN); + kill (-getpid (), SIGTERM); + signal (SIGTERM, old); + flag = TRUE; + } + else { + g_warning ("Not every child processes exited!"); + break; + } + } + } + }; + g_list_foreach (ibus->engine_list, (GFunc) g_object_unref, NULL); g_list_free (ibus->engine_list); ibus->engine_list = NULL; @@ -407,7 +443,7 @@ bus_ibus_impl_destroy (BusIBusImpl *ibus) } bus_server_quit (BUS_DEFAULT_SERVER); - + ibus_object_destroy ((IBusObject *) BUS_DEFAULT_SERVER); IBUS_OBJECT_CLASS(parent_class)->destroy (IBUS_OBJECT (ibus)); } @@ -832,7 +868,6 @@ _ibus_list_active_engines (BusIBusImpl *ibus, return reply; } -extern gchar **g_argv; static IBusMessage * _ibus_exit (BusIBusImpl *ibus, @@ -859,32 +894,21 @@ _ibus_exit (BusIBusImpl *ibus, ibus_connection_flush ((IBusConnection *) connection); ibus_message_unref (reply); - + ibus_object_destroy ((IBusObject *) ibus); + if (!restart) { exit (0); } else { - glong timeout; - gint fd; - gint status; - - bus_registry_stop_all_components (ibus->registry); - ibus_object_destroy ((IBusObject *) BUS_DEFAULT_SERVER); - for (fd = 3; fd <= sysconf (_SC_OPEN_MAX); fd++) { - close (fd); - } - for (timeout = 0; waitpid (0, &status, WNOHANG) != -1;) { - usleep (1000); - timeout += 1000; - if (timeout >= G_USEC_PER_SEC * 2) { - g_warning ("Not every child processes exited!"); - } - }; + extern gchar **g_argv; execv (g_argv[0], g_argv); g_warning ("execv %s failed!", g_argv[0]); exit (-1); } + /* should not reach here */ + g_assert_not_reached (); + return NULL; } @@ -106,9 +106,6 @@ main (gint argc, gchar **argv) exit (-1); } - /* create a new process group */ - setpgrp (); - if (daemonize) { if (daemon (1, 0) != 0) { g_printerr ("Can not daemonize ibus.\n"); @@ -116,6 +113,9 @@ main (gint argc, gchar **argv) } } + /* create a new process group */ + setpgrp (); + g_type_init (); /* check if ibus-daemon is running in this session */ |