summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Arceri <t_arceri@yahoo.com.au>2013-04-12 19:38:51 +1000
committerAlexander Larsson <alexl@redhat.com>2013-04-15 10:11:42 +0200
commit517ae68514f5489c5494d0a3c667a727d1bf2681 (patch)
tree1f4d663275f2fa50ed1d611ce4f3890544401072
parent9ce7691218febc42bca1e3a35bfe72c2f23a566d (diff)
downloadgvfs-517ae68514f5489c5494d0a3c667a727d1bf2681.tar.gz
Adds infrastructure for the backends to exit cleanly
https://bugzilla.gnome.org/show_bug.cgi?id=511802
-rw-r--r--daemon/gvfsdaemon.c22
-rw-r--r--daemon/gvfsdaemon.h3
-rw-r--r--daemon/main.c10
3 files changed, 32 insertions, 3 deletions
diff --git a/daemon/gvfsdaemon.c b/daemon/gvfsdaemon.c
index c0ac8caf..6cb3341a 100644
--- a/daemon/gvfsdaemon.c
+++ b/daemon/gvfsdaemon.c
@@ -46,6 +46,11 @@ enum {
PROP_0
};
+enum {
+ SHUTDOWN,
+ LAST_SIGNAL
+};
+
typedef struct {
char *obj_path;
GVfsRegisterPathCallback callback;
@@ -86,6 +91,8 @@ typedef struct {
GDBusConnection *conn;
} NewConnectionData;
+static guint signals[LAST_SIGNAL] = { 0 };
+
static void g_vfs_daemon_get_property (GObject *object,
guint prop_id,
GValue *value,
@@ -173,6 +180,15 @@ g_vfs_daemon_class_init (GVfsDaemonClass *klass)
gobject_class->finalize = g_vfs_daemon_finalize;
gobject_class->set_property = g_vfs_daemon_set_property;
gobject_class->get_property = g_vfs_daemon_get_property;
+
+ signals[SHUTDOWN] =
+ g_signal_new ("shutdown",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GVfsDaemonClass, shutdown),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
static void
@@ -344,9 +360,9 @@ g_vfs_daemon_set_max_threads (GVfsDaemon *daemon,
}
static gboolean
-exit_at_idle (gpointer data)
+exit_at_idle (GVfsDaemon *daemon)
{
- exit (0);
+ g_signal_emit (daemon, signals[SHUTDOWN], 0);
return FALSE;
}
@@ -364,7 +380,7 @@ static void
daemon_schedule_exit (GVfsDaemon *daemon)
{
if (daemon->exit_tag == 0)
- daemon->exit_tag = g_timeout_add_seconds (1, exit_at_idle, daemon);
+ daemon->exit_tag = g_timeout_add_seconds (1, (GSourceFunc)exit_at_idle, daemon);
}
static void
diff --git a/daemon/gvfsdaemon.h b/daemon/gvfsdaemon.h
index d28fb8fe..371dbd42 100644
--- a/daemon/gvfsdaemon.h
+++ b/daemon/gvfsdaemon.h
@@ -45,6 +45,9 @@ struct _GVfsDaemonClass
{
GObjectClass parent_class;
+ /* signals */
+ void (*shutdown) (GVfsDaemon *daemon);
+
/* vtable */
};
diff --git a/daemon/main.c b/daemon/main.c
index 16614423..f394a32c 100644
--- a/daemon/main.c
+++ b/daemon/main.c
@@ -118,6 +118,13 @@ on_name_acquired (GDBusConnection *connection,
#endif
}
+static void
+daemon_shutdown (GVfsDaemon *daemon,
+ GMainLoop *loop)
+{
+ if (g_main_loop_is_running (loop))
+ g_main_loop_quit (loop);
+}
int
main (int argc, char *argv[])
@@ -181,6 +188,9 @@ main (int argc, char *argv[])
if (daemon == NULL)
return 1;
+ g_signal_connect (daemon, "shutdown",
+ G_CALLBACK (daemon_shutdown), loop);
+
flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT;
if (replace)
flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE;