__LINK_C error_t sched_cancel_task(task_t task) { check_structs_are_valid(); error_t retVal; start_atomic(); uint8_t id = get_task_id(task); if(id == NO_TASK) retVal = EINVAL; else if(!is_scheduled(id)) retVal = EALREADY; else { if (NG(m_info)[id].prev == NO_TASK) NG(m_head)[NG(m_info)[id].priority] = NG(m_info)[id].next; else NG(m_info)[NG(m_info)[id].prev].next = NG(m_info)[id].next; if (NG(m_info)[id].next == NO_TASK) NG(m_tail)[NG(m_info)[id].priority] = NG(m_info)[id].prev; else NG(m_info)[NG(m_info)[id].next].prev = NG(m_info)[id].prev; NG(m_info)[id].prev = NO_TASK; NG(m_info)[id].next = NO_TASK; NG(m_info)[id].priority = NOT_SCHEDULED; check_structs_are_valid(); retVal = SUCCESS; } end_atomic(); return retVal; }
__LINK_C bool sched_is_scheduled(task_t task) { //INT_Disable(); start_atomic(); uint8_t task_id = get_task_id(task); bool retVal = false; if(task_id != NO_TASK) retVal = is_scheduled(task_id); //INT_Enable(); end_atomic(); return retVal; }
static i32 sched_timer_if_new(struct sw_timer *head) { i32 rv = 0; struct hwt_info *hwt = head->hwt_obj; if(true == is_scheduled(head)) goto sched_timer_if_new_exit; /* If HW timer running, then update it othewise start it */ rv = hwt_is_running(hwt)? hwt_update(hwt, &head->hwt_expires) : hwt_start(hwt, &head->hwt_expires); if(0 == rv) set_scheduled(head, true); sched_timer_if_new_exit: return rv; }
__LINK_C error_t sched_post_task_prio(task_t task, uint8_t priority) { error_t retVal; start_atomic(); check_structs_are_valid(); uint8_t task_id = get_task_id(task); if(task_id == NO_TASK) retVal = EINVAL; else if(priority > MIN_PRIORITY || priority < MAX_PRIORITY) retVal = ESIZE; else if (is_scheduled(task_id)) retVal = EALREADY; else { if(NG(m_head)[priority] == NO_TASK) { NG(m_head)[priority] = task_id; NG(m_tail)[priority] = task_id; } else { NG(m_info)[NG(m_tail)[priority]].next = task_id; NG(m_info)[task_id].prev = NG(m_tail)[priority]; NG(m_tail)[priority] = task_id; } NG(m_info)[task_id].priority = priority; //if our priority is higher than the currently known maximum priority if((priority < NG(current_priority))) NG(current_priority) = priority; check_structs_are_valid(); retVal = SUCCESS; } end_atomic(); check_structs_are_valid(); return retVal; }