Why is fork1() exported from hotspot? (original) (raw)

Daniel D. Daugherty daniel.daugherty at oracle.com
Wed Oct 21 15:32:53 UTC 2015


On 10/20/15, 1:14 AM, Thomas Stüfe wrote:

Hi all,

on Linux we define and export "fork1()" - a stub for fork() - and "fork1" also appears in linker mapfiles for bsd and AIX. The latter, I am sure, is just a copy-paste-effect. Why do we need to define and export fork1() for non-solaris platforms? We only ever use it on Solaris. The comment in oslinux.cpp is not really enlightening: "// Something to do with the numa-aware allocator needs these symbols" Does anyone know why this is needed? Regards, Thomas

$ hg -R hotspot annot hotspot/src/os/linux/vm/os_linux.cpp | grep fork1 2072: extern "C" JNIEXPORT int fork1() { return fork(); }

$ hg -R hotspot log -r 2072 hotspot/src/os/linux/vm/os_linux.cpp changeset: 2072:d70fe6ab4436 parent: 2062:3582bf76420e user: coleenp date: Tue Feb 01 11:23:19 2011 -0500 summary: 6588413: Use -fvisibility=hidden for gcc compiles

Here's the review thread: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-January/001726.html

Here's the diff for just that file:

$ hg -R hotspot diff -r 2062 -r 2072 hotspot/src/os/linux/vm/os_linux.cpp diff -r 3582bf76420e -r d70fe6ab4436 src/os/linux/vm/os_linux.cpp --- a/src/os/linux/vm/os_linux.cpp Thu Jan 27 16:11:27 2011 -0800 +++ b/src/os/linux/vm/os_linux.cpp Tue Feb 01 11:23:19 2011 -0500 @@ -2509,8 +2509,10 @@ char *os::scan_pages(char start, char return end; }

-extern "C" void numa_warn(int number, char *where, ...) { } -extern "C" void numa_error(char *where) { } +// Something to do with the numa-aware allocator needs these symbols +extern "C" JNIEXPORT void numa_warn(int number, char *where, ...) { } +extern "C" JNIEXPORT void numa_error(char *where) { } +extern "C" JNIEXPORT int fork1() { return fork(); }

// If we are running with libnuma version > 2, then we should @@ -3483,7 +3485,7 @@ bool os::is_interrupted(Thread* thread, // Note that the VM will print warnings if it detects conflicting signal // handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers". // -extern "C" int +extern "C" JNIEXPORT int JVM_handle_linux_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized);

@@ -4678,44 +4680,6 @@ void os::pause() { } }

-extern "C" {

-/** - * NOTE: the following code is to keep the green threads code - * in the libjava.so happy. Once the green threads is removed, - * these code will no longer be needed. - / -int -jdk_waitpid(pid_t pid, int status, int options) { - return waitpid(pid, status, options); -}

-int -fork1() { - return fork(); -}

-int -jdk_sem_init(sem_t *sem, int pshared, unsigned int value) { - return sem_init(sem, pshared, value); -}

-int -jdk_sem_post(sem_t *sem) { - return sem_post(sem); -}

-int -jdk_sem_wait(sem_t *sem) { - return sem_wait(sem); -}

-int -jdk_pthread_sigmask(int how , const sigset_t* newmask, sigset_t* oldmask) { - return pthread_sigmask(how , newmask, oldmask); -}

-}

// Refer to the comments in os_solaris.cpp park-unpark. //

So fork1() used to be an "extern C" wrapper around fork() on Linux and now it is a JNIEXPORT'ed wrapper.

I don't think the addition of this comment:

+// Something to do with the numa-aware allocator needs these symbols

was meant to apply to the new JNIEXPORT of fork1(). However, it seems very strange that fork1() moved from a section that was associated with "green threads" to a section associated with "numa-aware allocator"...

Volker and Tom R are credited with doing some perf runs in the code review thread... Perhaps either of them can shed some light here?

Dan



More information about the hotspot-runtime-dev mailing list