feat: pgid support
authorMinep <zelong56@gmail.com>
Tue, 14 Jun 2022 10:05:14 +0000 (11:05 +0100)
committerMinep <zelong56@gmail.com>
Tue, 14 Jun 2022 10:05:14 +0000 (11:05 +0100)
lunaix-os/includes/lunaix/ds/llist.h
lunaix-os/includes/lunaix/process.h
lunaix-os/includes/lunaix/status.h
lunaix-os/includes/lunaix/syscall.h
lunaix-os/kernel/process.c
lunaix-os/kernel/sched.c

index 79fa99173003797fe8dfa6f0a805576a4d506151..1a6ec9b5fc6a8377e84d7096bbdf149a8cbeff17 100644 (file)
@@ -57,8 +57,8 @@ llist_delete(struct llist_header* elem)
     elem->next->prev = elem->prev;
 
     // make elem orphaned
     elem->next->prev = elem->prev;
 
     // make elem orphaned
-    // elem->prev = elem;
-    // elem->next = elem;
+    elem->prev = elem;
+    elem->next = elem;
 }
 
 static inline int
 }
 
 static inline int
index 76ecaccf0b2884deb0460a345006aae62a7fb69b..32b74dff5397e2fe29ce13eab3ef89ea3191f317 100644 (file)
@@ -1,12 +1,12 @@
 #ifndef __LUNAIX_PROCESS_H
 #define __LUNAIX_PROCESS_H
 
 #ifndef __LUNAIX_PROCESS_H
 #define __LUNAIX_PROCESS_H
 
-#include <stdint.h>
 #include <arch/x86/interrupts.h>
 #include <arch/x86/interrupts.h>
-#include <lunaix/mm/mm.h>
-#include <lunaix/types.h>
 #include <lunaix/clock.h>
 #include <lunaix/clock.h>
+#include <lunaix/mm/mm.h>
 #include <lunaix/timer.h>
 #include <lunaix/timer.h>
+#include <lunaix/types.h>
+#include <stdint.h>
 
 // 虽然内核不是进程,但为了区分,这里使用Pid=-1来指代内核。这主要是方便物理页所有权检查。
 #define KERNEL_PID -1
 
 // 虽然内核不是进程,但为了区分,这里使用Pid=-1来指代内核。这主要是方便物理页所有权检查。
 #define KERNEL_PID -1
 
 #define PROC_TERMMASK 0x6
 
 
 #define PROC_TERMMASK 0x6
 
-
-struct proc_mm {
+struct proc_mm
+{
     heap_context_t u_heap;
     struct mm_region* regions;
 };
 
     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;
     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;
     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;
 
     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 向系统发布一个进程,使其可以被调度。
 
 /**
  * @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) 实现)
 
 /**
  * @brief 复制当前进程(LunaixOS的类 fork (unix) 实现)
- * 
+ *
  */
  */
-pid_t dup_proc();
+pid_t
+dup_proc();
 
 /**
  * @brief 创建新进程(LunaixOS的类 CreateProcess (Windows) 实现)
 
 /**
  * @brief 创建新进程(LunaixOS的类 CreateProcess (Windows) 实现)
- * 
+ *
  */
  */
-void new_proc();
+void
+new_proc();
 
 /**
  * @brief 终止(退出)当前进程
 
 /**
  * @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 */
 
 #endif /* __LUNAIX_PROCESS_H */
index db33da2d9a9697504e3fd51fbadb362c89017f5e..f3309ab3207f31f04bfda353862989b02f8ececc 100644 (file)
@@ -7,5 +7,6 @@
 #define LXOUTOFMEM -(3)
 #define LXINVLDPID -(4)
 #define LXSEGFAULT -(5)
 #define LXOUTOFMEM -(3)
 #define LXINVLDPID -(4)
 #define LXSEGFAULT -(5)
+#define LXINVL -(6)
 
 #endif /* __LUNAIX_CODE_H */
 
 #endif /* __LUNAIX_CODE_H */
index c19d5016ae01e26494734a55cf7ffb5017ea7f58..37aa852bebfd6e0a627a34c7e5c4abbf983ff7cc 100644 (file)
 void
 syscall_install();
 
 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
 #define asmlinkage __attribute__((regparm(0)))
 
 #define __PARAM_MAP1(t1, p1) t1 p1
index 87a7413c963f0db793f22f842c5c59bdaf491e50..64f2654af6a0d1b621e2cc7e1d1f71657a5fae8f 100644 (file)
@@ -5,6 +5,7 @@
 #include <lunaix/mm/vmm.h>
 #include <lunaix/process.h>
 #include <lunaix/spike.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/process.h>
 #include <lunaix/spike.h>
+#include <lunaix/status.h>
 #include <lunaix/syscall.h>
 #include <lunaix/syslog.h>
 
 #include <lunaix/syscall.h>
 #include <lunaix/syslog.h>
 
@@ -90,6 +91,36 @@ __DEFINE_LXSYSCALL(pid_t, getppid)
     return __current->parent->pid;
 }
 
     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)
 {
 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->pid = alloc_pid();
     pcb->created = clock_systime();
     pcb->state = PROC_CREATED;
+    pcb->pgid = pcb->pid;
 }
 
 pid_t
 }
 
 pid_t
index 442921ebccfb444fd13d1374988f5fdbe7cef108..e7bcd9a6d3fc5fb3a7e8b5577e9592f4ab8f8a1c 100644 (file)
@@ -145,11 +145,12 @@ _wait(pid_t wpid, int* status, int options)
         return -1;
     }
 
         return -1;
     }
 
+    wpid = wpid ? wpid : -__current->pgid;
     cpu_enable_interrupt();
 repeat:
     llist_for_each(proc, n, &__current->children, siblings)
     {
     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;
             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];
 
 
     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->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);
     // every process is the child of first process (pid=1)
     if (process->parent) {
         llist_append(&process->parent->children, &process->siblings);