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