client: Add ambd restart signal handler 06/100306/1
authorSangjung Woo <sangjung.woo@samsung.com>
Wed, 23 Nov 2016 10:37:14 +0000 (19:37 +0900)
committerSangjung Woo <sangjung.woo@samsung.com>
Sat, 26 Nov 2016 01:29:33 +0000 (10:29 +0900)
Since ambd is a key daemon of Automotive OS so it should be restart
after being killed. In this case, the callback functions that are
registered by its clients should be restored. This patch does this task
by adding DBus signal handler in client library.

Change-Id: Ie62aa061c534f9710a61149980081e1b5e7dd962
Signed-off-by: Sangjung Woo <sangjung.woo@samsung.com>
lib/client/libamb-client.c
packaging.in/ambd.service.systemd.tizen

index 6fa8a74..b2473f8 100644 (file)
 
 #define AMB_BUS_NAME        "org.automotive.message.broker"
 #define AMB_INTERFACE_NAME  "org.automotive.Manager"
+#define AMB_OBJ_PATH        "/Org/Automotive/Manager"
+#define AMB_SIGNAL_RESTART  "Restart"
+
 #define DBUS_INTERFACE_NAME "org.freedesktop.DBus.Properties"
 
+
 struct callback_item {
        AMB_PROPERTY_CHANGED_CALLBACK callback;
        void *user_data;
@@ -41,8 +45,13 @@ struct signal_item {
        GDBusProxy *obj;
        GList *cb_list;
        guint32 next_cid;
+       gchar *objname;
+       ZoneType zone;
 };
 
+static guint signalid;
+static GDBusConnection* conn = NULL;
+
 /******************************************************************************
  * internal
  *****************************************************************************/
@@ -284,6 +293,86 @@ static void on_signal_handler(GDBusProxy *proxy,
        return ;
 }
 
+static void signal_handler(GDBusConnection *connection,
+                        const gchar *sender_name,
+                        const gchar *object_path,
+                        const gchar *interface_name,
+                        const gchar *signal_name,
+                        GVariant *parameters,
+                        gpointer user_data)
+{
+    GHashTable *htable;
+    GHashTableIter iter;
+    GDBusProxy *proxy;
+    GDBusProxy *objproxy;
+    gchar *objpath;
+    struct signal_item *item;
+
+    DEBUGOUT("DBus Signal catch: %s\n", signal_name);
+
+    if (g_strcmp0(signal_name, AMB_SIGNAL_RESTART))
+        return ;
+
+    htable = get_htable();
+    if (!htable) {
+        DEBUGOUT("Error: get_htable() returns NULL\n");
+        return ;
+    }
+
+    proxy = get_manager();
+    if (!proxy) {
+        DEBUGOUT("Error: get_manager() returns NULL\n");
+        return ;
+    }
+
+    g_hash_table_iter_init(&iter, htable);
+    while (g_hash_table_iter_next(&iter, (gpointer*)&objpath, (gpointer*)&item)) {
+        DEBUGOUT("objpath: %s\n", objpath);
+        GDBusProxy *retobj = find_objects_with_zone(proxy, item->objname, item->zone);
+        if (!retobj) {
+            DEBUGOUT("Error: find_objects_with_zone() returns NULL\n");
+        }
+    }
+}
+
+static int subscribe_dbus_signal()
+{
+    static int is_subscribe = 0;
+    GError *error;
+
+    DEBUGOUT("%s: Enter subscribe_dbus_signal()\n", __func__);
+
+    if (is_subscribe)
+        return 0;
+
+    error = NULL;
+    conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+    if (conn == NULL) {
+        DEBUGOUT("%s: %s\n", __func__, error->message);
+        return -1;
+    }
+
+    signalid = g_dbus_connection_signal_subscribe(conn,
+                                    NULL,
+                                    AMB_INTERFACE_NAME,
+                                    AMB_SIGNAL_RESTART,
+                                    AMB_OBJ_PATH,
+                                    NULL,
+                                    G_DBUS_SIGNAL_FLAGS_NONE,
+                                    signal_handler,
+                                    NULL,
+                                    NULL);
+
+    if (!signalid) {
+        DEBUGOUT("%s: Fail to g_dbus_connection_signal_subscribe()\n", __func__);
+        g_object_unref(conn);
+        return -1;
+    }
+    is_subscribe = 1;
+    return 0;
+}
+
+
 /******************************************************************************
  * higher APIs
  *****************************************************************************/
@@ -427,6 +516,11 @@ EXPORT int amb_register_property_changed_handler(gchar *objname,
        struct callback_item *citem;
        GHashTable *htable;
 
+    if (subscribe_dbus_signal()) {
+        DEBUGOUT("Error: fail to subscribe_dbus_signal()\n");
+        return -100;
+    }
+
        if (callback == NULL)
                return -EINVAL;
 
@@ -465,6 +559,8 @@ EXPORT int amb_register_property_changed_handler(gchar *objname,
                item->id = sid;
                item->next_cid = 0;
                item->obj = objproxy;
+               item->zone = zone;
+               item->objname = g_strdup(objname);
                g_hash_table_insert(htable, item->key, item);
        }
 
index 3e943ef..7d17d06 100644 (file)
@@ -12,6 +12,9 @@ BusName=org.automotive.message.broker
 Environment=LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so
 ExecStartPre=/bin/bash -c "/usr/bin/can_init.sh vcan"
 ExecStart=/usr/bin/ambd -c /etc/ambd/config
+ExecStartPost=/usr/bin/dbus-send --type=signal --system /Org/Automotive/Manager org.automotive.Manager.Restart
+Restart=always
+RestartSec=0
 
 [Install]
 WantedBy=multi-user.target