From: Victor Loh Date: Wed, 10 May 2017 06:24:57 +0000 (-0700) Subject: Add pollWithRusage to Subprocess X-Git-Tag: v2017.05.15.00~15 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=31751bbfd5578b5164bc4ed5f1e6d84d87d8a736 Add pollWithRusage to Subprocess Summary: I was looking for a way to get rusage of a particular pid because getrusage isn't good enough since it records the rusage of all the children that has been terminated (and waited for). Even though wait4 is marked as deprecated, wait3 (the cousin of wait4) is still being used in places like time. Furthermore, there is no suitable replacement to get rusage with wait*. Reviewed By: yfeldblum Differential Revision: D5008084 fbshipit-source-id: 6e511ebec7464d21309e5112aca95083e9307ea1 --- diff --git a/folly/Subprocess.cpp b/folly/Subprocess.cpp index b8070c07..b2d9cca0 100644 --- a/folly/Subprocess.cpp +++ b/folly/Subprocess.cpp @@ -22,8 +22,6 @@ #if __linux__ #include -#include -#include #endif #include @@ -45,6 +43,7 @@ #include #include #include +#include #include constexpr int kExecFailure = 127; @@ -546,11 +545,11 @@ void Subprocess::readChildErrorPipe(int pfd, const char* executable) { throw SubprocessSpawnError(executable, info.errCode, info.errnoValue); } -ProcessReturnCode Subprocess::poll() { +ProcessReturnCode Subprocess::poll(struct rusage* ru) { returnCode_.enforce(ProcessReturnCode::RUNNING); DCHECK_GT(pid_, 0); int status; - pid_t found = ::waitpid(pid_, &status, WNOHANG); + pid_t found = ::wait4(pid_, &status, WNOHANG, ru); // The spec guarantees that EINTR does not occur with WNOHANG, so the only // two remaining errors are ECHILD (other code reaped the child?), or // EINVAL (cosmic rays?), both of which merit an abort: diff --git a/folly/Subprocess.h b/folly/Subprocess.h index 2afa2382..01e6d2c0 100644 --- a/folly/Subprocess.h +++ b/folly/Subprocess.h @@ -117,6 +117,7 @@ #include #include #include +#include namespace folly { @@ -509,7 +510,7 @@ class Subprocess { * e.g. if you wait for the underlying process without going through this * Subprocess instance. */ - ProcessReturnCode poll(); + ProcessReturnCode poll(struct rusage* ru = nullptr); /** * Poll the child's status. If the process is still running, return false.