Thanks!

-DrD-

> The splashscreen changes look fine to me. Approved.
> 
> --
> best regards,
> Anthony
> 
> On 5/16/2014 7:18 PM, David DeHaven wrote:
>> 
>> 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