summaryrefslogtreecommitdiffstats
path: root/src/core/process.c
diff options
context:
space:
mode:
authorMichael Brown2011-06-24 15:18:48 +0200
committerMichael Brown2011-06-28 15:45:09 +0200
commitccc2655540f01cc4da018fc31fa16ce8cdb1f4b5 (patch)
treed1ba1902a58b9257ab30ec1ac643a707336dbfbb /src/core/process.c
parent[process] Pass containing object pointer to process step() methods (diff)
downloadipxe-ccc2655540f01cc4da018fc31fa16ce8cdb1f4b5.tar.gz
ipxe-ccc2655540f01cc4da018fc31fa16ce8cdb1f4b5.tar.xz
ipxe-ccc2655540f01cc4da018fc31fa16ce8cdb1f4b5.zip
[process] Add support for one-shot processes
Some processes execute only once, and exist solely in order to defer execution until after the relevant instantiator method has returned. Such processes do not need to be automatically rescheduled when executing. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/process.c')
-rw-r--r--src/core/process.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/core/process.c b/src/core/process.c
index c6660f22..4a705ef6 100644
--- a/src/core/process.c
+++ b/src/core/process.c
@@ -100,8 +100,12 @@ void step ( void ) {
ref_get ( process->refcnt ); /* Inhibit destruction mid-step */
desc = process->desc;
object = process_object ( process );
- list_del ( &process->list );
- list_add_tail ( &process->list, &run_queue );
+ if ( desc->reschedule ) {
+ list_del ( &process->list );
+ list_add_tail ( &process->list, &run_queue );
+ } else {
+ process_del ( process );
+ }
DBGC2 ( PROC_COL ( process ), "PROCESS " PROC_FMT
" executing\n", PROC_DBG ( process ) );
desc->step ( object );