Hello, Alexey.

The final version still looks good.

With best regards. Petr.

On 06 июня 2014 г., at 15:02, Alexey Ivanov <alexey.iva...@oracle.com> wrote:

> Hi Anthony, Petr, AWT and Swing teams,
> 
> I've addressed Anthony's and Petr's comments in the updated webrev:
> http://cr.openjdk.java.net/~aivanov/8039383/jdk9/webrev.04/
> 
> Thank you,
> Alexey.
> 
> On 06.06.2014 12:16, Alexey Ivanov wrote:
>> Hi Anthony,
>> 
>> Thank you for your review.
>> 
>> I've removed synchronized modifier from updateProperties() method which 
>> protected access to wprops field. Now this field is accessed from 
>> synchronized methods lazilyInitWProps() and getWProps(); setDesktopProperty 
>> also has proper synchronization - that was my reasoning for removing 
>> synchronized.
>> 
>> But you're right, it was not the right decision as the update loop now could 
>> execute simultaneously which is undesirable. I'll put synchronized modifier 
>> to updateProperties() method.
>> 
>> Regards,
>> Alexey.
>> 
>> On 06.06.2014 1:07, Anthony Petrov wrote:
>>> Hi Alexey,
>>> 
>>> In WToolkit.java you're removing the synchronized modifier from the private 
>>> updateProperties() method. And it looks like the method itself does allow 
>>> for calling from multiple threads. So I'm concerned about the lack of 
>>> synchronization in this method. Was the removal intentional? How is the 
>>> method supposed to work now when called from multiple threads?
>>> 
>>> -- 
>>> best regards,
>>> Anthony
>>> 
>>> On 6/5/2014 12:16 PM, Petr Pchelko wrote:
>>>> Thank you for clarifications, I've been most interested in #2 obviously.
>>>> 
>>>> The fix looks good to me.
>>>> 
>>>> With best regards. Petr.
>>>> 
>>>> On 05 июня 2014 г., at 11:57, Alexey Ivanov <alexey.iva...@oracle.com> 
>>>> wrote:
>>>> 
>>>>> Hello Petr,
>>>>> 
>>>>> Thank you for your comments.
>>>>> 
>>>>> 1. Sure, I'll remove the comment before the change set is pushed.
>>>>> 2. No, I didn't try stub XPStyle object. First of all, UI delegates 
>>>>> decide what painting method to use depending on whether XPStyle.getXP() 
>>>>> returns null or not. If XPStyle.getXP() always returns non-null value, 
>>>>> we'll have re-implement all UI delegates for Windows plaf, and I believe 
>>>>> it would result in larger changeset. Additionally, some classes fallback 
>>>>> to inherited behavior where XPStyle.getXP() is not available.
>>>>> Another reason is that UI delegates cache Skins: those objects shouldn't 
>>>>> paint where theming is unavailable.
>>>>> 3. No, I haven't filed any bugs yet. I'll file all the issues I've found 
>>>>> in the nearest future.
>>>>> 
>>>>> Regards,
>>>>> Alexey.
>>>>> 
>>>>> On 05.06.2014 11:08, Petr Pchelko wrote:
>>>>>> Hello, Alexey.
>>>>>> 
>>>>>> A couple of comments:
>>>>>> 1. ThemeReader:64 - I suggest to remove that comment as it does not add 
>>>>>> any value. The variable name is self explanatory.
>>>>>> 2. XPStyle - did you try providing a stub XPStyle object instead of 
>>>>>> changing many of it's methods? Do I understand correctly that this
>>>>>> is not possible because XPstyle is cached in many place is our code?
>>>>>> 3. In offline discussion you've mentioned that you've found another 
>>>>>> related issue. Did you have a chance to file a bug about it?
>>>>>> 
>>>>>> Thank you.
>>>>>> With best regards. Petr.
>>>>>> 
>>>>>> On 05 июня 2014 г., at 10:35, Alexey Ivanov <alexey.iva...@oracle.com> 
>>>>>> wrote:
>>>>>> 
>>>>>>> Hi AWT and Swing teams,
>>>>>>> 
>>>>>>> Could you please review the updated fix:
>>>>>>> http://cr.openjdk.java.net/~aivanov/8039383/jdk9/webrev.03/
>>>>>>> 
>>>>>>> 
>>>>>>> What has changed since version .02?
>>>>>>> 
>>>>>>> During additional testing, I found another scenario where NPE was 
>>>>>>> thrown. So the new version adds more checks to prevent access to 
>>>>>>> XPStyle and ThemeReader where Windows visual styles become unavailable.
>>>>>>> 
>>>>>>> As in previous version, getters in XPStyle class check for null values 
>>>>>>> and return dummy defaults if ThemeReader returned null. Skin painters 
>>>>>>> also check whether theming is still available before asking ThemeReader 
>>>>>>> to paint.
>>>>>>> 
>>>>>>> Access to XPStyle.xp instance is blocked as soon as user switched 
>>>>>>> themes. The object will be cleaned when the corresponding 
>>>>>>> PropertyChangeEvent is handled by Swing.
>>>>>>> 
>>>>>>> Thank you,
>>>>>>> Alexey.
>>>>>>> 
>>>>>>> On 06.05.2014 12:14, Alexey Ivanov wrote:
>>>>>>>> Hi AWT and Swing teams,
>>>>>>>> 
>>>>>>>> Could you please review the updated fix:
>>>>>>>> http://cr.openjdk.java.net/~dmarkov/8039383/jdk9/webrev.02/
>>>>>>>> 
>>>>>>>> 
>>>>>>>> What has changed since version .01?
>>>>>>>> 
>>>>>>>> The issue was still reproducible with the .01 version of the fix, 
>>>>>>>> however it was harder to reproduce.
>>>>>>>> 
>>>>>>>> So in version .02 I added checks for null where possible. If theme 
>>>>>>>> becomes unavailable, a dummy value will be used; this way applications 
>>>>>>>> will be more stable. As soon as the theme change events are handled, 
>>>>>>>> the entire UI will update properly.
>>>>>>>> 
>>>>>>>> Thank you,
>>>>>>>> Alexey.
>>>>>>>> 
>>>>>>>> On 24.04.2014 16:23, Alexey Ivanov wrote:
>>>>>>>>> Hi Anthony, AWT and Swing teams,
>>>>>>>>> 
>>>>>>>>> Here's the updated fix:
>>>>>>>>> http://cr.openjdk.java.net/~dmarkov/8039383/jdk9/webrev.01/
>>>>>>>>> 
>>>>>>>>> Description:
>>>>>>>>> In the new version of the fix, I use a new xpstyleEnabled field of 
>>>>>>>>> AtomicBoolean in WToolkit to track the current value of 
>>>>>>>>> "win.xpstyle.themeActive" desktop property. Its value is updated in 
>>>>>>>>> windowsSettingChange() and in updateProperties().
>>>>>>>>> XPStyle.getXP() checks its cached value in themeActive and the 
>>>>>>>>> current value in WToolkit; if the value changes, it schedules 
>>>>>>>>> updateAllUIs and invalidates the current style right away, so that 
>>>>>>>>> components would not access data from the theme that became 
>>>>>>>>> unavailable.
>>>>>>>>> Two functions in ThemeReader also check this special field from 
>>>>>>>>> WToolkit which prevents throwing InternalError when paint is called 
>>>>>>>>> before theme change is fully handled.
>>>>>>>>> 
>>>>>>>>> Before updateAllUIs is invoked, it's possible that application will 
>>>>>>>>> paint with some values cached from the previous theme. Usually it 
>>>>>>>>> happens before "Theme change" dialog disappears from the screen, at 
>>>>>>>>> least I noticed no UI glitches during normal theme change.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Regression test:
>>>>>>>>> No regression test is provided due to its complexity. Additionally, 
>>>>>>>>> whether NullPointerException or InternalError are thrown depends on 
>>>>>>>>> the order of event handling, sometimes exceptions do not occur when 
>>>>>>>>> changing theme of visual styles enabled theme to a classic theme.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Thank you,
>>>>>>>>> Alexey.
>>>>>>>>> 
>>>>>>>>> On 18.04.2014 18:52, Anthony Petrov wrote:
>>>>>>>>>> Hi Alexey,
>>>>>>>>>> 
>>>>>>>>>> No, unfortunately I don't have any suggestions right now.
>>>>>>>>>> 
>>>>>>>>>> As for allowing executing user code on the toolkit thread, we can't 
>>>>>>>>>> accept such a fix. Sorry about that.
>>>>>>>>>> 
>>>>>>>>>> -- 
>>>>>>>>>> best regards,
>>>>>>>>>> Anthony
>>>>>>>>>> 
>>>>>>>>>> On 4/18/2014 6:48 PM, Alexey Ivanov wrote:
>>>>>>>>>>> Hi Anthony,
>>>>>>>>>>> 
>>>>>>>>>>> Thank you for your review.
>>>>>>>>>>> 
>>>>>>>>>>> Yes, user code can install a property change listener... It was my
>>>>>>>>>>> concern too, that's why I explicitly noted about this.
>>>>>>>>>>> 
>>>>>>>>>>> Do you have any suggestion how this situation can be handled?
>>>>>>>>>>> Is it a general rule that all desktop property change listeners 
>>>>>>>>>>> must be
>>>>>>>>>>> called on EDT?
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Alexey.
>>>>>>>>>>> 
>>>>>>>>>>> On 18.04.2014 16:02, Anthony Petrov wrote:
>>>>>>>>>>>> Hi Alexey,
>>>>>>>>>>>> 
>>>>>>>>>>>>> With this change, property "win.xpstyle.themeActive" change is 
>>>>>>>>>>>>> fired
>>>>>>>>>>>>> on the toolkit thread
>>>>>>>>>>>> Is it possible to install a change listener for this property from
>>>>>>>>>>>> user code, and hence eventually allow executing some user code on 
>>>>>>>>>>>> the
>>>>>>>>>>>> toolkit thread with your fix?
>>>>>>>>>>>> 
>>>>>>>>>>>> -- 
>>>>>>>>>>>> best regards,
>>>>>>>>>>>> Anthony
>>>>>>>>>>>> 
>>>>>>>>>>>> On 4/18/2014 12:09 PM, Alexey Ivanov wrote:
>>>>>>>>>>>>> Hello Swing and AWT teams,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Could you please review the fix for jdk9:
>>>>>>>>>>>>>     bug: https://bugs.openjdk.java.net/browse/JDK-8039383
>>>>>>>>>>>>>     webrev: 
>>>>>>>>>>>>> http://cr.openjdk.java.net/~dmarkov/8039383/jdk9/webrev.00/
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Problem description:
>>>>>>>>>>>>> When changing Windows themes from a theme with visual styles 
>>>>>>>>>>>>> (Windows
>>>>>>>>>>>>> Aero or Windows Basic) to a classic one, NullPointerException 
>>>>>>>>>>>>> could be
>>>>>>>>>>>>> thrown from Swing code during component tree validation, or
>>>>>>>>>>>>> InternalError could be thrown during component painting.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Root cause:
>>>>>>>>>>>>> Windows theme data are "cached" in XPStyle object. When the theme 
>>>>>>>>>>>>> is
>>>>>>>>>>>>> switched to a classic one, HTHEME handle becomes unavailable and 
>>>>>>>>>>>>> data
>>>>>>>>>>>>> cannot be accessed from the theme any more. The change in theme in
>>>>>>>>>>>>> posted to EDT via invokeLater. At the same time, the UI needs to 
>>>>>>>>>>>>> repaint
>>>>>>>>>>>>> itself as soon as Windows changed the theme, and paint code is 
>>>>>>>>>>>>> often
>>>>>>>>>>>>> called before the theme change is handled in Java. This leads to 
>>>>>>>>>>>>> NPE and
>>>>>>>>>>>>> InternalError as the code tries to access the data that has become
>>>>>>>>>>>>> unavailable.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> The fix:
>>>>>>>>>>>>> Update "win.xpstyle.themeActive" desktop property and invalidate 
>>>>>>>>>>>>> the
>>>>>>>>>>>>> cached XPStyle as soon as windowsSettingChange() is called from 
>>>>>>>>>>>>> native
>>>>>>>>>>>>> code. Thus when Swing code needs to access theme data, it will 
>>>>>>>>>>>>> see no
>>>>>>>>>>>>> theme is available and will fallback to classic painting.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Note: Before the fix, PropertyChangeEvents for desktop properties 
>>>>>>>>>>>>> in
>>>>>>>>>>>>> Windows were fired on the Event Dispatch Thread. With this change,
>>>>>>>>>>>>> property "win.xpstyle.themeActive" change is fired on the toolkit
>>>>>>>>>>>>> thread; all other properties are changed on the EDT as before.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>> Alexey.
>>>>> 
>>>> 
>> 
> 

Reply via email to