On 2018-03-29 14:51, Thomas Stüfe wrote:
Hi Magnus,
On Thu, Mar 29, 2018 at 8:47 AM, Thomas Stüfe <thomas.stu...@gmail.com
<mailto:thomas.stu...@gmail.com>> wrote:
On Thu, Mar 29, 2018 at 12:37 AM, Magnus Ihse Bursie
<magnus.ihse.bur...@oracle.com
<mailto:magnus.ihse.bur...@oracle.com>> wrote:
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
<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?
A simple bounds check would suffice for me. At the start of the
external sigaction() and sigset(), just do a:
if (sig < 0 || sig >= NSIG) {
return -1;
}
Okay. I've added something like this (a cast was also needed, and we
should set errno if returning an error, to mimick system behaviour).
In the external signal(), do a:
if (sig < 0 || sig >= NSIG) {
return SIGERR;
}
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?
Sure!
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.
You are almost there. Lets finish this.
Oookay, I'll give it a few more cycles :)
The source looks good to me, if you add above mentioned bounds
checks. I'll build it on AIX later today (I just found out your
8200357 - which I need to build on AIX - does not apply to hs, and
I need to switch to jdk/jdk. Sigh. The unification of hs/jdk
cannot come too early.)
I'm about to give up.
I cannot build jdk/jdk on AIX since it misses a number of fixes for
all include changes which happened in hotspot lately.
On jdk/hs your libjsig change won't apply.
So I am stuck here and a bit out of time. If you want to press it, go
on push it and we fix any follow up errors on AIX after easter. I am
fine with the look of the change (modulo the sig bounds check
mentioned earlier).
I'm in no hurry to push this.
Here's an updated webrev with the bounds check in place. Let me know
if/when you can try it on AIX, and/or if you need help to get the patch
to apply. You might also have noticed that the signal tests are being
open sourced, right now, which will definitively help you. (Just a lucky
coincidence!)
Webrev: http://cr.openjdk.java.net/~ihse/JDK-8200298-unify-libjsig/webrev.07
/Magnus
Best Regards,
Thomas
..Thomas
/Magnus
Thanks, Thomas
On Wed, Mar 28, 2018 at 12:15 PM, Magnus Ihse Bursie
<magnus.ihse.bur...@oracle.com
<mailto:magnus.ihse.bur...@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.bur...@oracle.com
<mailto:magnus.ihse.bur...@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