[8] Please review my fix for 7124247: [macosx] Implement GraphicsDevice.setDisplayMode()

Alexander Zuev alexander.zuev at oracle.com
Mon Jun 4 11:18:49 PDT 2012


Mike,

   thanks for a superb review. See comments inline.

With best regards,
Alex

On 6/1/12 23:18, Mike Swingler wrote:
> A few notes here:
>
> 1. getBestModeForParameters() should be called copyBestModeForParameters()
> 	- This is to pass the static-analyzer to validate that the retain/release balance is correct: copy implies returning a retained object, get implies non-retained. In this case you are returning a retained object that needs to be released.
I wasn't aware that static-analyzer takes into account the function 
names. Anyways - in this case you are quite wrong. I'm not creating any 
new objects here. What i get as a parameter is an array of the 
references (pointers) and i'm returning one of them
that satisfy the conditions based on the other parameters passed. There 
is no need in releasing the object referred by that
pointer - quite contrary if i DO release closestMatch in the 
Java_sun_awt_CGraphicsDevice_nativeSetDisplayMode then next
time i try to set the same display mode i will get the nice application 
crash. Something like this:

0   libsystem_kernel.dylib            0x00007fff85c55ce2 __pthread_kill + 10
1   libsystem_c.dylib                 0x00007fff8b42e7d2 pthread_kill + 95
2   libsystem_c.dylib                 0x00007fff8b41fa7a abort + 143
3   libjvm.dylib                      0x0000000102fadb79 os::abort(bool) 
+ 25
4   libjvm.dylib                      0x0000000103099dd0 
VMError::report_and_die() + 2306
5   libjvm.dylib                      0x0000000102faf255 
JVM_handle_bsd_signal + 1047
6   libsystem_c.dylib                 0x00007fff8b480cfa _sigtramp + 26
7   com.apple.CoreFoundation          0x00007fff8d125877 
CFDictionaryGetValue + 23
8   com.apple.CoreGraphics            0x00007fff83b0daec 
CGDisplayModeGetResolution + 40
9   com.apple.CoreGraphics            0x00007fff83b0f84f 
CGDisplayCopyAllDisplayModes + 278
10  liblwawt.dylib                    0x000000015fc1b35d 
Java_sun_awt_CGraphicsDevice_nativeSetDisplayMode + 57

> 2. getBestModeForParameters() is declared to return a CGDisplayModeRef, but you are actually returning a bestGuess CFStringRef. Which is it?
Glitch. Fixed it. Strange that compiler did not issued a warning about 
this return
> 3. getBPPFromModeString() returns an int, but in one case you are assigning to a jint in Java_sun_awt_CGraphicsDevice_nativeGetDisplayMode().
> 	- Technically not an issue, but unexpected.
I can add implicit cast to jint - but technically it is not an issue as 
you mentioned .
> 4. In Java_sun_awt_CGraphicsDevice_nativeGetDisplayMode() you call CGDisplayModeGetRefreshRate(currentMode), but don't do anything with the return value, then later call it again, assigning it to the jint refrate.
> 	- What's up with this? Why call it twice?
Another glitch. Friday evening syndrome.
> 5. In some places you use (*env)->FindClass(), and in others you use JNF_CLASS_CACHE().
> 	- You can create array types using JNFNewObjectArray() and JNF_CLASS_CACHE(), which will benefit from fewer lines, and automatic exception throwing into Java, instead of just printing and suppressing the exception.
Well, valid point - i'll use the JNF functions for array creation for 
the sake of consistency.
> 6. Your NSLog() in Java_sun_awt_CGraphicsDevice_nativeGetDisplayModes() says "CGRaphivsGevice".
> 	- I think you meant to say "CGraphicsDevice".
You're absolutely right.
> 7. None of the if checks in getBestModeForParameters() need else { } blocks, because they implicitly exit the for loop.
I've added them for the better code readability but as it makes code 
more compact i may as well remove them.
> 8. getBPPFromModeString() can simply return the depth directly without assigning to a temporary.
> 	- I know this is more of a style thing, but I prefer fewer lines if possible.
Hmm. Ok, not a big deal but if it makes you a little bit happier i'll 
surely do that.
> 9. Java_sun_awt_CGraphicsDevice_nativeSetDisplayMode() leaks the closestMatch CGDisplayModeRef.
> 	- The "Create Rule" explains why this is a leak when fixed in conjunction with (1) above.
> 	-<https://developer.apple.com/library/mac/#documentation/CoreFOundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029>
How comes? I do not use Copy-methods to get the exact configuration, i 
get the array of references to the Quartz DisplayMode's
and i don't create any new CGDisplayMode objects. And i do release the 
array itself. Where is the memory leak?

> 10. What happens in the case of Java_sun_awt_CGraphicsDevice_nativeGetDisplayModes() where one of the CGDisplayModeRef's itterated on in the for loop is null? Is it OK to have empty nil holes in the returned array?
I tried to pass the null as one of the array elements back to Java - 
seems that it's Ok so i will left it as it is now.
> Overall, I'm discouraged by this lack of attention to detail by both the author and reviewers.
Stuff happens, especially at Friday evening, but all for all there was 
no major problems just some non-critical glitches here and there. And 
you are one of reviewers so the review process is fairly good at the end.

Anyways - the new webrev can be found here 
http://cr.openjdk.java.net/~kizune/7124247/jdk8/webrev.02
Comments are welcome.


>
> Mike Swingler
> Apple Inc.
>
> On Jun 1, 2012, at 10:55 AM, Alexander Zuev wrote:
>
>> Artem,
>>
>>   1. Done
>>   2. Yes, it's a wonderful idea, done.
>>   3. User can construct a new DisplayMode object and ask us to set corresponding mode.
>>
>>   New webrev can be found at http://cr.openjdk.java.net/~kizune/7124247/jdk8/webrev.01
>>
>> With best regards,
>> Alex
>>
>> On 6/1/12 19:57, Artem Ananiev wrote:
>>> Hi, Alex,
>>>
>>> here are some comments:
>>>
>>> 1. Please, update copyright dates in file headers.
>>>
>>> 2. I would pass w, h, bpp and refrate as method params to setDisplayMode() to avoid extra JNI calls from native
>>>
>>> 3. Is it possible to call setDisplayMode() with a DisplayMode object that was not obtained via previous getDisplayModes() call? If the answer is "no", why don't you just check for exact match for all parameters (w, h, bpp, refrate) in getBestModeForParameters()?
>>>
>>> Thanks,
>>>
>>> Artem
>>>
>>> On 6/1/2012 1:40 PM, Alexander Zuev wrote:
>>>> Hello,
>>>>
>>>> please review my fix for CR 7124247: [macosx] Implement
>>>> GraphicsDevice.setDisplayMode()
>>>>
>>>> CR description can be found here:
>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7124247
>>>>
>>>> Webrev with the proposed change can be seen here:
>>>> http://cr.openjdk.java.net/~kizune/7124247/jdk8/webrev.00
>>>>
>>>> With best regards,
>>>> Alex



More information about the macosx-port-dev mailing list