From 18d0b316d462b258f6ea524f5b2beebf79557de1 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Fri, 24 Feb 2012 15:19:38 +0100 Subject: [PATCH] Add wait4 syscall to Noux, just blocking for now --- ports/include/noux_session/noux_session.h | 2 ++ ports/include/noux_session/sysio.h | 3 +++ ports/src/lib/libc_noux/plugin.cc | 18 ++++++++---------- ports/src/noux/main.cc | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/ports/include/noux_session/noux_session.h b/ports/include/noux_session/noux_session.h index f3a79e4fba..0f36659096 100644 --- a/ports/include/noux_session/noux_session.h +++ b/ports/include/noux_session/noux_session.h @@ -48,6 +48,7 @@ namespace Noux { SYSCALL_SELECT, SYSCALL_FORK, SYSCALL_GETPID, + SYSCALL_WAIT4, SYSCALL_INVALID = -1 }; @@ -70,6 +71,7 @@ namespace Noux { NOUX_DECL_SYSCALL_NAME(SELECT) NOUX_DECL_SYSCALL_NAME(FORK) NOUX_DECL_SYSCALL_NAME(GETPID) + NOUX_DECL_SYSCALL_NAME(WAIT4) case SYSCALL_INVALID: return 0; } return 0; diff --git a/ports/include/noux_session/sysio.h b/ports/include/noux_session/sysio.h index c04ce7a5db..449ec9eb22 100644 --- a/ports/include/noux_session/sysio.h +++ b/ports/include/noux_session/sysio.h @@ -253,6 +253,9 @@ namespace Noux { { int pid; }); SYSIO_DECL(getpid, { }, { int pid; }); + + SYSIO_DECL(wait4, { int pid; bool nohang; }, + { int pid; int status; }); }; }; }; diff --git a/ports/src/lib/libc_noux/plugin.cc b/ports/src/lib/libc_noux/plugin.cc index bd02b7c911..5d109a7446 100644 --- a/ports/src/lib/libc_noux/plugin.cc +++ b/ports/src/lib/libc_noux/plugin.cc @@ -380,19 +380,17 @@ extern "C" pid_t getpid(void) extern "C" pid_t _wait4(pid_t pid, int *status, int options, struct rusage *rusage) { - /* - * XXX dummy to accomodate the 'reap_zombie_children' function in bash - */ - if (options & WNOHANG) { - PWRN("_wait4 dummy called (with WNOHANG) - not implemented"); - return 0; + sysio()->wait4_in.pid = pid; + sysio()->wait4_in.nohang = !!(options & WNOHANG); + if (!noux()->syscall(Noux::Session::SYSCALL_WAIT4)) { + PERR("wait4 error %d", sysio()->error.general); + return -1; } - PDBG("_wait4 (pid=%d, options=0x%x) called, waiting forever...", - pid, options); + if (status) + *status = sysio()->wait4_out.status; - for (;;); - return 0; + return sysio()->wait4_out.pid; } diff --git a/ports/src/noux/main.cc b/ports/src/noux/main.cc index 648203b68b..9af6dee967 100644 --- a/ports/src/noux/main.cc +++ b/ports/src/noux/main.cc @@ -323,6 +323,24 @@ bool Noux::Child::syscall(Noux::Session::Syscall sc) return true; } + case SYSCALL_WAIT4: + { + PINF("SYSCALL_WAIT4 called"); + + /* + * XXX check if one of out children exited + */ + + if (!_sysio->wait4_in.nohang) + _blocker.down(); + + _sysio->wait4_out.pid = -1; + _sysio->wait4_out.status = 0; + + PINF("SYSCALL_WAIT4 returning"); + return true; + } + case SYSCALL_INVALID: break; } }