/* * Starts a oneshot timer with a timeout in seconds. */ void btu_start_timer_oneshot(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_sec) { osi_alarm_t *alarm = NULL; assert(p_tle != NULL); // Get the alarm for the timer list entry. osi_mutex_lock(&btu_oneshot_alarm_lock, OSI_MUTEX_MAX_TIMEOUT); if (!hash_map_has_key(btu_oneshot_alarm_hash_map, p_tle)) { alarm = osi_alarm_new("btu_oneshot", btu_oneshot_alarm_cb, (void *)p_tle, 0); hash_map_set(btu_oneshot_alarm_hash_map, p_tle, alarm); } osi_mutex_unlock(&btu_oneshot_alarm_lock); alarm = hash_map_get(btu_oneshot_alarm_hash_map, p_tle); if (alarm == NULL) { LOG_ERROR("%s Unable to create alarm", __func__); return; } osi_alarm_cancel(alarm); p_tle->event = type; p_tle->in_use = TRUE; // NOTE: This value is in seconds but stored in a ticks field. p_tle->ticks = timeout_sec; osi_alarm_set(alarm, (period_ms_t)(timeout_sec * 1000)); }
void btu_start_quick_timer(TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout_ticks) { osi_alarm_t *alarm = NULL; assert(p_tle != NULL); // Get the alarm for the timer list entry. osi_mutex_lock(&btu_l2cap_alarm_lock, OSI_MUTEX_MAX_TIMEOUT); if (!hash_map_has_key(btu_l2cap_alarm_hash_map, p_tle)) { alarm = osi_alarm_new("btu_l2cap", btu_l2cap_alarm_cb, (void *)p_tle, 0); hash_map_set(btu_l2cap_alarm_hash_map, p_tle, (void *)alarm); } osi_mutex_unlock(&btu_l2cap_alarm_lock); alarm = hash_map_get(btu_l2cap_alarm_hash_map, p_tle); if (alarm == NULL) { LOG_ERROR("%s Unable to create alarm", __func__); return; } osi_alarm_cancel(alarm); p_tle->event = type; p_tle->ticks = timeout_ticks; p_tle->in_use = TRUE; // The quick timer ticks are 100ms long. osi_alarm_set(alarm, (period_ms_t)(timeout_ticks * 100)); }
static void restart_command_waiting_response_timer(command_waiting_response_t *cmd_wait_q) { osi_mutex_lock(&cmd_wait_q->commands_pending_response_lock, OSI_MUTEX_MAX_TIMEOUT); if (cmd_wait_q->timer_is_set) { osi_alarm_cancel(cmd_wait_q->command_response_timer); cmd_wait_q->timer_is_set = false; } if (!list_is_empty(cmd_wait_q->commands_pending_response)) { osi_alarm_set(cmd_wait_q->command_response_timer, COMMAND_PENDING_TIMEOUT); cmd_wait_q->timer_is_set = true; } osi_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); }
void btu_free_quick_timer(TIMER_LIST_ENT *p_tle) { assert(p_tle != NULL); p_tle->in_use = FALSE; // Get the alarm for the timer list entry. osi_alarm_t *alarm = hash_map_get(btu_l2cap_alarm_hash_map, p_tle); if (alarm == NULL) { LOG_DEBUG("%s Unable to find expected alarm in hashmap", __func__); return; } osi_alarm_cancel(alarm); hash_map_erase(btu_l2cap_alarm_hash_map, p_tle); }
void btu_stop_timer_oneshot(TIMER_LIST_ENT *p_tle) { assert(p_tle != NULL); if (p_tle->in_use == FALSE) { return; } p_tle->in_use = FALSE; // Get the alarm for the timer list entry. osi_alarm_t *alarm = hash_map_get(btu_oneshot_alarm_hash_map, p_tle); if (alarm == NULL) { LOG_WARN("%s Unable to find expected alarm in hashmap", __func__); return; } osi_alarm_cancel(alarm); }
static void restart_comamnd_waiting_response_timer( command_waiting_response_t *cmd_wait_q, bool tigger_by_sending_command) { uint32_t timeout; waiting_command_t *wait_entry; if (!cmd_wait_q) { return; } if (cmd_wait_q->timer_is_set) { if (tigger_by_sending_command) { return; } //Cancel Previous command timeout timer setted when sending command osi_alarm_cancel(cmd_wait_q->command_response_timer); cmd_wait_q->timer_is_set = false; } pthread_mutex_lock(&cmd_wait_q->commands_pending_response_lock); wait_entry = (list_is_empty(cmd_wait_q->commands_pending_response) ? NULL : list_front(cmd_wait_q->commands_pending_response)); pthread_mutex_unlock(&cmd_wait_q->commands_pending_response_lock); if (wait_entry == NULL) { return; } timeout = osi_alarm_time_diff(osi_alarm_now(), wait_entry->sent_time); timeout = osi_alarm_time_diff(COMMAND_PENDING_TIMEOUT, timeout); timeout = (timeout <= COMMAND_PENDING_TIMEOUT) ? timeout : COMMAND_PENDING_TIMEOUT; cmd_wait_q->timer_is_set = true; osi_alarm_set(cmd_wait_q->command_response_timer, timeout); }