[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