RFR (M): JDK-8200298 Unify all unix versions of libjsig/jsig.c

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Wed Mar 28 22:37:17 UTC 2018

On 2018-03-28 21:21, Thomas Stüfe wrote:
> Hi Magnus,
> I had a closer look at the changes, especially at jsig.c. It all comes 
> slowly back. The AIX version has been almost comically wrong.
> About NSIG, I remember that we had coding in our port which needed to 
> know the max number of signals, and this was surprisingly hard since 
> on some platforms. Sometimes NSIG does not contain the real time 
> signals. Or it did not even exist. I think we ended up hardcoding an 
> own max signal limit .
> So wherever you access sact with a signal number as index, I'd like to 
> see a bounds check. Or at least an assert - since this is plain C, a 
> C-assert would do for me (see 
> http://pubs.opengroup.org/onlinepubs/009695399/functions/assert.html). 
> This also would guard against user parameter error.
That's probably a good improvement. Do you think it could be handled as 
a follow-up bug?

> I also wonder whether this coding could not be simplified quite a bit 
> by not calling the OS versions of signal() at all but instead doing 
> all signal work via OS sigaction: after all, signal() can be 
> implemented in terms of sigaction() (with the flag SA_SIGINFO 
> cleared), and so can sigset(). This would remove the necessity of 
> reentry-handling for macos, and also remove the need for 
> save_signal_handler().
That also sounds like an excellent suggestion. Do you think it could be 
handled as a follow-up bug?
> I will test this version on AIX tomorrow. After that, I'll have some 
> vacation, but maybe someone else from my team will take over.
> I like this work, this is a good simplification.
Thanks. :)

However, it's a bit outside what I normally do. :) Not that I dislike 
writing some good old C for a change, but I'm really trying to focus on 
cleaning up the flag handling in the build system. This was just a 
side-track when I was going to make a change in the jsig.c files (for 
adding JNIEXPORT) and realized it was four almost identical copies. I 
thought it would be trivial to unify them, and if it's trivial, it's 
better to do it yourself right away, than to file a bug on someone else, 
or so my motto goes. :)

However, it turned out to be more work than I expected, and I'm losing 
interest in pushing this any further. Still, it would be a shame if the 
work I've done so far go to waste, but I'd really prefer it if someone 
else could pick up this patch and finish it.


> Thanks, Thomas
> On Wed, Mar 28, 2018 at 12:15 PM, Magnus Ihse Bursie 
> <magnus.ihse.bursie at oracle.com <mailto:magnus.ihse.bursie at oracle.com>> 
> wrote:
>     On 2018-03-27 18:24, Thomas Stüfe wrote:
>>     Hi Magnus,
>>     just a cursory look, will look in greater detail tomorrow.
>>     This is good, thanks for doing this.
>>     As I wrote offlist, please remove the painfully wrong AIX
>>     "workarounds". I do not know why we did this - the original code
>>     is quite old - my assumption is that dlsym(RTLD_NEXT) was not
>>     working as expected on older AIX versions. Well, it should work
>>     now according to IBMs manpages. Will test later.
>     Ok.
>>     __thread is not Posix. I would prefer pthread_get/set_specific
>>     instead, which is more portable.
>     I have surrounded this code with #ifdef MACOSX now.
>     Here is an updated webrev. It includes the changes requested by
>     you and David:
>     * No more AIX workarounds
>     * Solaris use pthreads
>     * The "reentry" code is #ifdef MACOSX.
>     I also assumed that NSIG is available and working on Solaris. I'll
>     let David decide if he is happy with that. The alternative is to
>     go back to the Solaris-specific code that allocates sact on the heap.
>     Webrev:
>     http://cr.openjdk.java.net/~ihse/JDK-8200298-unify-libjsig/webrev.05
>     <http://cr.openjdk.java.net/%7Eihse/JDK-8200298-unify-libjsig/webrev.05>
>     Once again, here is also a webrev that shows the difference
>     between the original files and the new, unified file. Even if it's
>     hard to read, it shows what the effects will be for each platform.
>     Webrev:
>     http://cr.openjdk.java.net/~ihse/JDK-8200298-unify-libjsig/webrev.04/
>     <http://cr.openjdk.java.net/%7Eihse/JDK-8200298-unify-libjsig/webrev.04/>
>     /Magnus
>>     Thanks!
>>     Thomas
>>     On Tue, Mar 27, 2018 at 11:42 AM, Magnus Ihse Bursie
>>     <magnus.ihse.bursie at oracle.com
>>     <mailto:magnus.ihse.bursie at oracle.com>> wrote:
>>         When I was about to update jsig.c, I noticed that the four
>>         copies for aix, linux, macosx and solaris were basically the
>>         same, with only small differences. Some of the differences
>>         were not even well motivated, but were likely the result of
>>         this code duplication causing the code to diverge.
>>         A better solution is to unify them all into a single unix
>>         version, with the few platform-specific changes handled on a
>>         per-platform basis.
>>         I've made the following notable changes:
>>         * I have removed the version check for Solaris. All other
>>         platforms seem to do fine without it, and in general, we
>>         don't mistrust other JDK libraries. An alternative is to add
>>         this version check to all other platforms instead. If you
>>         think this is the correct course of action, let me know and
>>         I'll fix it.
>>         * Solaris used to have a dynamically allocated sact, instead
>>         of a statically allocated array as all other platforms have.
>>         It's not likely to be large, and the size is known at compile
>>         time, so there seems to be no good reason for this.
>>         * Linux and macosx used a uint32_t/uint64_t instead of
>>         sigset_t for jvmsigs, as aix and solaris do. This is a less
>>         robust solution, and the added checks show that it has failed
>>         in the past. Now all platforms use sigset_t/sigismember().
>>         Also worth noting:
>>         * Solaris is not using pthreads, but it's own thread library,
>>         which accounts for most of the #ifdef SOLARIS.
>>         * In general, if an implementation was needed on one
>>         platform, but has no effect or is harmless on others, I've
>>         kept it on all platforms instead of sprinkling the code with
>>         #ifdefs.
>>         To facilitate code review, here is a specially crafted webrev
>>         that shows the differences compared to each of the
>>         individual, original per-OS versions of jsig.c:
>>         http://cr.openjdk.java.net/~ihse/JDK-8200298-unify-libjsig/webrev.01
>>         <http://cr.openjdk.java.net/%7Eihse/JDK-8200298-unify-libjsig/webrev.01>
>>         Bug: https://bugs.openjdk.java.net/browse/JDK-8200298
>>         <https://bugs.openjdk.java.net/browse/JDK-8200298>
>>         WebRev:
>>         http://cr.openjdk.java.net/~ihse/JDK-8200298-unify-libjsig/webrev.03
>>         <http://cr.openjdk.java.net/%7Eihse/JDK-8200298-unify-libjsig/webrev.03>
>>         /Magnus

More information about the hotspot-runtime-dev mailing list