RFR: 8136978 Much nearly duplicated code for vmError support

Sebastian Sickelmann sebastian.sickelmann at gmx.de
Fri Nov 20 20:08:34 UTC 2015


Hi,

yes of course #elif is much nicer.
Sorry David, i have read your hint regarding pthread and solaris but i
thought about aix and did not recognize the solaris in your mail at this
moment.

So now there are two enhancements, JDK-8143395 and JDK-8143558. I will
read into the topic of signals mask for pthread and solaris and aix and
maybe continue working on those.

The updated webrev is here:

http://cr.openjdk.java.net/~sebastian/8136978/webrev.06

--
Sebastian

On 11/20/2015 07:59 PM, Coleen Phillimore wrote:
>
> This is nice.  It does accomplish removing the duplicated code with
> the most direct change.     You should use #elif in os_posix.cpp
> though.   And I think one of the replies said that solaris can use
> pthread_sigmask too, although I don't know if this is equivalent myself.
>
> +int os::Posix::unblock_thread_signal_mask(const sigset_t *set) {
> +#ifndef TARGET_OS_FAMILY_solaris
> + return pthread_sigmask(SIG_UNBLOCK, set, NULL);
> +#else
> + return thr_sigsetmask(SIG_UNBLOCK, set, NULL);
> +#endif
> +}
> Now we'll see what the other's think.
>
> Coleen
>
>
> On 11/20/15 1:52 PM, Sebastian Sickelmann wrote:
>> 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