int xtimer_remove(xtimer_t *timer) { if (!_is_set(timer)) { return 0; } unsigned state = disableIRQ(); int res = 0; if (timer_list_head == timer) { uint32_t next; timer_list_head = timer->next; if (timer_list_head) { /* schedule callback on next timer target time */ next = timer_list_head->target - XTIMER_OVERHEAD; } else { next = _mask(0xFFFFFFFF); } _lltimer_set(next); } else { res = _remove_timer_from_list(&timer_list_head, timer) || _remove_timer_from_list(&overflow_list_head, timer) || _remove_timer_from_list(&long_list_head, timer); } timer->target = 0; timer->long_target = 0; restoreIRQ(state); return res; }
static void _remove(xtimer_t *timer) { if (timer_list_head == timer) { uint32_t next; timer_list_head = timer->next; if (timer_list_head) { /* schedule callback on next timer target time */ next = timer_list_head->target - XTIMER_OVERHEAD; } else { next = _xtimer_lltimer_mask(0xFFFFFFFF); } _lltimer_set(next); } else { if (!_remove_timer_from_list(&timer_list_head, timer)) { if (!_remove_timer_from_list(&overflow_list_head, timer)) { _remove_timer_from_list(&long_list_head, timer); } } } }