diff options
Diffstat (limited to 'gpxe/src/include/gpxe/process.h')
-rw-r--r-- | gpxe/src/include/gpxe/process.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gpxe/src/include/gpxe/process.h b/gpxe/src/include/gpxe/process.h new file mode 100644 index 00000000..8d9b109a --- /dev/null +++ b/gpxe/src/include/gpxe/process.h @@ -0,0 +1,75 @@ +#ifndef _GPXE_PROCESS_H +#define _GPXE_PROCESS_H + +/** @file + * + * Processes + * + */ + +#include <gpxe/list.h> +#include <gpxe/refcnt.h> +#include <gpxe/tables.h> + +/** A process */ +struct process { + /** List of processes */ + struct list_head list; + /** + * Single-step the process + * + * This method should execute a single step of the process. + * Returning from this method is isomorphic to yielding the + * CPU to another process. + */ + void ( * step ) ( struct process *process ); + /** Reference counter + * + * If this interface is not part of a reference-counted + * object, this field may be NULL. + */ + struct refcnt *refcnt; +}; + +extern void process_add ( struct process *process ); +extern void process_del ( struct process *process ); +extern void step ( void ); + +/** + * Initialise process without adding to process list + * + * @v process Process + * @v step Process' step() method + */ +static inline __attribute__ (( always_inline )) void +process_init_stopped ( struct process *process, + void ( * step ) ( struct process *process ), + struct refcnt *refcnt ) { + process->step = step; + process->refcnt = refcnt; +} + +/** + * Initialise process and add to process list + * + * @v process Process + * @v step Process' step() method + */ +static inline __attribute__ (( always_inline )) void +process_init ( struct process *process, + void ( * step ) ( struct process *process ), + struct refcnt *refcnt ) { + process_init_stopped ( process, step, refcnt ); + process_add ( process ); +} + +/** + * Declare a permanent process + * + * Permanent processes will be automatically added to the process list + * at initialisation time. + */ +#define __permanent_process \ + __table ( struct process, processes, 01 ) + +#endif /* _GPXE_PROCESS_H */ |