705c9f6766c2e0d6aa7190f34c6dba3d9f03538a
[people/mcb30/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 #include <gpxe/tables.h>
13
14 /** A process */
15 struct process {
16         /** List of processes */
17         struct list_head list;
18         /**
19          * Single-step the process
20          *
21          * This method should execute a single step of the process.
22          * Returning from this method is isomorphic to yielding the
23          * CPU to another process.
24          */
25         void ( * step ) ( struct process *process );
26         /** Reference counter
27          *
28          * If this interface is not part of a reference-counted
29          * object, this field may be NULL.
30          */
31         struct refcnt *refcnt;
32 };
33
34 extern void process_add ( struct process *process );
35 extern void process_del ( struct process *process );
36 extern void step ( void );
37
38 /**
39  * Initialise process without adding to process list
40  *
41  * @v process           Process
42  * @v step              Process' step() method
43  */
44 static inline __attribute__ (( always_inline )) void
45 process_init_stopped ( struct process *process,
46                        void ( * step ) ( struct process *process ),
47                        struct refcnt *refcnt ) {
48         process->step = step;
49         process->refcnt = refcnt;
50 }
51
52 /**
53  * Initialise process and add to process list
54  *
55  * @v process           Process
56  * @v step              Process' step() method
57  */
58 static inline __attribute__ (( always_inline )) void
59 process_init ( struct process *process,
60                void ( * step ) ( struct process *process ),
61                struct refcnt *refcnt ) {
62         process_init_stopped ( process, step, refcnt );
63         process_add ( process );
64 }
65
66 /** Permanent process table */
67 #define PERMANENT_PROCESSES "processes"
68
69 /**
70  * Declare a permanent process
71  *
72  * Permanent processes will be automatically added to the process list
73  * at initialisation time.
74  */
75 #define __permanent_process \
76         __table ( struct process, PERMANENT_PROCESSES, 01 )
77
78 #endif /* _GPXE_PROCESS_H */