MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / _workqueue_submit_work

Function _workqueue_submit_work

components/drivers/ipc/workqueue.c:115–166  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

113}
114
115static 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
168static rt_err_t _workqueue_cancel_work(struct rt_workqueue *queue, struct rt_work *work)
169{

Callers 2

rt_workqueue_doworkFunction · 0.85
rt_workqueue_submit_workFunction · 0.85

Calls 7

rt_list_removeFunction · 0.85
rt_list_insert_afterFunction · 0.85
rt_completion_doneFunction · 0.85
rt_tick_getFunction · 0.85
rt_list_insert_beforeFunction · 0.85
rt_spin_lock_irqsaveFunction · 0.50

Tested by

no test coverage detected