/src/barebox/common/workqueue.c
Line | Count | Source |
1 | | // SPDX-License-Identifier: GPL-2.0-only |
2 | | #include <common.h> |
3 | | #include <work.h> |
4 | | |
5 | | static void wq_do_pending_work(struct work_queue *wq) |
6 | 0 | { |
7 | 0 | struct work_struct *work, *tmp; |
8 | |
|
9 | 0 | list_for_each_entry_safe(work, tmp, &wq->work, list) { |
10 | 0 | if (work->delayed && get_time_ns() < work->timeout) |
11 | 0 | continue; |
12 | | |
13 | 0 | list_del(&work->list); |
14 | 0 | wq->fn(work); |
15 | 0 | } |
16 | 0 | } |
17 | | |
18 | | void wq_cancel_work(struct work_queue *wq) |
19 | 0 | { |
20 | 0 | struct work_struct *work, *tmp; |
21 | |
|
22 | 0 | list_for_each_entry_safe(work, tmp, &wq->work, list) { |
23 | 0 | list_del(&work->list); |
24 | 0 | wq->cancel(work); |
25 | 0 | } |
26 | 0 | } |
27 | | |
28 | | static LIST_HEAD(work_queues); |
29 | | |
30 | | /** |
31 | | * wq_do_all_works - do all pending work |
32 | | * |
33 | | * This calls all pending work functions |
34 | | */ |
35 | | void wq_do_all_works(void) |
36 | 0 | { |
37 | 0 | struct work_queue *wq; |
38 | |
|
39 | 0 | list_for_each_entry(wq, &work_queues, list) |
40 | 0 | wq_do_pending_work(wq); |
41 | 0 | } |
42 | | |
43 | | /** |
44 | | * wq_register - register a new work queue |
45 | | * @wq: The work queue |
46 | | */ |
47 | | void wq_register(struct work_queue *wq) |
48 | 0 | { |
49 | 0 | INIT_LIST_HEAD(&wq->work); |
50 | 0 | list_add_tail(&wq->list, &work_queues); |
51 | 0 | } |
52 | | |
53 | | /** |
54 | | * wq_unregister - unregister a work queue |
55 | | * @wq: The work queue |
56 | | */ |
57 | | void wq_unregister(struct work_queue *wq) |
58 | 0 | { |
59 | 0 | wq_cancel_work(wq); |
60 | 0 | list_del(&wq->list); |
61 | 0 | } |