Hello, Anthony.

Of course. This left from one of the pervious versions. Thank you for noticing 
it. 
I'll remove the synchronized before the push. 

With best regards. Petr.


On 26.03.2014, at 15:32, Anthony Petrov <anthony.pet...@oracle.com> wrote:

> Hi Petr,
> 
> Thanks for the update.
> 
> src/share/classes/sun/awt/datatransfer/SunClipboard.java
>> 422     public synchronized void checkChange(long[] formats) {
> 
> I'm concerned about making this method synchronized. I haven't investigated 
> deeply, but it doesn't seem that the checkChange() has called any methods 
> that synchronize on the Clipboard instance previously. And even if it has, it 
> doesn't do that for the whole time of executing this method. Your fix changes 
> the threading contract of this method considerably and could potentially lead 
> to deadlocks and whatnot.
> I suggest to reevaluate this part of the change.
> 
> --
> best regards,
> Anthony
> 
> On 3/26/2014 12:13 PM, Petr Pchelko wrote:
>> Hello,
>> 
>> Looks like I forgot to actually add a link to the new version. Here it
>> is: http://cr.openjdk.java.net/~pchelko/9/6463901/webrev.02/
>> 
>> With best regards. Petr.
>> 
>> 
>> On 19.03.2014, at 12:44, Petr Pchelko <petr.pche...@oracle.com
>> <mailto:petr.pche...@oracle.com>> wrote:
>> 
>>> Hello, Anthony, Sergey.
>>> 
>>> Thank you for the review.
>>> 
>>>> Now that the flavorListeners is never null, I believe that the
>>>> condition should check the value of currentDataFlavors, rather than
>>>> rely on emptiness of the listeners collection: note that there's
>>>> removeListener method, so the collection may become empty again, and
>>>> we don't want to reinitialize the currentDataFlavors for the second time.
>>> I'm now initializing it in the constructor, the same time as the list
>>> is initialized.
>>> 
>>>> As for the Set vs. List issue, note that Set implementations
>>>> generally do not guarantee a particular iteration order - it may
>>>> change after adding/removing listeners. This is particularly true for
>>>> hash-based collections. So if we use a HashSet, listeners added by
>>>> other code could be executed in different order at different times
>>>> which could confuse some applications (maybe?). Since we don't expect
>>>> a large number of listeners to be added to the collection, I don't
>>>> think that removing a listener would be a bottle-neck (and this is
>>>> the only operation that actually benefits from using HashSet in this
>>>> code). So personally, I'd choose a List instead. But I don't have a
>>>> strong opinion on this.
>>> I don't think the iteration order would have any effect on the
>>> applications. The only reason I'm choosing a Set is to avoid
>>> duplicated notifications in case 2 identical listeners were
>>> accidentally added. It's actually would be a bug in the client code,
>>> so I'm OK to replace the Set with the List if you think it would be
>>> better.
>>> 
>>> With best regards. Petr.
>>> 
>>> On 18.03.2014, at 23:07, Anthony Petrov <anthony.pet...@oracle.com
>>> <mailto:anthony.pet...@oracle.com>> wrote:
>>> 
>>>> Hi Petr,
>>>> 
>>>>> 259         if (flavorListeners.isEmpty()) {
>>>>> 260             currentDataFlavors = getAvailableDataFlavorSet();
>>>>> 
>>>>> 261         }
>>>>> 262         flavorListeners.add(listener);
>>>> 
>>>> Now that the flavorListeners is never null, I believe that the
>>>> condition should check the value of currentDataFlavors, rather than
>>>> rely on emptiness of the listeners collection: note that there's
>>>> removeListener method, so the collection may become empty again, and
>>>> we don't want to reinitialize the currentDataFlavors for the second time.
>>>> 
>>>> As for the Set vs. List issue, note that Set implementations
>>>> generally do not guarantee a particular iteration order - it may
>>>> change after adding/removing listeners. This is particularly true for
>>>> hash-based collections. So if we use a HashSet, listeners added by
>>>> other code could be executed in different order at different times
>>>> which could confuse some applications (maybe?). Since we don't expect
>>>> a large number of listeners to be added to the collection, I don't
>>>> think that removing a listener would be a bottle-neck (and this is
>>>> the only operation that actually benefits from using HashSet in this
>>>> code). So personally, I'd choose a List instead. But I don't have a
>>>> strong opinion on this.
>>>> 
>>>> --
>>>> best regards,
>>>> Anthony
>>>> 
>>>> On 3/18/2014 7:47 PM, Sergey Bylokhov wrote:
>>>>> On 3/18/14 7:44 PM, Petr Pchelko wrote:
>>>>>> Hello, Sergey.
>>>>>> 
>>>>>> Thank you for the review.
>>>>>> The updated version is located here:
>>>>>> http://cr.openjdk.java.net/~pchelko/9/6463901/webrev.01/
>>>>>> 
>>>>>> It addresses both of your comments.
>>>>> I am curious why Set and not a List(ArrayList)?
>>>>>> 
>>>>>> With best regards. Petr.
>>>>>> 
>>>>>> On 18.03.2014, at 19:06, Sergey Bylokhov
>>>>>> <sergey.bylok...@oracle.com <mailto:sergey.bylok...@oracle.com>>
>>>>>> wrote:
>>>>>> 
>>>>>>> Hi, Petr.
>>>>>>> 
>>>>>>> A few notes:
>>>>>>> 
>>>>>>> 314         if (prevDataFlavors != null && currentDataFlavors != null
>>>>>>> 315                 && prevDataFlavors.equals(currentDataFlavors)) {
>>>>>>> 316             return;
>>>>>>> 317         }
>>>>>>> 
>>>>>>> I suppose we should return in case both of them will be null?
>>>>>>> Objects.equals should be a little bit more readable here.
>>>>>>> 
>>>>>>> 
>>>>>>> 440                 flavorListeners.stream()
>>>>>>> 441                         .filter(Objects::nonNull)
>>>>>>> 442                         .forEach(listener ->
>>>>>>> SunToolkit.postEvent(appContext,
>>>>>>> 443                                 new PeerEvent(this,
>>>>>>> 444                                         () ->
>>>>>>> listener.flavorsChanged(new FlavorEvent(SunClipboard.this)),
>>>>>>> 445
>>>>>>>                                        PeerEvent.PRIORITY_EVENT)));
>>>>>>> 
>>>>>>> here is a place where we can reformat it to be more readable.
>>>>>>> 
>>>>>>> On 18.03.2014 18:34, Petr Pchelko wrote:
>>>>>>>> Hello, AWT Team.
>>>>>>>> 
>>>>>>>> Please review the fix for the issue:
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-6463901
>>>>>>>> The fix is available at:
>>>>>>>> http://cr.openjdk.java.net/~pchelko/9/6463901/webrev/
>>>>>>>> 
>>>>>>>> The bug states that we should deprecate or generify the
>>>>>>>> EventListenerAggregate class.
>>>>>>>> However it's an internal class in sun.awt package so we could remove
>>>>>>>> it.
>>>>>>>> 
>>>>>>>> I've used grep on JDK source to verify that this class is not used
>>>>>>>> any more.
>>>>>>>> Clipboard regression, functional and JCK tests run fine.
>>>>>>>> 
>>>>>>>> With best regards. Petr.
>>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> Best regards, Sergey.
>>>>>>> 
>>>>> 
>>>>> 
>>> 
>> 

Reply via email to