File java-1.7.0-openjdk-fork.patch of Package java-1_7_0-openjdk.openSUSE_12.3_Update
--- icedtea-2.3.7/openjdk/hotspot/src/os/linux/vm/os_linux.cpp
+++ icedtea-2.3.7/openjdk/hotspot/src/os/linux/vm/os_linux.cpp
@@ -5374,14 +5374,6 @@ void Parker::unpark() {
extern char** environ;
-#ifndef __NR_fork
-#define __NR_fork IA32_ONLY(2) IA64_ONLY(not defined) AMD64_ONLY(57)
-#endif
-
-#ifndef __NR_execve
-#define __NR_execve IA32_ONLY(11) IA64_ONLY(1033) AMD64_ONLY(59)
-#endif
-
// Run the specified command in a separate process. Return its exit value,
// or -1 on failure (e.g. can't fork a new process).
// Unlike system(), this function can be called from signal handler. It
@@ -5392,10 +5384,11 @@ int os::fork_and_exec(char* cmd) {
// fork() in LinuxThreads/NPTL is not async-safe. It needs to run
// pthread_atfork handlers and reset pthread library. All we need is a
// separate process to execve. Make a direct syscall to fork process.
- // On IA64 there's no fork syscall, we have to use fork() and hope for
- // the best...
- pid_t pid = NOT_IA64(syscall(__NR_fork);)
- IA64_ONLY(fork();)
+#ifdef SYS_fork
+ pid_t pid = syscall(SYS_fork);
+#else
+ pid_t pid = syscall(SYS_clone, SIGCHLD, 0, 0, 0, 0);
+#endif
if (pid < 0) {
// fork failed
@@ -5409,10 +5402,7 @@ int os::fork_and_exec(char* cmd) {
// not reset by fork() (see notes above), execve() will instead kill
// every thread in the parent process. We know this is the only thread
// in the new process, so make a system call directly.
- // IA64 should use normal execve() from glibc to match the glibc fork()
- // above.
- NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);)
- IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);)
+ syscall(SYS_execve, "/bin/sh", argv, environ);
// execve failed
_exit(-1);