Modify process semantics; rescheduling is now automatic.
[people/pcmattman/gpxe.git] / src / include / gpxe / process.h
1 #ifndef _GPXE_PROCESS_H
2 #define _GPXE_PROCESS_H
3
4 /** @file
5  *
6  * Processes
7  *
8  */
9
10 #include <gpxe/list.h>
11 #include <gpxe/refcnt.h>
12
13 /** A process */
14 struct process {
15         /** List of processes */
16         struct list_head list;
17         /**
18          * Single-step the process
19          *
20          * This method should execute a single step of the process.
21          * Returning from this method is isomorphic to yielding the
22          * CPU to another process.
23          */
24         void ( * step ) ( struct process *process );
25         /** Reference counter
26          *
27          * If this interface is not part of a reference-counted
28          * object, this field may be NULL.
29          */
30         struct refcnt *refcnt;
31 };
32
33 extern void process_add ( struct process *process );
34 extern void process_del ( struct process *process );
35 extern void step ( void );
36
37 /**
38  * Initialise process without adding to process list
39  *
40  * @v process           Process
41  * @v step              Process' step() method
42  */
43 static inline __attribute__ (( always_inline )) void
44 process_init_stopped ( struct process *process,
45                        void ( * step ) ( struct process *process ),
46                        struct refcnt *refcnt ) {
47         process->step = step;
48         process->refcnt = refcnt;
49 }
50
51 /**
52  * Initialise process and add to process list
53  *
54  * @v process           Process
55  * @v step              Process' step() method
56  */
57 static inline __attribute__ (( always_inline )) void
58 process_init ( struct process *process,
59                void ( * step ) ( struct process *process ),
60                struct refcnt *refcnt ) {
61         process_init_stopped ( process, step, refcnt );
62         process_add ( process );
63 }
64
65 #endif /* _GPXE_PROCESS_H */