Recovery logic optimization. 29/130329/1
authorDeokhyun Kim <dukan.kim@samsung.com>
Mon, 22 May 2017 04:21:50 +0000 (13:21 +0900)
committerDeokhyun Kim <dukan.kim@samsung.com>
Mon, 22 May 2017 04:23:50 +0000 (13:23 +0900)
 - bt-service controls recovery logic
 - bt-service tries recovery up to 3 times
 - bt-core does NOT wait for hci InterfaceRemoved event

Change-Id: Id2ee182bc877f100cc5c7b8b84d2d86eac9573cb
Signed-off-by: Deokhyun Kim <dukan.kim@samsung.com>
bt-core/bt-core-adapter.c
bt-service/bt-service-adapter.c

index 00b9c5c..54264aa 100644 (file)
@@ -512,6 +512,13 @@ gboolean _bt_core_enable_adapter(void)
                return TRUE;
 }
 
+static gboolean __bt_core_terminate_cb(gpointer data)
+{
+       _bt_core_terminate();
+
+       return FALSE;
+}
+
 gboolean _bt_core_disable_adapter(void)
 {
        int ret;
@@ -520,6 +527,8 @@ gboolean _bt_core_disable_adapter(void)
        if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
                BT_ERR("Set vconf failed");
 
+       g_idle_add((GSourceFunc)__bt_core_terminate_cb, NULL);
+
        ret = _bt_disable_adapter();
        if (ret < 0)
                return FALSE;
index 0168758..b373a26 100644 (file)
@@ -66,6 +66,8 @@ typedef struct {
        GList *g_alarm_list;
 } bt_service_alarm_mgr_t;
 
+#define BT_RECOVERY_MAX_COUNT 3
+
 static bt_service_alarm_mgr_t alarm_mgr = {0, };
 
 static gboolean is_discovering;
@@ -77,7 +79,8 @@ static void *adapter_agent = NULL;
 static GDBusProxy *core_proxy = NULL;
 static guint timer_id = 0;
 static guint le_timer_id = 0;
-static gboolean is_recovery_mode;
+static int recovery_cnt = -1;
+static guint recovery_timer = 0;
 
 static uint status_reg_id;
 
@@ -86,6 +89,11 @@ static uint status_reg_id;
 #define BT_CORE_INTERFACE "org.projectx.btcore"
 
 #define BT_DISABLE_TIME 500 /* 500 ms */
+#ifdef TIZEN_PROFILE_WEARABLE
+#define BT_RECOVERY_TIME 2000 /*2 sec*/
+#else
+#define BT_RECOVERY_TIME 5000 /*5 sec*/
+#endif
 
 static int alarm_cb(alarm_id_t alarm_id, void* user_param);
 static void alarm_data_free(void *data);
@@ -592,16 +600,6 @@ void _bt_set_disabled(int result)
        _bt_adapter_set_status(BT_DEACTIVATED);
        _bt_set_discovery_status(FALSE);
 
-#ifndef TIZEN_FEATURE_BT_USB_DONGLE
-       if (_bt_adapter_get_le_status() != BT_LE_DEACTIVATED) {
-#endif
-               /* Send disabled event */
-               _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
-                               g_variant_new("(i)", result));
-#ifndef TIZEN_FEATURE_BT_USB_DONGLE
-       }
-#endif
-
        BT_INFO("Adapter disabled");
 }
 
@@ -781,6 +779,34 @@ static void __bt_state_event_handler(const char *event_name, bundle *data, void
        BT_DBG("bt_state: (%s)", bt_le_status);
 }
 
+static gboolean __bt_adapter_recovery_cb(gpointer data)
+{
+       int ret = 0;
+
+       BT_DBG("+");
+
+       recovery_timer = 0;
+
+       _bt_service_initialize();
+
+       ret = _bt_enable_adapter_check_status();
+       if (ret == BLUETOOTH_ERROR_NONE) {
+               ret = _bt_enable_adapter();
+               if (ret < 0)
+                       BT_ERR("_bt_enable_adapter() failed");
+
+               ret = _bt_enable_adapter_le();
+               if (ret < 0)
+                       BT_ERR("_bt_enable_adapter_le() failed");
+       }
+
+       recovery_cnt--;
+
+       BT_DBG("-");
+
+       return FALSE;
+}
+
 void _bt_handle_adapter_added(void)
 {
        BT_DBG("+");
@@ -795,6 +821,8 @@ void _bt_handle_adapter_added(void)
        }
 */
 
+       recovery_cnt = -1;
+
        status = _bt_adapter_get_status();
        le_status = _bt_adapter_get_le_status();
        BT_DBG("status : %d", status);
@@ -886,23 +914,32 @@ void _bt_handle_adapter_removed(void)
 
 /* Other unregister APIs should be placed here */
 
-
 #ifndef TIZEN_FEATURE_BT_USB_DONGLE
        _bt_destroy_agent(adapter_agent);
        adapter_agent = NULL;
 
-       if (is_recovery_mode == TRUE) {
+       if (recovery_cnt > 0) {
                /* Send disabled event */
                _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+               _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
+                       g_variant_new("(i)", BLUETOOTH_ERROR_NONE));
 
-               /* Will recover BT by bt-core, so set the mode as activating */
-               _bt_adapter_set_status(BT_ACTIVATING);
-               is_recovery_mode = FALSE;
-       } else {
-               _bt_reliable_terminate_service(NULL);
+               if (recovery_timer > 0)
+                       g_source_remove(recovery_timer);
+               recovery_timer = g_timeout_add(BT_RECOVERY_TIME,
+                               (GSourceFunc)__bt_adapter_recovery_cb, NULL);
+
+               if (eventsystem_unregister_event(status_reg_id) != ES_R_OK)
+                       BT_ERR("Fail to unregister system event");
+               return;
        }
+
+       _bt_reliable_terminate_service(NULL);
+
 #else
        _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+       _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
+               g_variant_new("(i)", BLUETOOTH_ERROR_NONE));
 #endif
 
        if (eventsystem_unregister_event(status_reg_id) != ES_R_OK)
@@ -947,6 +984,16 @@ static gboolean __bt_enable_timeout_cb(gpointer user_data)
        g_variant_unref(result);
        _bt_set_disabled(BLUETOOTH_ERROR_TIMEOUT);
 
+       if (recovery_cnt > 0) {
+               BT_ERR("Try recovery again(remain:%d)", recovery_cnt);
+               if (recovery_timer > 0)
+                       g_source_remove(recovery_timer);
+               recovery_timer = g_timeout_add(BT_RECOVERY_TIME,
+                               (GSourceFunc)__bt_adapter_recovery_cb, NULL);
+
+               return FALSE;
+       }
+
 #ifndef TIZEN_FEATURE_BT_USB_DONGLE
        _bt_terminate_service(NULL);
 #endif
@@ -989,9 +1036,9 @@ static gboolean __bt_enable_le_timeout_cb(gpointer user_data)
        }
 
        g_variant_unref(result);
-       _bt_adapter_set_le_status(BT_LE_DEACTIVATED);
 
-       _bt_set_le_disabled(BLUETOOTH_ERROR_TIMEOUT);
+       if (_bt_adapter_get_le_status() != BT_LE_DEACTIVATED)
+               _bt_set_le_disabled(BLUETOOTH_ERROR_TIMEOUT);
 
        if (_bt_adapter_get_status() == BT_DEACTIVATED)
                _bt_terminate_service(NULL);
@@ -1242,6 +1289,8 @@ static gboolean __bt_set_disabled_timeout_cb(gpointer user_data)
 {
        BT_DBG("");
        _bt_set_disabled(BLUETOOTH_ERROR_NONE);
+       _bt_send_event(BT_ADAPTER_EVENT, BLUETOOTH_EVENT_DISABLED,
+               g_variant_new("(i)", BLUETOOTH_ERROR_NONE));
 
        return FALSE;
 }
@@ -1363,9 +1412,6 @@ int _bt_disable_adapter(void)
 int _bt_recover_adapter(void)
 {
        BT_DBG("+");
-       GDBusProxy *proxy;
-       GVariant *result;
-       GError *error = NULL;
 
        if (_bt_adapter_get_status() == BT_DEACTIVATING) {
                BT_DBG("Disabling in progress");
@@ -1377,32 +1423,10 @@ int _bt_recover_adapter(void)
                return BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
        }
 
-       _bt_adapter_set_status(BT_DEACTIVATING);
-
-       proxy = __bt_get_core_proxy();
-       retv_if(!proxy, BLUETOOTH_ERROR_INTERNAL);
-
-       result = g_dbus_proxy_call_sync(proxy,
-                               "RecoverAdapter",
-                               NULL,
-                               G_DBUS_CALL_FLAGS_NONE,
-                               -1,
-                               NULL,
-                               &error);
-
-       if (!result) {
-               if (error != NULL) {
-                       BT_ERR("Failed to RecoverAdapter (Error: %s)", error->message);
-                       g_clear_error(&error);
-               } else
-                       BT_ERR("Failed to RecoverAdapter");
-               return BLUETOOTH_ERROR_INTERNAL;
-       }
-
-       is_recovery_mode = TRUE;
+       recovery_cnt = BT_RECOVERY_MAX_COUNT;
 
-       g_variant_unref(result);
-       __bt_disconnect_all();
+       _bt_disable_adapter();
+       _bt_disable_adapter_le();
 
        BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;