[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] libc/kernel2: Kein Busywait in waitpid()



+ kernel2: Wenn ein Kindprozess beendet wird, den Elternprozess wieder
  aufwecken

* libc: Nicht mehr busywaiten bis ein Kindprozess verschwindet, sondern
  mit wait_for_rpc() auf den passenden Exit-RPC warten. Das wurde bisher
  nicht gemacht weil der Kindprozess sich nicht zwingend sauber beendet.
  Mit der Kerneländerung bleiben wir aber auf keinen Fall mehr hängen;
  nur ein Exitcode, der uns mitteilt, was passiert ist, fehlt nach wie
  vor. Auf jeden Fall sind wir damit und mit blockierenden Reads die
  dauerhaft 100% CPU-Auslastung los.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/tasks/pm.c   | 7 +++++++
 src/modules/lib/posix/wait.c | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/kernel2/src/tasks/pm.c b/src/kernel2/src/tasks/pm.c
index bb95923..61b4626 100644
--- a/src/kernel2/src/tasks/pm.c
+++ b/src/kernel2/src/tasks/pm.c
@@ -210,6 +210,7 @@ void pm_prepare_destroy(pm_process_t* process)
  */
 void pm_destroy(pm_process_t* process)
 {
+    pm_process_t* parent = process->parent;
     struct on_destroy_info* info;
     int i;
 
@@ -270,6 +271,12 @@ void pm_destroy(pm_process_t* process)
     
     // Zu guter letzt wird auch die Prozessstruktur freigegeben
     free(process);
+
+    // Und schließlich noch den Elternprozess wieder aufwecken, falls er in
+    // einem waitpid() stecken könnte.
+    if (parent && parent->status == PM_STATUS_WAIT_FOR_RPC) {
+        parent->status = PM_STATUS_READY;
+    }
 }
 
 /**
diff --git a/src/modules/lib/posix/wait.c b/src/modules/lib/posix/wait.c
index 2f32ccb..d234c72 100644
--- a/src/modules/lib/posix/wait.c
+++ b/src/modules/lib/posix/wait.c
@@ -166,7 +166,7 @@ pid_t waitpid(pid_t pid, int* status, int options)
         // Warten bis der Prozess terminiert
         if ((options & WNOHANG) == 0) {
             while (wait_child->running && (get_parent_pid(pid) != 0)) {
-                yield();
+                wait_for_rpc();
             }
         } else if (wait_child->running) {
             return 0;
-- 
2.1.4