Add pollWithRusage to Subprocess
authorVictor Loh <vloh@fb.com>
Wed, 10 May 2017 06:24:57 +0000 (23:24 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Wed, 10 May 2017 06:39:37 +0000 (23:39 -0700)
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

folly/Subprocess.cpp
folly/Subprocess.h

index b8070c071c32f55fd3df78bf69d0b10f4037b6cd..b2d9cca0d21c05385298052f45fb6f56dd2e3494 100644 (file)
@@ -22,8 +22,6 @@
 
 #if __linux__
 #include <sys/prctl.h>
-#include <sys/syscall.h>
-#include <unistd.h>
 #endif
 #include <fcntl.h>
 
@@ -45,6 +43,7 @@
 #include <folly/io/Cursor.h>
 #include <folly/portability/Sockets.h>
 #include <folly/portability/Stdlib.h>
+#include <folly/portability/SysSyscall.h>
 #include <folly/portability/Unistd.h>
 
 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:
index 2afa2382b1fd66fb9e091c29cbc9ac23eb853886..01e6d2c07ab148b833a2c2915fa0d67b4e2f6550 100644 (file)
 #include <folly/Range.h>
 #include <folly/gen/String.h>
 #include <folly/io/IOBufQueue.h>
+#include <folly/portability/SysResource.h>
 
 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.