summaryrefslogtreecommitdiffstats
path: root/src/3rdparty
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty')
-rw-r--r--src/3rdparty/forkfd/forkfd.c22
-rw-r--r--src/3rdparty/forkfd/forkfd.h9
-rw-r--r--src/3rdparty/forkfd/forkfd_freebsd.c22
-rw-r--r--src/3rdparty/forkfd/forkfd_linux.c25
4 files changed, 56 insertions, 22 deletions
diff --git a/src/3rdparty/forkfd/forkfd.c b/src/3rdparty/forkfd/forkfd.c
index 31189fa2cd..795aa9dd68 100644
--- a/src/3rdparty/forkfd/forkfd.c
+++ b/src/3rdparty/forkfd/forkfd.c
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -94,7 +94,7 @@
static int system_has_forkfd(void);
static int system_forkfd(int flags, pid_t *ppid, int *system);
-static int system_forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage);
+static int system_forkfd_wait(int ffd, struct forkfd_info *info, int ffdwoptions, struct rusage *rusage);
#define CHILDREN_IN_SMALL_ARRAY 16
#define CHILDREN_IN_BIG_ARRAY 256
@@ -225,6 +225,16 @@ static void convertStatusToForkfdInfo(int status, struct forkfd_info *info)
}
}
+static int convertForkfdWaitFlagsToWaitFlags(int ffdoptions)
+{
+ int woptions = WEXITED;
+ if (ffdoptions & FFDW_NOWAIT)
+ woptions |= WNOWAIT;
+ if (ffdoptions & FFDW_NOHANG)
+ woptions |= WNOHANG;
+ return woptions;
+}
+
static int tryReaping(pid_t pid, struct pipe_payload *payload)
{
/* reap the child */
@@ -800,14 +810,13 @@ out:
}
#endif // _POSIX_SPAWN && !FORKFD_NO_SPAWNFD
-
-int forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage)
+int forkfd_wait4(int ffd, struct forkfd_info *info, int options, struct rusage *rusage)
{
struct pipe_payload payload;
int ret;
if (system_has_forkfd())
- return system_forkfd_wait(ffd, info, rusage);
+ return system_forkfd_wait(ffd, info, options, rusage);
ret = read(ffd, &payload, sizeof(payload));
if (ret == -1)
@@ -846,10 +855,11 @@ int system_forkfd(int flags, pid_t *ppid, int *system)
return -1;
}
-int system_forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage)
+int system_forkfd_wait(int ffd, struct forkfd_info *info, int options, struct rusage *rusage)
{
(void)ffd;
(void)info;
+ (void)options;
(void)rusage;
return -1;
}
diff --git a/src/3rdparty/forkfd/forkfd.h b/src/3rdparty/forkfd/forkfd.h
index fe70371719..205928cc2b 100644
--- a/src/3rdparty/forkfd/forkfd.h
+++ b/src/3rdparty/forkfd/forkfd.h
@@ -44,13 +44,20 @@ extern "C" {
#define FFD_CHILD_PROCESS (-2)
+#define FFDW_NOHANG 1 /* WNOHANG */
+#define FFDW_NOWAIT 2 /* WNOWAIT */
+
struct forkfd_info {
int32_t code;
int32_t status;
};
int forkfd(int flags, pid_t *ppid);
-int forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage);
+int forkfd_wait4(int ffd, struct forkfd_info *info, int options, struct rusage *rusage);
+static inline int forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage)
+{
+ return forkfd_wait4(ffd, info, 0, rusage);
+}
int forkfd_close(int ffd);
#if _POSIX_SPAWN > 0
diff --git a/src/3rdparty/forkfd/forkfd_freebsd.c b/src/3rdparty/forkfd/forkfd_freebsd.c
index 77ce3fcfad..c4ca796ccd 100644
--- a/src/3rdparty/forkfd/forkfd_freebsd.c
+++ b/src/3rdparty/forkfd/forkfd_freebsd.c
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
@@ -29,6 +29,10 @@
#include "forkfd_atomic.h"
+// in forkfd.c
+static int convertForkfdWaitFlagsToWaitFlags(int ffdoptions);
+static void convertStatusToForkfdInfo(int status, struct forkfd_info *info);
+
#if __FreeBSD__ >= 10
/* On FreeBSD 10, PROCDESC was enabled by default. On v11, it's not an option
* anymore and can't be disabled. */
@@ -81,19 +85,23 @@ int system_forkfd(int flags, pid_t *ppid, int *system)
return ret;
}
-int system_forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage)
+int system_forkfd_wait(int ffd, struct forkfd_info *info, int ffdoptions, struct rusage *rusage)
{
pid_t pid;
int status;
- int options = WEXITED;
+ int options = convertForkfdWaitFlagsToWaitFlags(ffdoptions);
int ret = pdgetpid(ffd, &pid);
if (ret == -1)
return ret;
- ret = fcntl(ffd, F_GETFL);
- if (ret == -1)
- return ret;
- options |= (ret & O_NONBLOCK) ? WNOHANG : 0;
+
+ if ((options & WNOHANG) == 0) {
+ /* check if the file descriptor is non-blocking */
+ ret = fcntl(ffd, F_GETFL);
+ if (ret == -1)
+ return ret;
+ options |= (ret & O_NONBLOCK) ? WNOHANG : 0;
+ }
ret = wait4(pid, &status, options, rusage);
if (ret != -1 && info)
convertStatusToForkfdInfo(status, info);
diff --git a/src/3rdparty/forkfd/forkfd_linux.c b/src/3rdparty/forkfd/forkfd_linux.c
index 27ab09f748..87acdc3341 100644
--- a/src/3rdparty/forkfd/forkfd_linux.c
+++ b/src/3rdparty/forkfd/forkfd_linux.c
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
@@ -51,6 +51,10 @@
# define P_PIDFD 3
#endif
+// in forkfd.c
+static int convertForkfdWaitFlagsToWaitFlags(int ffdoptions);
+static void convertStatusToForkfdInfo(int status, struct forkfd_info *info);
+
static ffd_atomic_int system_forkfd_state = FFD_ATOMIC_INIT(0);
static int sys_waitid(int which, int pid_or_pidfd, siginfo_t *infop, int options,
@@ -162,15 +166,20 @@ int system_forkfd(int flags, pid_t *ppid, int *system)
return pidfd;
}
-int system_forkfd_wait(int ffd, struct forkfd_info *info, struct rusage *rusage)
+int system_forkfd_wait(int ffd, struct forkfd_info *info, int ffdoptions, struct rusage *rusage)
{
siginfo_t si;
- int options = WEXITED | __WALL;
- int ret = fcntl(ffd, F_GETFL);
- if (ret == -1)
- return ret;
- if (ret & O_NONBLOCK)
- options |= WNOHANG;
+ int ret;
+ int options = __WALL | convertForkfdWaitFlagsToWaitFlags(ffdoptions);
+
+ if ((options & WNOHANG) == 0) {
+ /* check if the file descriptor is non-blocking */
+ ret = fcntl(ffd, F_GETFL);
+ if (ret == -1)
+ return ret;
+ if (ret & O_NONBLOCK)
+ options |= WNOHANG;
+ }
ret = sys_waitid(P_PIDFD, ffd, &si, options, rusage);
if (ret == -1 && errno == ECHILD) {