diff --git a/kernel/exit.c b/kernel/exit.c index 08b0df2566aeb55baa8bec80f3271ac93275a6f5..35b90b54afb7e0e03ec2b00797f75e7d226a47ee 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -791,9 +791,6 @@ void __noreturn do_exit(long code) // inform the pb-scheduler knows which syscall triggered the scheduling rq->pb.triggering_syscall.type = sched_trig_EXIT; rq->pb.triggering_syscall.origin = current; - - // inform the plan runtime state - plan_rt_state_incr_num_exited_procs(); } // call the readout before the process is terminated diff --git a/kernel/sched/pb.c b/kernel/sched/pb.c index 6563a62e4d27c2b99b064258f85026d25ef91038..2b73632a2eefbcd7976cd055438f445e1a927839 100644 --- a/kernel/sched/pb.c +++ b/kernel/sched/pb.c @@ -239,6 +239,13 @@ static void dequeue_task_pb(struct rq *rq, struct task_struct *p, int flags) // remove the exited process from the stack and run the next available plan_rt_state_pop(); process_exited = true; + + // only mark the process as exited if it is not expected to do more tasks + // (if it would still have child tasks it would be a premature exit) + if (cur_node && !cur_node->children) { + plan_rt_state_incr_num_exited_procs(); + } + //terminate_perf_event(get_pevent_by_pid(prev_proc->pid)); plan_rt_state_debug_print();