void destroy_tap_read_thread(void) { if(pth >= 0) { btsock_thread_exit(pth); pth = -1; } }
void btsock_rfc_cleanup() { int curr_pth = pth; pth = -1; btsock_thread_exit(curr_pth); lock_slot(&slot_lock); int i; for(i = 0; i < MAX_RFC_CHANNEL; i++) { if(rfc_slots[i].id) cleanup_rfc_slot(&rfc_slots[i]); } unlock_slot(&slot_lock); }
void btsock_l2c_cleanup() { int curr_pth = pth; pth = -1; btsock_thread_exit(curr_pth); lock_slot(&slot_lock); int i; for(i = 0; i < MAX_L2C_SOCK_CHANNEL; i++) { if(l2c_slots[i].in_use) cleanup_l2c_slot(&l2c_slots[i]); } unlock_slot(&slot_lock); }
void btif_sock_cleanup(void) { if (thread_handle == -1) return; thread_stop(thread); thread_join(thread); btsock_thread_exit(thread_handle); btsock_rfc_cleanup(); btsock_sco_cleanup(); btsock_l2cap_cleanup(); thread_free(thread); thread_handle = -1; thread = NULL; }
bt_status_t btif_sock_init(void) { assert(thread_handle == -1); assert(thread == NULL); btsock_thread_init(); thread_handle = btsock_thread_create(btsock_signaled, NULL); if (thread_handle == -1) { LOG_ERROR("%s unable to create btsock_thread.", __func__); goto error; } bt_status_t status = btsock_rfc_init(thread_handle); if (status != BT_STATUS_SUCCESS) { LOG_ERROR("%s error initializing RFCOMM sockets: %d", __func__, status); goto error; } status = btsock_l2cap_init(thread_handle); if (status != BT_STATUS_SUCCESS) { LOG_ERROR("%s error initializing L2CAP sockets: %d", __func__, status); goto error; } thread = thread_new("btif_sock"); if (!thread) { LOG_ERROR("%s error creating new thread.", __func__); btsock_rfc_cleanup(); goto error; } status = btsock_sco_init(thread); if (status != BT_STATUS_SUCCESS) { LOG_ERROR("%s error initializing SCO sockets: %d", __func__, status); btsock_rfc_cleanup(); goto error; } return BT_STATUS_SUCCESS; error:; thread_free(thread); thread = NULL; if (thread_handle != -1) btsock_thread_exit(thread_handle); thread_handle = -1; return BT_STATUS_FAIL; }