It is conceivable that the process may terminate during the execution
of step(). If nothing else holds a reference to the containing
object, this would cause the object to be freed prior to returning
from step().
Add a ref_get()/ref_put() around the call to ->step() to prevent this
from happening.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
list_for_each_entry ( process, &run_queue, list ) {
list_del ( &process->list );
list_add_tail ( &process->list, &run_queue );
+ ref_get ( process->refcnt ); /* Inhibit destruction mid-step */
DBGC2 ( process, "PROCESS %p executing\n", process );
process->step ( process );
DBGC2 ( process, "PROCESS %p finished executing\n", process );
+ ref_put ( process->refcnt ); /* Allow destruction */
break;
}
}