blob: 944858d76639ef8315e5d87e1ecd792ebe73c760 [file] [log] [blame]
Greg Hartman76d05dc2016-11-23 15:51:27 -08001#ifndef _GPXE_PROCESS_H
2#define _GPXE_PROCESS_H
3
4/** @file
5 *
6 * Processes
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER );
11
12#include <gpxe/list.h>
13#include <gpxe/refcnt.h>
14#include <gpxe/tables.h>
15
16/** A process */
17struct 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
36extern void process_add ( struct process *process );
37extern void process_del ( struct process *process );
38extern 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 */
46static inline __attribute__ (( always_inline )) void
47process_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 */
61static inline __attribute__ (( always_inline )) void
62process_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 */