Merge tizen 2.4 into tizen 87/51787/6 submit/tizen/20151116.121623
authorHwankyu Jhun <h.jhun@samsung.com>
Mon, 16 Nov 2015 04:31:29 +0000 (13:31 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Mon, 16 Nov 2015 11:34:31 +0000 (20:34 +0900)
- Add background application management feature

Change-Id: I91749cb3b9378ff832e1858412602fa269f5940c
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
CMakeLists.txt
include/appcore-common.h
include/appcore-internal.h
packaging/app-core.spec
src/appcore-efl.c
src/appcore.c

index d1086b5611ce21fb79230385cac2c46cadd64630..c47c4e1ed18ed849fc4eebcc9efc3bd1945a8a4d 100644 (file)
@@ -25,18 +25,23 @@ SET(CMAKE_SKIP_BUILD_RPATH TRUE)
 SET(APPCORE_COMMON "appcore-common")
 SET(SRCS_common src/appcore.c src/appcore-i18n.c src/appcore-measure.c src/appcore-rotation.c)
 
-IF (with_wayland)
+IF(_WITH_WAYLAND)
        ADD_DEFINITIONS("-DWAYLAND")
-ENDIF (with_wayland)
-IF (with_x11)
+ENDIF(_WITH_WAYLAND)
+
+IF(_WITH_X11)
        ADD_DEFINITIONS("-DX11")
        SET(SRCS_common ${SRCS_common} src/appcore-X.c)
-ENDIF (with_x11)
+ENDIF(_WITH_X11)
+
+IF(_APPFW_FEATURE_BACKGROUND_MANAGEMENT)
+        ADD_DEFINITIONS("-D_APPFW_FEATURE_BACKGROUND_MANAGEMENT")
+ENDIF(_APPFW_FEATURE_BACKGROUND_MANAGEMENT)
 
 SET(HEADERS_common appcore-common.h)
 
 INCLUDE(FindPkgConfig)
-SET(APPCORE_PKG_CHECK_MODULES "dbus-1 vconf sensor aul dlog libtzplatform-config ecore")
+SET(APPCORE_PKG_CHECK_MODULES "dbus-glib-1 vconf sensor aul dlog libtzplatform-config ecore")
 IF (with_x11)
        SET(APPCORE_PKG_CHECK_MODULES "${APPCORE_PKG_CHECK_MODULES} x11 eina ecore-x")
 ENDIF (with_x11)
@@ -57,12 +62,12 @@ SET_TARGET_PROPERTIES(${APPCORE_COMMON} PROPERTIES VERSION ${VERSION})
 SET_TARGET_PROPERTIES(${APPCORE_COMMON} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS_common})
 TARGET_LINK_LIBRARIES(${APPCORE_COMMON} ${pkg_common_LDFLAGS} "-ldl")
 
-IF (with_wayland)
+IF(_WITH_WAYLAND)
        CONFIGURE_FILE(${APPCORE_COMMON}-wayland.pc.in ${APPCORE_COMMON}.pc @ONLY)
-ENDIF (with_wayland)
-IF (with_x11)
+ENDIF(_WITH_WAYLAND)
+IF(_WITH_X11)
        CONFIGURE_FILE(${APPCORE_COMMON}-x.pc.in ${APPCORE_COMMON}.pc @ONLY)
-ENDIF (with_x11)
+ENDIF(_WITH_X11)
 
 INSTALL(TARGETS ${APPCORE_COMMON} DESTINATION ${LIB_INSTALL_DIR} COMPONENT RuntimeLibraries)
 INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${APPCORE_COMMON}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
index a79c4f3e0219ea7ca047b53b738e1d444657f708..e3d83048a8da1b0781ec0e7b3d4a944dc27fcefb 100644 (file)
@@ -65,15 +65,17 @@ extern "C" {
  */
 enum appcore_event {
        APPCORE_EVENT_UNKNOWN,
-                      /**< Unknown event */
+                       /**< Unknown event */
        APPCORE_EVENT_LOW_MEMORY,
-                         /**< Low memory */
+                       /**< Low memory */
        APPCORE_EVENT_LOW_BATTERY,
-                          /**< Low battery */
+                       /**< Low battery */
        APPCORE_EVENT_LANG_CHANGE,
-                          /**< Language setting is changed */
+                       /**< Language setting is changed */
        APPCORE_EVENT_REGION_CHANGE,
-                            /**< Region setting is changed */
+                       /**< Region setting is changed */
+       APPCORE_EVENT_SUSPENDED_STATE_CHANGE,
+                       /**< The suspended state is changed */
 };
 
 /**
@@ -103,6 +105,11 @@ enum appcore_time_format {
        APPCORE_TIME_FORMAT_24,
 };
 
+enum appcore_suspended_state {
+       APPCORE_SUSPENDED_STATE_WILL_ENTER_SUSPEND = 0,
+       APPCORE_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND
+};
+
 /**
  * Appcore operations which are called during the application life-cycle
  * @see appcore_efl_main()
index 2a6ab072476d5021842994f65cd51c2bdf4791b6..0e3c0d8ba2c30fd8bc265cbccbc114da12a35f4f 100644 (file)
@@ -27,6 +27,7 @@
 #define LOG_TAG "APP_CORE"
 
 #include <stdio.h>
+#include <stdbool.h>
 #include <dlog.h>
 #include "appcore-common.h"
 
@@ -128,6 +129,7 @@ enum sys_event {
        SE_LOWBAT,
        SE_LANGCHG,
        SE_REGIONCHG,
+       SE_SUSPENDED_STATE,
        SE_MAX
 };
 
@@ -144,6 +146,9 @@ struct sys_op {
  */
 struct appcore {
        int state;
+       unsigned int tid;
+       bool suspended_state;
+       bool allowed_bg;
 
        const struct ui_ops *ops;
        struct sys_op sops[SE_MAX];
@@ -185,6 +190,10 @@ int appcore_set_wm_rotation(struct ui_wm_rotate* wm_rotate);
 void appcore_group_attach();
 void appcore_group_lower();
 unsigned int appcore_get_main_window(void);
+void appcore_get_app_core(struct appcore **ac);
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+int _appcore_init_suspend_dbus_handler(void *data);
+#endif
 
 #define ENV_START "APP_START_TIME"
 
index 841c0784fb0fb200e449df8c6610e5135ccfd1d1..944116043143de430fe11c422c277b57988fc4a3 100644 (file)
@@ -18,7 +18,7 @@ BuildRequires:  pkgconfig(ecore-wayland)
 %endif
 %endif
 Source1001:     app-core.manifest
-BuildRequires:  pkgconfig(dbus-1)
+BuildRequires:  pkgconfig(dbus-glib-1)
 BuildRequires:  pkgconfig(sensor)
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(aul)
@@ -89,22 +89,38 @@ Group:      Development/Libraries
 %description template
 Application basics template
 
+%if "%{?tizen_profile_name}" == "wearable"
+%define appfw_feature_background_management 1
+%else
+%if "%{?tizen_profile_name}" == "mobile"
+%define appfw_feature_background_management 1
+%else
+%if "%{?tizen_profile_name}" == "tv"
+%define appfw_feature_background_management 0
+%endif
+%endif
+%endif
 
 %prep
 %setup -q
 cp %{SOURCE1001} .
 
-
 %build
-
-%cmake . \
 %if %{with wayland}
--Dwith_wayland=TRUE\
+_WITH_WAYLAND=ON
 %endif
 %if %{with x}
--Dwith_x11=TRUE\
+_WITH_X11=ON
+%endif
+%if 0%{?appfw_feature_background_management}
+_APPFW_FEATURE_BACKGROUND_MANAGEMENT=ON
 %endif
--DENABLE_GTK=OFF
+
+%cmake . \
+       -D_WITH_WAYLAND:BOOL=${_WITH_WAYLAND} \
+       -D_WITH_X11:BOOL=${_WITH_X11} \
+       -D_APPFW_FEATURE_BACKGROUND_MANAGEMENT:BOOL=${_APPFW_FEATURE_BACKGROUND_MANAGEMENT} \
+       -DENABLE_GTK=OFF
 
 make %{?_smp_mflags}
 
index f7e7dda8a99c5989acf8b37afcd3a89322476a87..a43bc4eab76db3f77912d540547758c85a7b9f45 100644 (file)
@@ -45,6 +45,7 @@
 #include <malloc.h>
 #include <glib.h>
 #include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
 #include <stdbool.h>
 #include <aul.h>
 
@@ -78,6 +79,11 @@ struct ui_priv {
 
        Ecore_Timer *mftimer; /* Ecore Timer for memory flushing */
 
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+       struct appcore *app_core;
+       void (*prepare_to_suspend) (void *data);
+       void (*exit_from_suspend) (void *data);
+#endif
        struct appcore_ops *ops;
        void (*mfcb) (void); /* Memory Flushing Callback */
 
@@ -166,13 +172,55 @@ static void _send_to_resourced(enum proc_status_type type)
 
 static GSList *g_winnode_list;
 
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+static void __appcore_efl_prepare_to_suspend(void *data)
+{
+       struct ui_priv *ui = (struct ui_priv *)data;
+       struct sys_op *op = NULL;
+       int suspend = APPCORE_SUSPENDED_STATE_WILL_ENTER_SUSPEND;
+
+       if (ui->app_core && !ui->app_core->allowed_bg && !ui->app_core->suspended_state) {
+               op = &ui->app_core->sops[SE_SUSPENDED_STATE];
+               if (op && op->func)
+                       op->func((void *)&suspend, op->data); /* calls c-api handler */
+
+               ui->app_core->suspended_state = true;
+       }
+       _DBG("[__SUSPEND__]");
+}
+
+static void __appcore_efl_exit_from_suspend(void *data)
+{
+       struct ui_priv *ui = (struct ui_priv *)data;
+       struct sys_op *op = NULL;
+       int suspend = APPCORE_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND;
+
+       if (ui->app_core && !ui->app_core->allowed_bg && ui->app_core->suspended_state) {
+               op = &ui->app_core->sops[SE_SUSPENDED_STATE];
+               if (op && op->func)
+                       op->func((void *)&suspend, op->data); /* calls c-api handler */
+
+               ui->app_core->suspended_state = false;
+       }
+       _DBG("[__SUSPEND__]");
+}
+#endif
+
 #if defined(MEMORY_FLUSH_ACTIVATE)
 static Eina_Bool __appcore_memory_flush_cb(void *data)
 {
        struct ui_priv *ui = (struct ui_priv *)data;
 
        appcore_flush_memory();
-       ui->mftimer = NULL;
+       if (ui)
+               ui->mftimer = NULL;
+
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+       if (ui && ui->prepare_to_suspend) {
+               _DBG("[__SUSPEND__] flush case");
+               ui->prepare_to_suspend(ui);
+       }
+#endif
 
        return ECORE_CALLBACK_CANCEL;
 }
@@ -309,6 +357,14 @@ static void __do_app(enum app_event event, void *data, bundle * b)
                _DBG("[APP %d] RESET", _pid);
                ui->pending_data = bundle_dup(b);
                LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:reset:start]", ui->name);
+
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+               if (ui->exit_from_suspend) {
+                       _DBG("[__SUSPEND__] reset case");
+                       ui->exit_from_suspend(ui);
+               }
+#endif
+
                if (ui->ops->reset)
                        r = ui->ops->reset(b, ui->ops->data);
                LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:reset:done]", ui->name);
@@ -334,6 +390,13 @@ static void __do_app(enum app_event event, void *data, bundle * b)
                        ui->state = AS_PAUSED;
                        if (r >= 0 && resource_reclaiming == TRUE)
                                __appcore_timer_add(ui);
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+                       else if (r >= 0 && resource_reclaiming == FALSE
+                                       && ui->prepare_to_suspend) {
+                               _DBG("[__SUSPEND__] pause case");
+                               ui->prepare_to_suspend(ui);
+                       }
+#endif
                }
                /* TODO : rotation stop */
                /* r = appcore_pause_rotation_cb(); */
@@ -343,6 +406,13 @@ static void __do_app(enum app_event event, void *data, bundle * b)
        case AE_RESUME:
                LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:start]",
                                ui->name);
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+               if (ui->exit_from_suspend) {
+                       _DBG("[__SUSPEND__] resume case");
+                       ui->exit_from_suspend(ui);
+               }
+#endif
+
                if (ui->state == AS_PAUSED || ui->state == AS_CREATED) {
                        _DBG("[APP %d] RESUME", _pid);
 
@@ -837,6 +907,12 @@ static int __before_loop(struct ui_priv *ui, int *argc, char ***argv)
        r = appcore_init(ui->name, &efl_ops, *argc, *argv);
        _retv_if(r == -1, -1);
 
+#if _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+       appcore_get_app_core(&ac);
+       ui->app_core = ac;
+       SECURE_LOGD("[__SUSPEND__] appcore initialized, appcore addr: 0x%x", ac);
+#endif
+
        LOG(LOG_DEBUG, "LAUNCH", "[%s:Platform:appcore_init:done]", ui->name);
        if (ui->ops && ui->ops->create) {
                r = ui->ops->create(ui->ops->data);
@@ -925,6 +1001,12 @@ static int __set_data(struct ui_priv *ui, const char *name,
        ui->rot_cb_data = NULL;
        ui->rot_mode = APPCORE_RM_UNKNOWN;
 
+#ifdef  _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+       ui->app_core = NULL;
+       ui->prepare_to_suspend = __appcore_efl_prepare_to_suspend;
+       ui->exit_from_suspend = __appcore_efl_exit_from_suspend;
+#endif
+
        return 0;
 }
 
index 711629be068bd3ac2b49a1a0193646d6f2fbc211..afbef7deeff0080c15730e60c822023036bf575d 100644 (file)
 #include <tzplatform_config.h>
 #include "appcore-internal.h"
 
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#define RESOURCED_FREEZER_PATH "/Org/Tizen/Resourced/Freezer"
+#define RESOURCED_FREEZER_INTERFACE "org.tizen.resourced.freezer"
+#define RESOURCED_FREEZER_SIGNAL "FreezerState"
+#endif
+
 #define SQLITE_FLUSH_MAX               (1024*1024)
 
 #define PKGNAME_MAX 256
@@ -134,6 +143,11 @@ static struct evt_ops evtops[] = {
         },
 };
 
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+static DBusConnection *bus = NULL;
+static int __suspend_dbus_handler_initialized = 0;
+#endif
+
 static int __get_dir_name(char *dirname)
 {
        char pkg_name[PKGNAME_MAX];
@@ -421,18 +435,76 @@ static int __del_vconf(void)
        return 0;
 }
 
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+static gboolean __flush_memory(gpointer data)
+{
+       int suspend = APPCORE_SUSPENDED_STATE_WILL_ENTER_SUSPEND;
+       struct appcore *ac = (struct appcore *)data;
+
+       appcore_flush_memory();
+
+       if (!ac) {
+               return FALSE;
+       }
+       ac->tid = 0;
+
+       if (!ac->allowed_bg && !ac->suspended_state) {
+               _DBG("[__SUSPEND__] flush case");
+               __sys_do(ac, &suspend, SE_SUSPENDED_STATE);
+               ac->suspended_state = true;
+       }
+
+       return FALSE;
+}
+
+static void __add_suspend_timer(struct appcore *ac)
+{
+       ac->tid = g_timeout_add_seconds(5, __flush_memory, ac);
+}
+
+static void __remove_suspend_timer(struct appcore *ac)
+{
+       if (ac->tid > 0) {
+               g_source_remove(ac->tid);
+               ac->tid = 0;
+       }
+}
+#endif
+
 static int __aul_handler(aul_type type, bundle *b, void *data)
 {
        int ret;
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+       const char *bg = NULL;
+       struct appcore *ac = data;
+#endif
 
        switch (type) {
        case AUL_START:
                _DBG("[APP %d]     AUL event: AUL_START", _pid);
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+               bg = bundle_get_val(b, AUL_K_ALLOWED_BG);
+               if (bg && strncmp(bg, "ALLOWED_BG", strlen("ALLOWGED_BG")) == 0) {
+                       _DBG("[__SUSPEND__] allowed background");
+                        ac->allowed_bg = true;
+                        __remove_suspend_timer(data);
+               }
+#endif
+
                __app_reset(data, b);
                break;
        case AUL_RESUME:
                _DBG("[APP %d]     AUL event: AUL_RESUME", _pid);
-               if(open.callback) {
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+               bg = bundle_get_val(b, AUL_K_ALLOWED_BG);
+               if (bg && strncmp(bg, "ALLOWED_BG", strlen("ALLOWED_BG")) == 0) {
+                       _DBG("[__SUSPEND__] allowed background");
+                       ac->allowed_bg = true;
+                       __remove_suspend_timer(data);
+               }
+#endif
+
+               if (open.callback) {
                        ret = open.callback(open.cbdata);
                        if (ret == 0)
                                __app_resume(data);
@@ -442,16 +514,44 @@ static int __aul_handler(aul_type type, bundle *b, void *data)
                break;
        case AUL_TERMINATE:
                _DBG("[APP %d]     AUL event: AUL_TERMINATE", _pid);
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+               if (!ac->allowed_bg)
+                       __remove_suspend_timer(data);
+#endif
+
                __app_terminate(data);
                break;
        case AUL_TERMINATE_BGAPP:
                _DBG("[APP %d]     AUL event: AUL_TERMINATE_BGAPP", _pid);
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+               if (!ac->allowed_bg)
+                       __remove_suspend_timer(data);
+#endif
+
                __bgapp_terminate(data);
                break;
        case AUL_PAUSE:
                _DBG("[APP %d]     AUL event: AUL_PAUSE", _pid);
                __app_pause(data);
                break;
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+       case AUL_WAKE:
+               _DBG("[APP %d]     AUL event: AUL_WAKE", _pid);
+               if (!ac->allowed_bg && ac->suspended_state) {
+                       int suspend = APPCORE_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND;
+                       __remove_suspend_timer(data);
+                       __sys_do(ac, &suspend, SE_SUSPENDED_STATE);
+                       ac->suspended_state = false;
+               }
+               break;
+       case AUL_SUSPEND:
+               _DBG("[APP %d]     AUL event: AUL_SUSPEND", _pid);
+               if (!ac->allowed_bg && !ac->suspended_state) {
+                       __remove_suspend_timer(data);
+                       __flush_memory((gpointer)ac);
+               }
+               break;
+#endif
        default:
                _DBG("[APP %d]     AUL event: %d", _pid, type);
                /* do nothing */
@@ -467,6 +567,11 @@ static void __clear(struct appcore *ac)
        memset(ac, 0, sizeof(struct appcore));
 }
 
+void appcore_get_app_core(struct appcore **ac)
+{
+       *ac = &core;
+}
+
 EXPORT_API int appcore_set_open_cb(int (*cb) (void *),
                                       void *data)
 {
@@ -526,6 +631,14 @@ EXPORT_API int appcore_init(const char *name, const struct ui_ops *ops,
        r = set_i18n(name, dirname);
        _retv_if(r == -1, -1);
 
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+       r = _appcore_init_suspend_dbus_handler(&core);
+       if (r == -1) {
+               _ERR("Initailzing suspended state handler failed");
+               goto err;
+       }
+#endif
+
        r = __add_vconf(&core);
        if (r == -1) {
                _ERR("Add vconf callback failed");
@@ -546,6 +659,9 @@ EXPORT_API int appcore_init(const char *name, const struct ui_ops *ops,
 
        core.ops = ops;
        core.state = 1;         /* TODO: use enum value */
+       core.tid = 0;
+       core.suspended_state = false;
+       core.allowed_bg = false;
 
        _pid = getpid();
 
@@ -561,6 +677,9 @@ EXPORT_API void appcore_exit(void)
        if (core.state) {
                __del_vconf();
                __clear(&core);
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+               __remove_suspend_timer(&core);
+#endif
        }
        aul_finalize();
 }
@@ -598,3 +717,92 @@ EXPORT_API int appcore_flush_memory(void)
 
        return 0;
 }
+
+#ifdef _APPFW_FEATURE_BACKGROUND_MANAGEMENT
+static DBusHandlerResult __suspend_dbus_signal_filter(DBusConnection *conn,
+                                       DBusMessage *message, void *user_data)
+{
+       const char *sender;
+       const char *interface;
+       int pid;
+       int state;
+       int suspend;
+
+       DBusError error;
+       dbus_error_init(&error);
+
+       sender = dbus_message_get_sender(message);
+       if (sender == NULL)
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+       interface = dbus_message_get_interface(message);
+       if (interface == NULL) {
+               _ERR("reject by security issue - no interface\n");
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       }
+
+       if (dbus_message_is_signal(message, interface, RESOURCED_FREEZER_SIGNAL)) {
+               if (dbus_message_get_args(message, &error, DBUS_TYPE_INT32, &state,
+                                       DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID) == FALSE) {
+                       _ERR("Failed to get data: %s", error.message);
+                       dbus_error_free(&error);
+                       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+               }
+
+               if (pid == getpid() && state == 0) { //thawed
+                       suspend = APPCORE_SUSPENDED_STATE_DID_EXIT_FROM_SUSPEND;
+                       SECURE_LOGD("[__SUSPEND__] state: %d (0: thawed, 1: frozen), pid: %d", state, pid);
+
+                       struct appcore *ac = (struct appcore *)user_data;
+                       if (!ac->allowed_bg && ac->suspended_state) {
+                               __remove_suspend_timer(ac);
+                               __sys_do(user_data, &suspend, SE_SUSPENDED_STATE);
+                               ac->suspended_state = false;
+                               __add_suspend_timer(ac);
+                       }
+               }
+       }
+
+       return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+int _appcore_init_suspend_dbus_handler(void *data)
+{
+       DBusError error;
+       char rule[MAX_LOCAL_BUFSZ];
+
+       if (__suspend_dbus_handler_initialized)
+               return 0;
+
+       dbus_error_init(&error);
+       if (!bus) {
+               bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+               if (!bus) {
+                       _ERR("Failed to connect to the D-BUS daemon: %s", error.message);
+                       dbus_error_free(&error);
+                       return -1;
+               }
+       }
+       dbus_connection_setup_with_g_main(bus, NULL);
+
+       snprintf(rule, MAX_LOCAL_BUFSZ,
+                       "path='%s',type='signal',interface='%s'", RESOURCED_FREEZER_PATH, RESOURCED_FREEZER_INTERFACE);
+       /* listening to messages */
+       dbus_bus_add_match(bus, rule, &error);
+       if (dbus_error_is_set(&error)) {
+               _ERR("Fail to rule set: %s", error.message);
+               dbus_error_free(&error);
+               return -1;
+       }
+
+       if (dbus_connection_add_filter(bus, __suspend_dbus_signal_filter, data, NULL) == FALSE) {
+               _ERR("add filter fail");
+               return -1;
+       }
+
+       __suspend_dbus_handler_initialized = 1;
+       _DBG("[__SUSPEND__] suspend signal initialized");
+
+       return 0;
+}
+#endif