From 1b471813a2ba287c2ace9cf6c866f330c725b99c Mon Sep 17 00:00:00 2001 From: Minep Date: Tue, 14 Jun 2022 11:05:14 +0100 Subject: [PATCH] feat: pgid support --- lunaix-os/includes/lunaix/ds/llist.h | 4 +- lunaix-os/includes/lunaix/process.h | 56 +++++++++++++++++----------- lunaix-os/includes/lunaix/status.h | 1 + lunaix-os/includes/lunaix/syscall.h | 6 --- lunaix-os/kernel/process.c | 32 ++++++++++++++++ lunaix-os/kernel/sched.c | 7 +++- 6 files changed, 74 insertions(+), 32 deletions(-) diff --git a/lunaix-os/includes/lunaix/ds/llist.h b/lunaix-os/includes/lunaix/ds/llist.h index 79fa991..1a6ec9b 100644 --- a/lunaix-os/includes/lunaix/ds/llist.h +++ b/lunaix-os/includes/lunaix/ds/llist.h @@ -57,8 +57,8 @@ llist_delete(struct llist_header* elem) elem->next->prev = elem->prev; // make elem orphaned - // elem->prev = elem; - // elem->next = elem; + elem->prev = elem; + elem->next = elem; } static inline int diff --git a/lunaix-os/includes/lunaix/process.h b/lunaix-os/includes/lunaix/process.h index 76ecacc..32b74df 100644 --- a/lunaix-os/includes/lunaix/process.h +++ b/lunaix-os/includes/lunaix/process.h @@ -1,12 +1,12 @@ #ifndef __LUNAIX_PROCESS_H #define __LUNAIX_PROCESS_H -#include #include -#include -#include #include +#include #include +#include +#include // 虽然内核不是进程,但为了区分,这里使用Pid=-1来指代内核。这主要是方便物理页所有权检查。 #define KERNEL_PID -1 @@ -20,65 +20,77 @@ #define PROC_TERMMASK 0x6 - -struct proc_mm { +struct proc_mm +{ heap_context_t u_heap; struct mm_region* regions; }; -struct proc_info { +struct proc_info +{ pid_t pid; struct proc_info* parent; isr_param intr_ctx; struct llist_header siblings; struct llist_header children; + struct llist_header grp_member; struct proc_mm mm; void* page_table; time_t created; uint8_t state; int32_t exit_code; int32_t k_status; + pid_t pgid; struct lx_timer* timer; }; extern volatile struct proc_info* __current; +pid_t +alloc_pid(); -pid_t alloc_pid(); - -void init_proc(struct proc_info *pcb); +void +init_proc(struct proc_info* pcb); /** * @brief 向系统发布一个进程,使其可以被调度。 - * - * @param process + * + * @param process */ -void push_process(struct proc_info* process); +void +push_process(struct proc_info* process); -pid_t destroy_process(pid_t pid); +pid_t +destroy_process(pid_t pid); -void setup_proc_mem(struct proc_info* proc, uintptr_t kstack_from); +void +setup_proc_mem(struct proc_info* proc, uintptr_t kstack_from); /** * @brief 复制当前进程(LunaixOS的类 fork (unix) 实现) - * + * */ -pid_t dup_proc(); +pid_t +dup_proc(); /** * @brief 创建新进程(LunaixOS的类 CreateProcess (Windows) 实现) - * + * */ -void new_proc(); +void +new_proc(); /** * @brief 终止(退出)当前进程 - * + * */ -void terminate_proc(int exit_code); +void +terminate_proc(int exit_code); -int orphaned_proc(pid_t pid); +int +orphaned_proc(pid_t pid); -struct proc_info* get_process(pid_t pid); +struct proc_info* +get_process(pid_t pid); #endif /* __LUNAIX_PROCESS_H */ diff --git a/lunaix-os/includes/lunaix/status.h b/lunaix-os/includes/lunaix/status.h index db33da2..f3309ab 100644 --- a/lunaix-os/includes/lunaix/status.h +++ b/lunaix-os/includes/lunaix/status.h @@ -7,5 +7,6 @@ #define LXOUTOFMEM -(3) #define LXINVLDPID -(4) #define LXSEGFAULT -(5) +#define LXINVL -(6) #endif /* __LUNAIX_CODE_H */ diff --git a/lunaix-os/includes/lunaix/syscall.h b/lunaix-os/includes/lunaix/syscall.h index c19d501..37aa852 100644 --- a/lunaix-os/includes/lunaix/syscall.h +++ b/lunaix-os/includes/lunaix/syscall.h @@ -20,12 +20,6 @@ void syscall_install(); -static void* -syscall(unsigned int callcode) -{ - asm volatile("int %0" ::"i"(LUNAIX_SYS_CALL), "D"(callcode) : "eax"); -} - #define asmlinkage __attribute__((regparm(0))) #define __PARAM_MAP1(t1, p1) t1 p1 diff --git a/lunaix-os/kernel/process.c b/lunaix-os/kernel/process.c index 87a7413..64f2654 100644 --- a/lunaix-os/kernel/process.c +++ b/lunaix-os/kernel/process.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -90,6 +91,36 @@ __DEFINE_LXSYSCALL(pid_t, getppid) return __current->parent->pid; } +__DEFINE_LXSYSCALL(pid_t, getpgid) +{ + return __current->pgid; +} + +__DEFINE_LXSYSCALL2(int, setpgid, pid_t, pid, pid_t, pgid) +{ + struct proc_info* proc = pid ? get_process(pid) : __current; + + if (!proc) { + __current->k_status = LXINVL; + return -1; + } + + pgid = pgid ? pgid : proc->pid; + + llist_delete(&proc->grp_member); + struct proc_info* gruppenfuhrer = get_process(pgid); + + if (!gruppenfuhrer) { + __current->k_status = LXINVL; + return -1; + } + + llist_append(&gruppenfuhrer->grp_member, &proc->grp_member); + + proc->pgid = pgid; + return 0; +} + void init_proc(struct proc_info* pcb) { @@ -98,6 +129,7 @@ init_proc(struct proc_info* pcb) pcb->pid = alloc_pid(); pcb->created = clock_systime(); pcb->state = PROC_CREATED; + pcb->pgid = pcb->pid; } pid_t diff --git a/lunaix-os/kernel/sched.c b/lunaix-os/kernel/sched.c index 442921e..e7bcd9a 100644 --- a/lunaix-os/kernel/sched.c +++ b/lunaix-os/kernel/sched.c @@ -145,11 +145,12 @@ _wait(pid_t wpid, int* status, int options) return -1; } + wpid = wpid ? wpid : -__current->pgid; cpu_enable_interrupt(); repeat: llist_for_each(proc, n, &__current->children, siblings) { - if (!~wpid || proc->pid == wpid) { + if (!~wpid || proc->pid == wpid || proc->pgid == -wpid) { if (proc->state == PROC_TERMNAT && !options) { status_flags |= PROCTERM; goto done; @@ -205,8 +206,10 @@ push_process(struct proc_info* process) process = &sched_ctx._procs[index]; - // make sure the address is in the range of process table + // make sure the reference is relative to process table llist_init_head(&process->children); + llist_init_head(&process->grp_member); + // every process is the child of first process (pid=1) if (process->parent) { llist_append(&process->parent->children, &process->siblings); -- 2.27.0