| 113 | } |
| 114 | |
| 115 | static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue, |
| 116 | struct rt_work *work, rt_tick_t ticks) |
| 117 | { |
| 118 | rt_base_t level; |
| 119 | rt_err_t err = RT_EOK; |
| 120 | struct rt_work *work_tmp; |
| 121 | rt_list_t *list_tmp; |
| 122 | |
| 123 | level = rt_spin_lock_irqsave(&(queue->spinlock)); |
| 124 | /* remove list */ |
| 125 | rt_list_remove(&(work->list)); |
| 126 | work->flags = 0; |
| 127 | |
| 128 | if (ticks == 0) |
| 129 | { |
| 130 | rt_list_insert_after(queue->work_list.prev, &(work->list)); |
| 131 | work->flags |= RT_WORK_STATE_PENDING; |
| 132 | work->workqueue = queue; |
| 133 | |
| 134 | rt_completion_done(&(queue->wakeup_completion)); |
| 135 | err = RT_EOK; |
| 136 | } |
| 137 | else if (ticks < RT_TICK_MAX / 2) |
| 138 | { |
| 139 | /* insert delay work list */ |
| 140 | work->flags |= RT_WORK_STATE_SUBMITTING; |
| 141 | work->workqueue = queue; |
| 142 | work->timeout_tick = rt_tick_get() + ticks; |
| 143 | |
| 144 | list_tmp = &(queue->delayed_list); |
| 145 | for (work_tmp = rt_list_entry(list_tmp->next, struct rt_work, list); |
| 146 | &work_tmp->list != list_tmp; |
| 147 | work_tmp = rt_list_entry(work_tmp->list.next, struct rt_work, list)) |
| 148 | { |
| 149 | if ((work_tmp->timeout_tick - work->timeout_tick) < RT_TICK_MAX / 2) |
| 150 | { |
| 151 | list_tmp = &(work_tmp->list); |
| 152 | break; |
| 153 | } |
| 154 | } |
| 155 | rt_list_insert_before(list_tmp, &(work->list)); |
| 156 | |
| 157 | rt_completion_done(&(queue->wakeup_completion)); |
| 158 | err = RT_EOK; |
| 159 | } |
| 160 | else |
| 161 | { |
| 162 | err = -RT_ERROR; |
| 163 | } |
| 164 | rt_spin_unlock_irqrestore(&(queue->spinlock), level); |
| 165 | return err; |
| 166 | } |
| 167 | |
| 168 | static rt_err_t _workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work) |
| 169 | { |
no test coverage detected