Could someone on AWT team approve the splashscreen changes?

-DrD-

> Approved.
> 
> -phil.
> 
> On 5/15/2014 9:31 AM, David DeHaven wrote:
>> Ping!
>> 
>> Does this look OK?
>> 
>> I've also filed an issue against JavaFX:
>> https://javafx-jira.kenai.com/browse/RT-37125
>> 
>> -DrD-
>> 
>>>>>> I tried not modifying libpng but still ended up with lingering 
>>>>>> references to longjmp in pngread.o, despite libpng having 
>>>>>> png_ptr->longjmp_fn (bug in libpng?). pngread.c calls setjmp to set a 
>>>>>> default location to jump to in case the caller doesn't call setjmp, so 
>>>>>> if we continue down this path something in libpng must be modified. The 
>>>>>> only other option is to create our own setjmp.h and order it before 
>>>>>> /usr/include/setjmp.h, which seems dubious at best.
>>>>>> 
>>>>>> I'm curious if the libpng changes are even needed since it's only used 
>>>>>> for splashscreen, which happens very early in the launch process. Also 
>>>>>> note that we didn't originally even call png_set_longjmp_fn, so any 
>>>>>> error should have resulted in an abort() instead of a call to longjmp... 
>>>>>> it appears we could retain the functionality we have today and #undef 
>>>>>> PNG_SETJMP_SUPPORTED (pngconf.h?). That would put the onus on developers 
>>>>>> to make sure their pngs don't have errors in them, or libsplashscreen 
>>>>>> will abort()...
>>>>>> 
>>>>>> 
>>>>> That's an interesting question and the answer might extend to the 
>>>>> splashscreen changes too.
>>>>> Its platform specific code and on MAC, the thread is created using 
>>>>> pthreads directly and that
>>>>> thread goes away once splashscreen is done. But its running at the same 
>>>>> time as the VM
>>>>> is booting up and creating threads and setting their signal masks. So I 
>>>>> don't think you can
>>>>> guarantee that it won't mess up the masks on the JRE threads if the PNG 
>>>>> is bad. And I'm
>>>>> also not sure you want to remove error handling from the library either.
>>>>> So a HIGHLY VISIBLE DO NOT REMOVE comment might be the best you can do 
>>>>> here.
>>>> I have a better idea:
>>>> 
>>>> png_default_error is the only place where png_longjmp is called. We could 
>>>> call png_set_error_fn to set up our own error handler (for Mac only), 
>>>> compile with PNG_SETJMP_SUPPORTED unset so it doesn't pull in 
>>>> setjmp/longjmp and our own implementation of the error handler would call 
>>>> _longjmp, which would jump back to where we call setjmp currently.
>>> Ok, I figured out what's going on. It's not quite intuitive...
>>> 
>>> png_jmpbuf is a macro defined in png.h, this calls png_set_longjmp_fn with 
>>> longjmp, which is why I was seeing references to longjmp in the object 
>>> file. That's what was throwing me off as it seems like it should only be 
>>> getting the jmp_buf ptr stored in the png_ptr. I guess the intention was 
>>> that setjmp/longjmp was optional, if you don't call setjmp then it just 
>>> abort()s.
>>> 
>>> 
>>> I changed splashscreen_png.c to:
>>> #ifdef __APPLE__
>>>    if (_setjmp(png_set_longjmp_fn(png_ptr, _longjmp, sizeof(jmp_buf)))) {
>>> #else
>>>    if (setjmp(png_jmpbuf(png_ptr))) {
>>> #endif
>>> 
>>> and it calls _longjmp instead. I verified this works by changing the macro 
>>> to set png_longjmp to exit() and without the above change it does indeed 
>>> exit prematurely with a bad png, with the change it reports the error but 
>>> continues to load the application as would be expected.
>>> 
>>> pngread.o still has a symbol table entry for _longjmp instead of __longjmp, 
>>> but it's benign since we're ultimately forcing it to use the correct 
>>> function. So I've left libpng completely unchanged.
>>> 
>>> 
>>> With the change and using a bad png for splashscreen, I was able to get a 
>>> stack trace once the application was running. Without the change to 
>>> splashscreen_png.c, jstack was unable to connect to the process. So 
>>> splashscreen absolutely can interfere with the signal handling.
>>> 
>>> 
>>> Updated webrev:
>>> http://cr.openjdk.java.net/~ddehaven/8026385/jdk.1/
>>> 
>>> I can look into writing a regression test for this. It might not be trivial 
>>> though since we're dealing with signal handlers, and if timing is a factor 
>>> the test may not be reliable.
>>> 
>>> -DrD-
>>> 
> 

Reply via email to