Handling dbus connection failure by retrying dbus connection setup for 50 sec duration 00/95600/3
authorSanjeev Kumar <sanjeev1.k@samsung.com>
Fri, 4 Nov 2016 03:46:49 +0000 (09:16 +0530)
committerSanjeev Kumar <sanjeev1.k@samsung.com>
Mon, 7 Nov 2016 06:43:47 +0000 (12:13 +0530)
Change-Id: I37ddd74e861e2803b4567d637049fccc82128075
Signed-off-by: Sanjeev Kumar <sanjeev1.k@samsung.com>
src/e_mod_keyrouter_combination.c

index e103333..4458bae 100644 (file)
@@ -25,6 +25,8 @@
 #define DBUS_MSG_NAME "KEY_COMBINATION"\r
 #define COMBINATION_TIME_OUT 4000\r
 #define MAX_SUPPORTED_COMBINATION 255\r
+#define DBUS_CONN_RETRY_TIMEOUT 0.2\r
+#define DBUS_CONN_MAX_RETRY_COUNT 20\r
 #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0\r
 \r
 typedef unsigned long Time;\r
@@ -46,15 +48,17 @@ typedef struct _KeyCombination
 } KeyCombination;\r
 \r
 static int keyCombinationInitialize = 0;\r
+static int dbus_connection_init_retry_count = 0;\r
+static Ecore_Timer *dbus_conn_timer = NULL;\r
 KeyCombination g_key_combination;\r
 \r
-static void _e_keyrouter_dbus_connection_init();\r
+static Eina_Bool e_keyrouter_dbus_connection_init();\r
 static int _e_keyrouter_search_key_combination(int keycode, Time timestamp);\r
 static int _e_keyrouter_send_dbus_message(DBusConnection *bus, int Input);\r
 static char * _e_keyrouter_substring(char *string, int position);\r
 static int _e_keyrouter_parse_ini_config(void* user, const char* section, const char* name, const char* value);\r
 \r
-static void\r
+static Eina_Bool\r
 _e_keyrouter_dbus_connection_init()\r
 {\r
    DBusError dBus_error;\r
@@ -63,16 +67,42 @@ _e_keyrouter_dbus_connection_init()
 \r
    dbus_error_init(&dBus_error);\r
    g_key_combination.keyrouter_dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dBus_error);\r
-\r
-   if (dbus_error_is_set(&dBus_error))\r
+   if (!g_key_combination.keyrouter_dbus_conn)\r
      {\r
-        KLWRN("[DBUS-ERROR] %s",dBus_error.message);\r
-        dbus_error_free(&dBus_error);\r
+        KLWRN("[DBUS-CONNECTION-FAIL] DBUS connection is failed");\r
+        if (dbus_error_is_set(&dBus_error))\r
+          {\r
+             KLWRN("[DBUS-ERROR] %s",dBus_error.message);\r
+             dbus_error_free(&dBus_error);\r
+          }\r
+        return EINA_FALSE;\r
      }\r
+   return EINA_TRUE;\r
+}\r
 \r
-   if (!g_key_combination.keyrouter_dbus_conn)\r
+static Eina_Bool\r
+dbus_connection_init_retry_timercb()\r
+{\r
+   if (_e_keyrouter_dbus_connection_init())\r
      {\r
-        KLWRN("[DBUS-CONNECTION-FAIL] DBUS connection is failed");\r
+        keyCombinationInitialize = 1;\r
+        dbus_conn_timer = NULL;\r
+        return ECORE_CALLBACK_CANCEL;\r
+     }\r
+   else\r
+     {\r
+        if (dbus_connection_init_retry_count < DBUS_CONN_MAX_RETRY_COUNT)\r
+          {\r
+             dbus_connection_init_retry_count++;\r
+             KLWRN("Failed to init dbus conn trying again, try count %d",dbus_connection_init_retry_count);\r
+             return ECORE_CALLBACK_RENEW;\r
+          }\r
+        else\r
+          {\r
+             KLERR("Failed to init dbus connection for key combination after multiple tries");\r
+             dbus_conn_timer = NULL;\r
+             return ECORE_CALLBACK_CANCEL;\r
+          }\r
      }\r
 }\r
 \r
@@ -81,6 +111,7 @@ e_keyrouter_key_combination_init()
 {\r
    memset(&g_key_combination, 0, sizeof(g_key_combination));\r
    g_key_combination.keyrouter_dbus_conn = NULL;\r
+   dbus_conn_timer = NULL;\r
    snprintf(g_key_combination.dbusconf.path, strlen(DBUS_PATH)+1, DBUS_PATH);\r
    snprintf(g_key_combination.dbusconf.interface, strlen(DBUS_IFACE)+1, DBUS_IFACE);\r
    snprintf(g_key_combination.dbusconf.msg, strlen(DBUS_MSG_NAME)+1, DBUS_MSG_NAME);\r
@@ -93,8 +124,22 @@ e_keyrouter_key_combination_init()
      }\r
 \r
    g_key_combination.combination_timeout = COMBINATION_TIME_OUT;\r
-   _e_keyrouter_dbus_connection_init();\r
-   keyCombinationInitialize = 1;\r
+   if (_e_keyrouter_dbus_connection_init())\r
+     {\r
+        keyCombinationInitialize = 1;\r
+     }\r
+   else\r
+     {\r
+        dbus_conn_timer = ecore_timer_add(DBUS_CONN_RETRY_TIMEOUT, dbus_connection_init_retry_timercb, NULL);\r
+        if (dbus_conn_timer != NULL)\r
+          {\r
+             KLWRN("Ecore Timer added for dbus init retry ");\r
+          }\r
+        else\r
+          {\r
+             KLERR("dbus connection init failed and unable to add ecore timer callback for init retry");\r
+          }\r
+     }\r
 }\r
 \r
 static char *\r