VMMCP: initialization
[akaros.git] / kern / include / taskqueue.h
1 /* Copyright (c) 2015 Google Inc
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Hacked BSD taskqueues.  In lieu of actually running a kproc or something that
6  * sleeps on a queue of tasks, we'll just blast out a kmsg.  We can always
7  * change the implementation if we need more control.
8  * 
9  * 
10  * Linux workqueue wrappers:
11  *
12  * Caveats:
13  * - Workqueues have no core affinity or anything.  queued work goes to the
14  * calling core.  Scheduled work goes to core 0.
15  * - There are no extra delays in time.  All work are RKMs.
16  * - You can't cancel a message.  The differences btw work and delayed_work
17  * aren't entirely clear.
18  */
19
20 #ifndef ROS_KERN_TASKQUEUE_H
21 #define ROS_KERN_TASKQUEUE_H
22
23 typedef void (*task_fn_t)(void *context, int pending);
24 struct taskqueue {};
25 struct task {
26         task_fn_t                                       ta_func;                /*      task handler */
27         void                                            *ta_context;    /*      argument for handler */
28 };
29
30 #define taskqueue_drain(x, y)
31 #define taskqueue_free(x)
32 #define taskqueue_create(a, b, c, d) ((struct taskqueue*)(0xcafebabe))
33 #define taskqueue_create_fast taskqueue_create
34 #define taskqueue_start_threads(a, b, c, d, e) (1)
35
36 int taskqueue_enqueue(struct taskqueue *queue, struct task *task);
37 /* We're already fast, no need for another ufnction! (sic) */
38 #define taskqueue_enqueue_fast taskqueue_enqueue
39 #define TASK_INIT(str, dummy, func, arg)                                       \
40         (str)->ta_func = func;                                                     \
41         (str)->ta_context = (void*)arg;
42
43 struct workqueue_struct {
44 };
45
46 struct work_struct {
47         void (*func)(struct work_struct *);
48         /* TODO: args and bookkeeping to support cancel{,_sync}. */
49         void *arg;
50 };
51
52 /* Delayed work is embedded in other structs.  Handlers will expect to get a
53  * work_struct pointer. */
54 struct delayed_work {
55         struct work_struct                      work;
56         /* TODO: support for the actual alarm / timer */
57 };
58
59 #define INIT_DELAYED_WORK(dwp, funcp) (dwp)->work.func = (funcp)
60 #define INIT_WORK(wp, funcp) (wp)->func = (funcp)
61 void flush_workqueue(struct workqueue_struct *wq);
62 void destroy_workqueue(struct workqueue_struct *wq);
63 struct workqueue_struct *create_singlethread_workqueue(char *name);
64
65 bool queue_work(struct workqueue_struct *wq, struct work_struct *dwork);
66 bool schedule_work(struct work_struct *dwork);
67 bool cancel_work(struct work_struct *dwork);
68 bool cancel_work_sync(struct work_struct *dwork);
69
70 bool queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork,
71                         unsigned long delay);
72 bool schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);
73 bool cancel_delayed_work(struct delayed_work *dwork);
74 bool cancel_delayed_work_sync(struct delayed_work *dwork);
75
76 #endif /* ROS_KERN_TASKQUEUE_H */