#include <sys/abi.h>
#include <sys/mm/mempart.h>
-#include <hal/intc.h>
#include <sys/cpu.h>
#include <lunaix/fs/taskfs.h>
#include <lunaix/status.h>
#include <lunaix/syscall.h>
#include <lunaix/syslog.h>
-#include <lunaix/pcontext.h>
+#include <lunaix/hart_state.h>
#include <lunaix/kpreempt.h>
+#include <lunaix/generic/isrm.h>
+
#include <klibc/string.h>
struct thread empty_thread_obj;
struct cake_pile *proc_pile ,*thread_pile;
+#define root_process (sched_ctx.procs[1])
+
LOG_MODULE("SCHED")
void
sched_ctx.procs_index = to_check->process->pid;
done:
- intc_notify_eos(0);
+ isrm_notify_eos(0);
run(to_check);
fail("unexpected return from scheduler");
bed->alarm_time = seconds ? now + seconds : 0;
- struct proc_info* root_proc = sched_ctx.procs[0];
if (llist_empty(&bed->sleepers)) {
llist_append(&sched_ctx.sleepers, &bed->sleepers);
}
proc->created = clock_systime();
proc->pgid = proc->pid;
- proc->sigreg = vzalloc(sizeof(struct sigregister));
+ proc->sigreg = vzalloc(sizeof(struct sigregistry));
proc->fdtable = vzalloc(sizeof(struct v_fdtable));
proc->mm = procvm_create(proc);
// every process is the child of first process (pid=1)
if (!process->parent) {
if (likely(!kernel_process(process))) {
- process->parent = sched_ctx.procs[1];
+ process->parent = root_process;
} else {
process->parent = process;
}
cake_release(thread_pile, thread);
}
+static void
+orphan_children(struct proc_info* proc)
+{
+ struct proc_info *root;
+ struct proc_info *pos, *n;
+
+ root = root_process;
+
+ llist_for_each(pos, n, &proc->children, siblings) {
+ pos->parent = root;
+ llist_append(&root->children, &pos->siblings);
+ }
+}
+
void
delete_process(struct proc_info* proc)
{
vfree(proc->fdtable);
- signal_free_registers(proc->sigreg);
+ signal_free_registry(proc->sigreg);
procvm_mount(mm);
destory_thread(pos);
}
+ orphan_children(proc);
+
procvm_unmount_release(mm);
cake_release(proc_pile, proc);