D-Bus auto activation / Apply On-demand 77/61077/5
authoryoungman <yman.jung@samsung.com>
Fri, 4 Mar 2016 01:04:15 +0000 (10:04 +0900)
committeryoungman <yman.jung@samsung.com>
Mon, 7 Mar 2016 05:21:32 +0000 (14:21 +0900)
Change-Id: Idc6929cf1c10446088b476a51a171e13d0f6da19
Signed-off-by: youngman <yman.jung@samsung.com>
common/ic-dbus.xml
daemon/CMakeLists.txt
daemon/icd-dbus.c
daemon/icd-ioty-ocprocess.c
daemon/icd.c
daemon/icd.h
daemon/org.tizen.iotcon.dbus.service.in [new file with mode: 0644]
lib/icl-dbus.c
packaging/iotcon-old.service
packaging/iotcon.service
packaging/iotcon.spec

index 8a9d36eb8d1c556c42b7246216b28137c934a8db..2e2a5d982f13babd317880bec32e8e159afcef6c 100644 (file)
@@ -1,5 +1,8 @@
 <node>
        <interface name="org.tizen.iotcon.dbus">
+               <method name="initialize">
+                       <arg type="i" name="ret" direction="out"/>
+               </method>
                <method name="registerResource">
                        <arg type="s" name="uri_path" direction="in"/>
                        <arg type="as" name="resource_types" direction="in"/>
index 66a4a7321a8f1b6b086245240660445dcf23dc26..8c9109220b1f5eb602870d2ebc584d61f68db921 100644 (file)
@@ -35,3 +35,14 @@ ADD_DEPENDENCIES(${DAEMON} GENERATED_DBUS_CODE)
 TARGET_LINK_LIBRARIES(${DAEMON} ${daemon_pkgs_LIBRARIES})
 
 INSTALL(TARGETS ${DAEMON} DESTINATION ${BIN_INSTALL_DIR})
+
+IF(TZ_VER_3)
+       SET(USER "iotcon")
+ELSE(TZ_VER_3)
+       SET(USER "system")
+ENDIF(TZ_VER_3)
+
+SET(DBUS_SERVICE_FILE "org.tizen.${PROJECT_NAME}.dbus")
+CONFIGURE_FILE(${DBUS_SERVICE_FILE}.service.in ${DBUS_SERVICE_FILE}.service @ONLY)
+INSTALL(FILES ${DBUS_SERVICE_FILE}.service DESTINATION
+       ${SHARE_INSTALL_PREFIX}/dbus-1/system-services)
index 011c237c88fc46c930be885cafee61c17144b59e..b7868ee6994670857a5d5e264ca72cc1f11a35a6 100644 (file)
@@ -296,6 +296,9 @@ static int _icd_dbus_client_list_get_client(const gchar *bus_name,
 
        DBG("new client(%s) added", bus_name);
        icd_dbus_client_list = g_list_append(icd_dbus_client_list, client);
+
+       icd_unset_kill_timeout();
+
        *ret_client = client;
 
        return IOTCON_ERROR_NONE;
@@ -322,6 +325,9 @@ static void _icd_dbus_name_owner_changed_cb(GDBusConnection *conn,
                if (client) { /* found bus name in our bus list */
                        DBG("bus(%s) stopped", old_owner);
                        icd_dbus_client_list = g_list_remove_link(icd_dbus_client_list, client);
+
+                       if (0 == g_list_length(icd_dbus_client_list))
+                               icd_set_kill_timeout();
                }
                g_mutex_unlock(&icd_dbus_client_list_mutex);
 
@@ -637,6 +643,31 @@ static void _icd_dbus_encap_list_remove(const gchar *bus_name, int type,
        g_mutex_unlock(&icd_dbus_client_list_mutex);
 }
 
+static gboolean _dbus_handle_initialize(icDbus *object,
+               GDBusMethodInvocation *invocation)
+{
+       FN_CALL;
+       int ret;
+       const gchar *sender;
+       icd_dbus_client_s *client = NULL;
+
+       sender = g_dbus_method_invocation_get_sender(invocation);
+
+       g_mutex_lock(&icd_dbus_client_list_mutex);
+       ret = _icd_dbus_client_list_get_client(sender, &client);
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("_icd_dbus_client_list_get_client() Fail(%d)", ret);
+               g_mutex_unlock(&icd_dbus_client_list_mutex);
+               ic_dbus_complete_initialize(object, invocation, ret);
+               return TRUE;
+       }
+       g_mutex_unlock(&icd_dbus_client_list_mutex);
+
+       ic_dbus_complete_initialize(object, invocation, IOTCON_ERROR_NONE);
+
+       return TRUE;
+}
+
 
 static gboolean _dbus_handle_register_resource(icDbus *object,
                GDBusMethodInvocation *invocation,
@@ -1322,6 +1353,8 @@ static void _dbus_on_bus_acquired(GDBusConnection *conn, const gchar *name,
                return;
        }
 
+       g_signal_connect(icd_dbus_object, "handle-initialize",
+                       G_CALLBACK(_dbus_handle_initialize), NULL);
        g_signal_connect(icd_dbus_object, "handle-register-resource",
                        G_CALLBACK(_dbus_handle_register_resource), NULL);
        g_signal_connect(icd_dbus_object, "handle-unregister-resource",
index 1a7fbc84ba7ead740c604887f272e55eb4955e6f..badf06bde1b84930f7944a74ba42e58c425b9816 100644 (file)
@@ -418,7 +418,7 @@ gpointer icd_ioty_ocprocess_thread(gpointer data)
 {
        FN_CALL;
        OCStackResult result;
-       const struct timespec delay = {0, 10 * 1000 * 1000}; /* 10 ms */
+       const struct timespec delay = {0, 100 * 1000 * 1000}; /* 100 ms */
 
        icd_ioty_alive = 1;
        while (icd_ioty_alive) {
@@ -430,7 +430,7 @@ gpointer icd_ioty_ocprocess_thread(gpointer data)
                        break;
                }
 
-               /* TODO : Current '10ms' is not proven sleep time. Revise the time after test.
+               /* TODO : Current '10ms' is not proven sleep time. Revise the time after test.
                 * Or recommend changes to event driven architecture */
                nanosleep(&delay, NULL);
        }
index a888deb97a34e95013a2e21609b0d43af77c93cf..87c1702da1179056cbd8c44e18604befe43d918b 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 #include <gio/gio.h>
+#include <glib.h>
 
 #include "icd.h"
 #include "icd-dbus.h"
 
 #define ICD_ALL_INTERFACES "0.0.0.0"
 #define ICD_RANDOM_PORT 0
+#define ICD_KILL_TIMEOUT_DURATION 10
+
+static GMainLoop *icd_loop;
+static int icd_kill_timeout;
+
+void icd_unset_kill_timeout()
+{
+       FN_CALL;
+       if (0 == icd_kill_timeout)
+               return;
+
+       g_source_remove(icd_kill_timeout);
+       icd_kill_timeout = 0;
+}
+
+static gboolean _icd_kill_cb(gpointer p)
+{
+       FN_CALL;
+       g_main_loop_quit(icd_loop);
+       return G_SOURCE_REMOVE;
+}
+
+void icd_set_kill_timeout()
+{
+       FN_CALL;
+       if (icd_kill_timeout)
+               return;
+
+       icd_kill_timeout = g_timeout_add_seconds(ICD_KILL_TIMEOUT_DURATION, _icd_kill_cb, NULL);
+}
 
 int main(int argc, char **argv)
 {
        int ret;
        guint id;
        GThread *thread;
-       GMainLoop *loop;
 
 #if !GLIB_CHECK_VERSION(2, 35, 0)
        g_type_init();
 #endif
 
-       loop = g_main_loop_new(NULL, FALSE);
+       icd_loop = g_main_loop_new(NULL, FALSE);
 
        id = icd_dbus_init();
        thread = icd_ioty_init(ICD_ALL_INTERFACES, ICD_RANDOM_PORT);
@@ -68,12 +98,13 @@ int main(int argc, char **argv)
                icd_dbus_deinit(id);
        }
 
-       g_main_loop_run(loop);
+       icd_set_kill_timeout();
+       g_main_loop_run(icd_loop);
 
        icd_cynara_deinit();
        icd_ioty_deinit(thread);
        icd_dbus_deinit(id);
-       g_main_loop_unref(loop);
+       g_main_loop_unref(icd_loop);
 
        return 0;
 }
index f9564a7ddb5cf8104b89b80f761dc962a723d90a..f524813453589e1d130cb550a9eb1b3e1c43dfd4 100644 (file)
@@ -21,5 +21,7 @@
 #define IC_DAEMON
 #include "ic-log.h"
 
+void icd_unset_kill_timeout();
+void icd_set_kill_timeout();
 
 #endif /*__IOT_CONNECTIVITY_MANAGER_DAEMON_H__*/
diff --git a/daemon/org.tizen.iotcon.dbus.service.in b/daemon/org.tizen.iotcon.dbus.service.in
new file mode 100644 (file)
index 0000000..c8e0005
--- /dev/null
@@ -0,0 +1,5 @@
+[D-BUS Service]
+Name=@DBUS_INTERFACE@
+User=@USER@
+Exec=/bin/false
+SystemdService=@PROJECT_NAME@.service
index 61021a2e92cfade2bc1d3e252c5af6edc7ae8251..2852d2ab3e87e4004a3e58cc7ffdbf3d646c0167 100644 (file)
@@ -254,6 +254,7 @@ int icl_dbus_get_timeout()
 
 int icl_dbus_start()
 {
+       int ret;
        unsigned int id;
        GError *error = NULL;
 
@@ -284,6 +285,22 @@ int icl_dbus_start()
        g_dbus_proxy_set_default_timeout(G_DBUS_PROXY(icl_dbus_object),
                        ICL_DBUS_TIMEOUT_DEFAULT * 1000);
 
+       ic_dbus_call_initialize_sync(icl_dbus_get_object(),
+                       &ret,
+                       NULL,
+                       &error);
+       if (error) {
+               ERR("ic_dbus_call_initialize_sync() Fail(%s)", error->message);
+               ret = icl_dbus_convert_dbus_error(error->code);
+               g_error_free(error);
+               return ret;
+       }
+
+       if (IOTCON_ERROR_NONE != ret) {
+               ERR("iotcon-daemon Fail(%d)", ret);
+               return icl_dbus_convert_daemon_error(ret);
+       }
+
        icl_dbus_count++;
        return IOTCON_ERROR_NONE;
 }
index d76f30c0b43bd400891ab0c9c650a3f95ee15037..4bd9ff424782f0a1404c086f32030c523b1bc5f0 100644 (file)
@@ -2,9 +2,10 @@
 Description=Tizen IoT Connectivity
 
 [Service]
-Type=simple
+Type=dbus
+BusName=org.tizen.iotcon.dbus
 ExecStart=/usr/bin/iotcon-daemon
-Restart=always
+Restart=on-failure
 User=system
 Group=system
 SmackProcessLabel=iotcon
index 5fbbb6e00b17e3540dbbe36e96bc0dff0b774799..3833dd65ad604ee76ad595e8753bbaa34cf86fa7 100644 (file)
@@ -2,9 +2,10 @@
 Description=Tizen IoT Connectivity
 
 [Service]
-Type=simple
+Type=dbus
+BusName=org.tizen.iotcon.dbus
 ExecStart=/usr/bin/iotcon-daemon
-Restart=always
+Restart=on-failure
 User=iotcon
 
 [Install]
index db5b4abd4bea7d74f903caa0c55362b20b6d665c..0f083c0a32f12881828b9863e96f150a162dd06f 100644 (file)
@@ -131,6 +131,7 @@ systemctl daemon-reload
 %{_libdir}/lib%{name}.so.*
 %{_unitdir}/%{name}.service
 %{_unitdir}/multi-user.target.wants/%{name}.service
+%{_datadir}/dbus-1/system-services/org.tizen.%{name}.dbus.service
 %if 0%{?tizen_version_major} < 3
 %{_datadir}/license/%{name}
 %else