Bladeren bron

style: simplify code

greatbridf 2 jaren geleden
bovenliggende
commit
f4fa88196f
3 gewijzigde bestanden met toevoegingen van 18 en 33 verwijderingen
  1. 0 8
      include/kernel/process.hpp
  2. 12 6
      src/kernel/process.cpp
  3. 6 19
      src/kernel/syscall.cpp

+ 0 - 8
include/kernel/process.hpp

@@ -79,14 +79,6 @@ inline void next_task(types::list<thread*>::iterator_type target)
 extern "C" void NORETURN to_kernel(interrupt_stack* ret_stack);
 extern "C" void NORETURN to_user(interrupt_stack* ret_stack);
 
-inline void NORETURN context_jump(bool system, interrupt_stack* intrpt_stack)
-{
-    if (system)
-        to_kernel(intrpt_stack);
-    else
-        to_user(intrpt_stack);
-}
-
 process* findproc(pid_t pid);
 
 void k_new_thread(void (*func)(void*), void* data);

+ 12 - 6
src/kernel/process.cpp

@@ -21,7 +21,7 @@
 
 static bool is_scheduler_ready;
 static types::list<process>* processes;
-static types::hash_map<pid_t, process*, types::linux_hasher<pid_t>>* idx_processes;
+static types::hash_map<pid_t, types::list<process>::iterator_type, types::linux_hasher<pid_t>>* idx_processes;
 static types::list<thread*>* ready_thds;
 static pid_t max_pid;
 static void (*volatile kthreadd_new_thd_func)(void*);
@@ -247,7 +247,7 @@ void process_context_load(interrupt_stack*, process* proc)
 void add_to_process_list(process&& proc)
 {
     auto iter = processes->emplace_back(types::move(proc));
-    idx_processes->insert(iter->pid, iter.ptr());
+    idx_processes->insert(iter->pid, iter);
 
     auto children = idx_child_processes->find(iter->ppid);
     if (!children) {
@@ -282,7 +282,7 @@ types::list<thread*>::iterator_type query_next_thread(void)
 
 process* findproc(pid_t pid)
 {
-    return idx_processes->find(pid)->value;
+    return idx_processes->find(pid)->value.ptr();
 }
 
 void do_scheduling(interrupt_stack* intrpt_data)
@@ -300,13 +300,19 @@ void do_scheduling(interrupt_stack* intrpt_data)
 
     process* proc = thd->owner;
     if (current_process != proc) {
-        process_context_save(intrpt_data, current_process);
+        if (current_process)
+            process_context_save(intrpt_data, current_process);
         process_context_load(intrpt_data, proc);
     }
 
-    thread_context_save(intrpt_data, current_thread);
+    if (current_thread)
+        thread_context_save(intrpt_data, current_thread);
     thread_context_load(intrpt_data, thd);
 
     next_task(iter_thd);
-    context_jump(thd->attr.system, intrpt_data);
+
+    if (thd->attr.system)
+        to_kernel(intrpt_data);
+    else
+        to_user(intrpt_data);
 }

+ 6 - 19
src/kernel/syscall.cpp

@@ -92,16 +92,12 @@ void _syscall_exit(interrupt_stack* data)
     // clear threads
     remove_from_ready_list(current_thread);
     current_process->thds.clear();
+    current_thread = nullptr;
 
     // TODO: write back mmap'ped files and close them
 
-    // unmap all memory areas
-    auto& mms = current_process->mms;
-
-    unmap_user_space_memory(mms);
-
-    pd_t old_pd = mms.begin()->pd;
-    current_process->mms.clear();
+    // unmap all memory areas except kernel heap
+    unmap_user_space_memory(current_process->mms);
 
     // make child processes orphans (children of init)
     auto children = idx_child_processes->find(current_process->pid);
@@ -111,21 +107,12 @@ void _syscall_exit(interrupt_stack* data)
         idx_child_processes->remove(children);
     }
 
+    current_process = nullptr;
+
     // TODO: notify parent process and init
 
     // switch to new process and continue
-    auto iter_next_thd = query_next_thread();
-    auto* next_thd = *iter_next_thd;
-
-    process_context_load(data, next_thd->owner);
-    thread_context_load(data, next_thd);
-
-    next_task(iter_next_thd);
-
-    // destroy page directory
-    dealloc_pd(old_pd);
-
-    context_jump(next_thd->attr.system, data);
+    do_scheduling(data);
 }
 
 void init_syscall(void)