[CRIU] [PATCH 11/12] util: Compile out getpid-always when not needed
Pavel Emelyanov
xemul at virtuozzo.com
Mon Apr 24 13:09:22 PDT 2017
Some glibc-s still provide working getpid() vs clone() calls. For
such systems calling getpid syscall all the times can be speeded up.
Plus a proggie to find out whether the getpid() works OK or not.
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
criu/util.c | 3 +++
scripts/check_pid.c | 25 +++++++++++++++++++++++++
2 files changed, 28 insertions(+)
create mode 100644 scripts/check_pid.c
diff --git a/criu/util.c b/criu/util.c
index dad9386..a3929c8 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -35,6 +35,7 @@
#include <sched.h>
#include <ctype.h>
+#include "config.h"
#include "bitops.h"
#include "page.h"
#include "common/compiler.h"
@@ -1416,6 +1417,7 @@ out_munmap:
return ret;
}
+#ifndef CONFIG_GLIBC_GETPID_OK
/*
* In glibc 2.24, getpid() returns a parent PID, if a child was
* created with the CLONE_VM flag.
@@ -1424,3 +1426,4 @@ int getpid()
{
return syscall(__NR_getpid);
}
+#endif
diff --git a/scripts/check_pid.c b/scripts/check_pid.c
new file mode 100644
index 0000000..121173a
--- /dev/null
+++ b/scripts/check_pid.c
@@ -0,0 +1,25 @@
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sched.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+static int chk_pid(void *arg)
+{
+ return (getpid() != *(int *)arg) ? 0 : 1;
+}
+
+int main(int argc, char **argv)
+{
+ int pid, kid, status;
+ static char stk[2 << 12];
+
+ pid = getpid();
+ kid = clone(chk_pid, stk + sizeof(stk), CLONE_VM | SIGCHLD, &pid);
+ if (kid < 0)
+ return 1;
+ waitpid(kid, &status, 0);
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ return 1;
+ return 0;
+}
--
2.5.5
More information about the CRIU
mailing list