[OpenJDK 2D-Dev] [8] request for review: 8020983: OutOfMemoryError caused by non garbage collected JPEGImageWriter Instances

Phil Race philip.race at oracle.com
Tue Jul 30 23:35:27 UTC 2013


Fine by me.

-phil.

On 7/30/2013 3:53 PM, Jim Graham wrote:
> I wasn't sure what the cinfo error exit did.  Is that like a 
> setJmp/longJmp mechanism?
>
> The new macro looks good to me from a maintainability point of view, 
> but Phil is the expert on this code...
>
>             ...jim
>
> On 7/29/13 11:53 PM, Andrew Brygin wrote:
>> Hello,
>>
>>   I have updated the fix according to the comment:
>>
>>   * split the variable declaration and the macro
>>
>>   * re-wrote the macro in suggested manner
>>
>>   Please note that the macro forces an error exit if we
>>   failed to get the io handler, so there seems to be no risk
>>   of NPE.
>>
>>   Please take a look to updated fix:
>>   http://cr.openjdk.java.net/~bae/8020983/8/webrev.02/
>>
>> Thanks,
>> Andrew
>>
>> On 7/30/2013 4:18 AM, Jim Graham wrote:
>>> One suggestion I'd add, though, is that the GET() macro is written so
>>> as to be difficult to maintain.  It both declares a variable and
>>> executes code which means it does not act like a declaration, nor does
>>> it act like a piece of code.  Also, if someone needs to create a
>>> similar type of macro later, they would have no ability to inject into
>>> any code that uses this macro.
>>>
>>> I'd separate out the variable declaration and just have the macro deal
>>> with loading the value.
>>>
>>> I also am not a fan of macros ending with an "if" statement since they
>>> leave an optional state as their residue.  If the following statement
>>> is an "else", the person using the macro may believe that the else
>>> will apply to their "if", but it would actually apply to the "if" in
>>> the macro:
>>>
>>>     if (mycondition)  MACRO(foo) else bar;
>>>
>>> In that case the "else bar;" would apply to the if inside the macro.
>>> And, using it with a closing semicolon would yeild a compile error:
>>>
>>>     if (mycondition)  MACRO(foo); else bar;
>>>
>>> would generate an exception because the else comes after a null
>>> statement due to the "};" that is expanded from the tail end of the
>>> macro body.
>>>
>>> The style guide recommends always using braces because of this type of
>>> case, but I prefer to write self-protecting macros:
>>>
>>> #define MACRO(foo) \
>>>     do { \
>>>            if (blah) stuff; \
>>>         } while (0)
>>>
>>> The semicolon that typically follows the macro invocation would turn
>>> this into a single statement compatible with just about any use in C
>>> code.
>>>
>>> Additionally, I don't have my JNI handbook with me, but looking on
>>> line I am not convinced that the follow-on JNI methods that try to
>>> call a method on the (potentially null) stream can deal with a null
>>> object to invoke on.  They don't list NPE as one of the exceptions
>>> that they throw.  Some added logic to avoid invoking on a null stream
>>> may be needed...
>>>
>>>             ...jim
>>>
>>> On 7/29/13 2:32 PM, Phil Race wrote:
>>>> Looks fine.
>>>>
>>>> -phil.
>>>>
>>>> On 7/29/2013 2:13 PM, Andrew Brygin wrote:
>>>>> Hello,
>>>>>
>>>>>  please take a look to updated fix:
>>>>>
>>>>>  http://cr.openjdk.java.net/~bae/8020983/8/webrev.01/
>>>>>
>>>>>  The name 'stream' is now eliminated.
>>>>>
>>>>>  I have verified that the change does not trigger any existing
>>>>>  regression tests for imageio jpeg.
>>>>>
>>>>> Thanks,
>>>>> Andrew
>>>>>
>>>>> On 7/29/2013 7:21 PM, Mario Torre wrote:
>>>>>> On Mon, 2013-07-29 at 19:05 +0400, Andrew Brygin wrote:
>>>>>>> Hi Mario,
>>>>>>>
>>>>>>>    thanks for the comments!
>>>>>>>
>>>>>>>    I agree that 'stream' and 'streamRef' are not appropriate names
>>>>>>> now,
>>>>>>>    because these entities point to instances of writer/reader.
>>>>>>>
>>>>>>>    However, these entities use the writer/reader only as a 
>>>>>>> holder of
>>>>>>>    certain set of I/O routines, so probably names for these 
>>>>>>> entities
>>>>>>>    should reflect their I/O nature.
>>>>>>>
>>>>>>>    Would 'ioRef' and 'input'/'output' sound better than 'stream'?
>>>>>> Hi Andrew,
>>>>>>
>>>>>> Those seems better defaults, yes.
>>>>>>
>>>>>> At first I got confused with "stream" because the struct used to 
>>>>>> hold
>>>>>> the Input/Output stream for real. I guess what really bothers me
>>>>>> though
>>>>>> is the comment:
>>>>>>
>>>>>> jweak streamRef; // ImageInputStream or ImageOutputStream
>>>>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>>> Which is misleading now :) so thanks for addressing this!
>>>>>>
>>>>>> Cheers,
>>>>>> Mario
>>>>>>
>>>>>>
>>>>>
>>>>
>>




More information about the 2d-dev mailing list