3c68ff99ea
Eliminate the potential for mismatches between table names and the table entry data type by incorporating the data type into the definition of the table, rather than specifying it explicitly in each table accessor method.
78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
#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 );
|
|
}
|
|
|
|
/** Permanent process table */
|
|
#define PERMANENT_PROCESSES __table ( struct process, "processes" )
|
|
|
|
/**
|
|
* Declare a permanent process
|
|
*
|
|
* Permanent processes will be automatically added to the process list
|
|
* at initialisation time.
|
|
*/
|
|
#define __permanent_process __table_entry ( PERMANENT_PROCESSES, 01 )
|
|
|
|
#endif /* _GPXE_PROCESS_H */
|