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 );
* CPU to another process.
*/
void ( * step ) ( void *object );
+ /** Automatically reschedule the process */
+ int reschedule;
};
/**
#define PROC_DESC( object_type, process, _step ) { \
.offset = process_offset ( object_type, process ), \
.step = PROC_STEP ( object_type, _step ), \
+ .reschedule = 1, \
+ }
+
+/**
+ * Define a process descriptor for a process that runs only once
+ *
+ * @v object_type Containing object data type
+ * @v process Process name (i.e. field within object data type)
+ * @v step Process' step() method
+ * @ret desc Object interface descriptor
+ */
+#define PROC_DESC_ONCE( object_type, process, _step ) { \
+ .offset = process_offset ( object_type, process ), \
+ .step = PROC_STEP ( object_type, _step ), \
+ .reschedule = 0, \
}
/**
#define PROC_DESC_PURE( _step ) { \
.offset = 0, \
.step = PROC_STEP ( struct process, _step ), \
+ .reschedule = 1, \
}
extern void * __attribute__ (( pure ))