(S) RFR: 8139300: Internal Error (vm/utilities/debug.cpp:399), # Error: ShouldNotReachHere()

Dmitry Samersoff dmitry.samersoff at oracle.com
Wed Nov 18 12:28:18 UTC 2015


David,

Behavior of FPE is slightly different from one of pthread_kill so it
might be better to always use pthread_kill and put 331,332 under #ifdef
WINDOWS.

But it's just an opinion - I'm OK with either solution.

-Dmitry

On 2015-11-18 06:56, David Holmes wrote:
> On 17/11/2015 6:41 PM, Dmitry Samersoff wrote:
>> David,
>>
>> Do we still need:
>>
>> 331   volatile int x = 0;
>> 332   volatile int y = 1/x;
> 
> That bit is still required for windows, and probably works just fine
> everywhere except OSX.
> 
>> I guess current compiler tendency is to warn/optimize as much as
>> possible, so sooner or later we will have a warning/NOP here on all
>> platforms.
> 
> The current fix addresses all platforms but Windows. So only a future
> fix for Windows might be needed.
> 
> David
> 
>> -Dmitry
>>
>>
>> On 2015-11-12 09:33, David Holmes wrote:
>>> webrev: http://cr.openjdk.java.net/~dholmes/8139300/webrev/
>>>
>>> Bug report is not public sorry.
>>>
>>> In the crash handler test logic in the VM we have:
>>>
>>> static void crash_with_sigfpe() {
>>>     // generate a native synchronous SIGFPE where possible;
>>>     // if that did not cause a signal (e.g. on ppc), just
>>>     // raise the signal.
>>>     volatile int x = 0;
>>>     volatile int y = 1/x;
>>>   #ifndef _WIN32
>>>     raise(SIGFPE);
>>>   #endif
>>>   } // end: crash_with_sigfpe
>>>
>>> and it is used here:
>>>
>>>   402     case 15: crash_with_sigfpe(); break;
>>>   403
>>>   404     default: tty->print_cr("ERROR: %d: unexpected test_num
>>> value.",
>>> how);
>>>   405   }
>>>   406   ShouldNotReachHere();
>>>
>>> We recently updated the compiler on OSX and started seeing occasional
>>> failures of the test exercising this code, the failure mode being that
>>> we hit the ShouldNotReachHere() at line #406.
>>>
>>> It seems the new compiler may not be generating code for the "y=1/x;"**
>>> so we don't get the SIGFPE and so proceed to raise it directly. That
>>> then hits an apparent bug on OSX where raise always sends the signal to
>>> the main thread not the current thread as required by POSIX in a
>>> multi-threaded app. Consequently raise() could return and we'd hit the
>>> ShouldNotReachHere().
>>>
>>> Whether the test failed or appeared to pass depended on which thread got
>>> into the error handler first (though I'm still unclear on the finer
>>> details of that potential interaction - the other thread should have
>>> seen error reporting was already in progress by the recursively failing
>>> thread!)
>>>
>>> The solution I chose is to simply convert raise(sig) into its POSIX
>>> specified equivalent: pthread_kill(pthreead_self(), sig);
>>>
>>> I'm a little reluctant having pthread functions in a shared file, but
>>> AFAIK all our platforms supports pthreads. This also doesn't seem any
>>> worse than assuming raise() exists on all platforms. But I could add
>>> some ifdef _POSIX_C_SOURCE if there is concern (and even have a #error
>>> for unknown platforms) ?
>>>
>>> ** I'm not surprised a compiler might elide the attempted division by
>>> zero. I don't think volatile on a local has any meaning and so could
>>> easily be optimized out completely. I overlooked that in the original
>>> commit of this logic, and it worked so ...
>>>
>>> Thanks,
>>> David
>>
>>


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.


More information about the hotspot-runtime-dev mailing list