Use a linker-table based system to automatically mark and start up
[people/sha0/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 extern void init_processes ( void );
38
39 /**
40  * Initialise process without adding to process list
41  *
42  * @v process           Process
43  * @v step              Process' step() method
44  */
45 static inline __attribute__ (( always_inline )) void
46 process_init_stopped ( struct process *process,
47                        void ( * step ) ( struct process *process ),
48                        struct refcnt *refcnt ) {
49         process->step = step;
50         process->refcnt = refcnt;
51 }
52
53 /**
54  * Initialise process and add to process list
55  *
56  * @v process           Process
57  * @v step              Process' step() method
58  */
59 static inline __attribute__ (( always_inline )) void
60 process_init ( struct process *process,
61                void ( * step ) ( struct process *process ),
62                struct refcnt *refcnt ) {
63         process_init_stopped ( process, step, refcnt );
64         process_add ( process );
65 }
66
67 /**
68  * Declare a permanent process
69  *
70  * Permanent processes will be automatically added to the process list
71  * at initialisation time.
72  */
73 #define __permanent_process \
74         __table ( struct process, processes, 01 )
75
76 #endif /* _GPXE_PROCESS_H */