RFR: 8136978 Much nearly duplicated code for vmError support
Sebastian Sickelmann
sebastian.sickelmann at gmx.de
Fri Nov 20 18:52:19 UTC 2015
Hi,
I updated the webrev
http://cr.openjdk.java.net/~sebastian/8136978/webrev.05
<http://cr.openjdk.java.net/%7Esebastian/8136978/webrev.04>
I now like the patch much more than all created before for this issue.
Unfortunately it is now nearer to the not chosen alternative solutions from
http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2015-October/016048.html
and
http://mail.openjdk.java.net/pipermail/hotspot-dev/2015-October/020249.html
This is not a real problem. I learned much good thinks in the last few
weeks.
--
Sebastian
On 11/20/2015 05:38 PM, Coleen Phillimore wrote:
>
>
> On 11/20/15 10:17 AM, Thomas Stüfe wrote:
>> Hi David,
>>
>> On Fri, Nov 20, 2015 at 1:44 PM, David Holmes
>> <david.holmes at oracle.com <mailto:david.holmes at oracle.com>> wrote:
>>
>> On 20/11/2015 10:22 PM, Sebastian Sickelmann wrote:
>>
>> Hi,
>>
>> i created a new webrev with the suggested changes:
>>
>>
>> Sorry Sebastian but I remain totally opposed to the
>> os::Posix::ucontext_get_pc related changes. Moving them out of
>> the namespace for the os specific classes makes no sense to me -
>> the Posix class is for shared implementations and these have to
>> be platform specific.
>>
>>
>> I understand that, but I would have liked a version of
>> ucontext_get_pc/ucontext_set_pc outside an os-specific namespace:
>>
>> Now you have to use os::Aix::ucontext_get_pc(),
>> os::Linux::ucontext_get_pc() etc. I would love to get rid of that
>> nested platform dependend name scope and have a generic name for all,
>> be it os::Posix::uncontext_get_pc or just os::ucontext_get_pc().
>>
>> In my mind os::Posix::ucontext_get_pc() makes more sense, because
>> there is no windows version for this, and ucontext_t is Posix... but
>> I don't have strong emotions.
>
> I had this same thought looking at the code, but didn't have a better
> solution for it.
>
> Maybe we could have the call be os::Posix::ucontext_get_pc() be in
> os_posix.hpp and have ifdefs to go to
> os::Linux/Solaris/etc/::ucontext_get_pc? Like:
>
> static address ucontext_get_pc(ucontext_t* ctx) { #if
> TARGET_OS_FAMILY_solaris return Solaris::ucontext_get_pc(ctx); #else
> ... #endif }
> Maybe this would have to be in the .cpp file.
>
> This would reduce the size of the changeset and you can keep
> os::Solaris::ucontext_get_pc().
>
> Thanks,
> Coleen
>>
>> Kind Regards, Thomas
>>
>>
>>
>> Solaris can use pthread_sigmask so no need for special casing.
>>
>> Thanks,
>> David
>>
>>
>> http://cr.openjdk.java.net/~sebastian/8136978/webrev.04
>> <http://cr.openjdk.java.net/%7Esebastian/8136978/webrev.04> I
>> moved the
>> unblocking of signals to os_posix.cpp and renamed it to
>> unblock_thread_signal_mask The use of sigthreadmask is now
>> replaced with pthread_sigmask. For the remaining
>> sigthreadmask in the codebase I created JDK-8143395.
>>
>> I also removed format_debug_message and refactored the
>> content into start_debugging.
>>
>> Can some tell me why this "do {} while (true)" in
>> VMError::show_message_box is needed which i copied from the
>> original "os-dependent" implementations? Sorry, I really do
>> not understand it.
>>
>> --
>> Sebastian
>>
>> On 11/20/2015 10:49 AM, David Holmes wrote:
>>
>> On 20/11/2015 7:26 PM, Thomas Stüfe wrote:
>>
>> Hi David, On Fri, Nov 20, 2015 at 8:47 AM, David Holmes
>> <david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>
>> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>>> wrote:
>> Hi Thomas, On 20/11/2015 5:36 PM, Thomas Stüfe
>> wrote: Hi
>> David, On Fri, Nov 20, 2015 at 6:05 AM, David
>> Holmes
>> <david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>
>> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>>
>> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>
>> <mailto:david.holmes at oracle.com
>> <mailto:david.holmes at oracle.com>>>> wrote:
>> Hi Sebastian,
>> On 20/11/2015 12:50 AM, Coleen
>> Phillimore wrote:
>> JPRT is our build and test system
>> that runs all the
>> platforms we support. It
>> runs a subset of
>> our tests. It's how we integrate
>> code so
>> that no code that doesn't build and
>> pass tests can
>> get integrated. I think you
>> mean 03.
>> http://cr.openjdk.java.net/~sebastian/8136978/webrev.03/index.html
>> <http://cr.openjdk.java.net/%7Esebastian/8136978/webrev.03/index.html>
>> I'm a little confused. I would expect
>> anything in the
>> os::Posix namespace to be defined in the
>> os/posix/vm/os_posix.cpp file as it
>> is supposed
>> to be a shared implementation. Otherwise it
>> should just
>> be in the os:: namespace and have an
>> os_<os>.cpp
>> implementation - as you have here.
>> I think this
>> is a borderline case. ucontext_t is Posix, so it
>> fits into
>> os_posix.hpp nicely, but the implementation for
>> ucontext_get/set_pc() is deeply platform
>> dependend and must
>> live in platform specific files. Sorry I was
>> referring to: +
>> int os::Posix::set_thread_signal_mask_unblocked(const
>> sigset_t *set)
>> { + return pthread_sigmask(SIG_UNBLOCK, set,
>> NULL); + } Oh,
>> that. We use different APIs for setting thread signal
>> masks: aix
>> sigthreadmask linux,bsd pthread_sigmask
>> solaristhr_sigsetmask
>>
>> Solaris can use pthread_sigmask too. Given what I've been
>> doing with
>> pthread_get/setspecific I was assuming that all platforms
>> were
>> supporting the pthreads API - which of course is what
>> os::Posix
>> represents.
>>
>> Situation on AIX is confusing; there is
>> pthread_sigmask(), but for me
>> it is not clear if this is a simple alias for
>> sigprocmask(), i.e.
>> sets the signal mask for the whole process. IBM offers
>> "sigthreadmask()" instead for multihtreaded programs.
>> But I just
>> found that we use pthread_sigmask() all over the
>> place in os_aix.cpp,
>> so this needs checking. Maybe we can simply switch to
>> pthread_sigmask() for AIX.
>>
>> This suggests pthread_sigmask == sigthreadmask:
>> http://www-01.ibm.com/support/knowledgecenter/ssw_aix_53/com.ibm.aix.basetechref/doc/basetrf1/pthread_sigmask.htm%23i08219704tanab
>> Cheers, David -----
>>
>> For the implementation this means we either live with
>> 2-3 small
>> #ifdef sections in os_posix.cpp or we introduce
>> os_posix_<os>.cpp. I
>> strongly prefer the first variant, but that is a
>> matter of taste.
>> I hadn't noticed the: os::Posix::ucontext_get_pc
>> which I
>> assume is more CPU dependent than OS dependent? Both.
>> ucontext_t on
>> AIX looks different than on Linux PowerPC. Thats why the
>> implementations live in <os>_<cpu>. We
>> *could* stretch this a
>> bit by including CONTEXT (the windows
>> variant of
>> uncontext_t), typedef a common type for
>> CONTEXT/ucontext_t
>> and add implementations for windows too...
>> but I think this
>> is unnecessary. Or, we could put all
>> implementations into
>> os_posix.cpp and live with a lot of
>> #ifdefs.
>> Personally, I think Sebastians solution is ok.
>> The whole point of
>> os_posix.cpp is to define a common shared
>> implementation, with as
>> few ifdefs as possible. I really do not want to
>> see os::Posix
>> implementations in the os specific files. Need to
>> look at this
>> one more closely. Thanks, David Regards,
>> Thomas ------
>> Also os::format_debug_message looks
>> like a candidate for
>> a shared implementation as
>> well. Agreed
>> here. I even would prefer os::format_debug_message()
>> to be
>> folded somehow into os::start_debugging() and
>> be hidden from
>> sight. Kind Regards, Thomas Thanks,
>> David ----- I verified
>> all the code.
>> It looks great! I'm happy to sponsor,
>> pending another code review.
>> Thanks, Coleen On
>> 11/19/15 5:46 AM,
>> Sebastian Sickelmann wrote: Hi
>> Coleen,
>> thanks for finding those
>> errors. I am sorry i
>> missed those. It shows
>> that it is really helpful two
>> test/compile on
>> multiple platforms.
>> What is
>> JPRT? Please find the new webrev
>> here:
>> http://cr.openjdk.java.net/~sebastian/8136978/webrev.02
>> <http://cr.openjdk.java.net/%7Esebastian/8136978/webrev.02>
>> thanks,
>> Sebastian
>> On 11/19/2015 05:59 AM, Coleen
>> Phillimore wrote:
>> Hi Sebastian,
>> I
>> tested your change through JPRT and there are
>> a few
>> changes I needed
>> to
>> make to get it to pass. One
>> is that I
>> changed os::message_box to return bool
>> since that's how
>> it's used and the use in vmError.cpp made the
>> Windows
>> compiler complain.
>> Others (hope you can read tell the diffs).
>> There was
>> thr_sigsetmask
>> on
>> solaris and a couple places
>> os::format_debug_message() you had 'p'
>> rather than 'buf' and one place had 'buflen'
>> rather than
>> 80. Those
>> places
>> os::start_debugging(), it would be better to have
>> sizeof(buf)
>> rather
>> than 80. Otherwise,
>> Reviewed. If you do
>> create a changeset, I
>> will sponsor
>> after another reviewer sees it.
>> thanks,
>> Coleen
>> < ---
>> old/src/os/solaris/vm/os_solaris.cpp
>> 2015-11-18
>> 19:05:31.209186804 +0100
>> < +++
>> new/src/os/solaris/vm/os_solaris.cpp
>> 2015-11-18
>> 19:05:31.129186803 +0100
>> ---
>> diff --git
>> a/src/os/solaris/vm/os_solaris.cpp
>> b/src/os/solaris/vm/os_solaris.cpp
>> ---
>> a/src/os/solaris/vm/os_solaris.cpp
>> +++
>> b/src/os/solaris/vm/os_solaris.cpp
>> @@
>> -3611,7 +3611,7 @@ void
>> os::print_statistics() {
>> }
>> -int
>> os::message_box(const char* title,
>> const char*
>> message) {
>> +bool
>> os::message_box(const char* title,
>> const char*
>> message) {
>> int i;
>> fdStream
>> err(defaultStream::error_fd());
>> for
>> (i = 0; i < 78; i++) err.print_raw("=");
>> 195c239
>> < + return
>> sigsetmask(SIG_UNBLOCK, set, NULL);
>> ---
>> + return
>> thr_sigsetmask(SIG_UNBLOCK,
>> set, NULL); 199c243
>> < + jio_snprintf(p, buflen,
>> ---
>> +
>> jio_snprintf(buf, buflen,
>> 210c254
>> < + jio_snprintf(buf,
>> buflen, "dbx - %d",
>> os::current_process_id());
>> ---
>> +
>> jio_snprintf(buf, 80, "dbx - %d",
>> os::current_process_id()); < ---
>> old/src/os/windows/vm/os_windows.cpp 2015-11-18
>> 19:05:31.977186818 +0100
>> < +++
>> new/src/os/windows/vm/os_windows.cpp
>> 2015-11-18
>> 19:05:31.829186815 +0100
>> ---
>> diff --git
>> a/src/os/windows/vm/os_windows.cpp
>> b/src/os/windows/vm/os_windows.cpp
>> ---
>> a/src/os/windows/vm/os_windows.cpp
>> +++
>> b/src/os/windows/vm/os_windows.cpp
>> @@
>> -4005,7 +4005,7 @@ }
>> -int
>> os::message_box(const char* title,
>> const char*
>> message) {
>> +bool
>> os::message_box(const char* title,
>> const char*
>> message) {
>> int result =
>> MessageBox(NULL,
>> message, title,
>>
>> MB_YESNO |
>> MB_ICONERROR |
>> MB_SYSTEMMODAL
>> | MB_DEFAULT_DESKTOP_ONLY);
>> return result ==
>> IDYES;
>> 230a286
>> -
>> 232c288
>> < +
>> jio_snprintf(p, buflen, ---
>> + jio_snprintf(buf,
>> buflen,
>> On 11/18/15 1:15 PM,
>> Sebastian Sickelmann
>> wrote: Hi,
>> Coleen found some places where I missed some
>> refactoring due to the
>> rebase of the initial
>> patch.
>> Thanks for reporting it
>> to me.
>> I hope this here is
>> fine now on every
>> platform:
>> http://cr.openjdk.java.net/~sebastian/8136978/webrev.02/
>> <http://cr.openjdk.java.net/%7Esebastian/8136978/webrev.02/>
>> Sorry for the
>> inconvenience.
>> --
>> Sebastian
>>
>>
>
More information about the hotspot-runtime-dev
mailing list