<AWT Dev> [9] Review Request: JDK-8039377 Clipboard should post notifications without using the EventQueue.invokeLater

Anthony Petrov anthony.petrov at oracle.com
Mon Apr 7 14:00:51 UTC 2014


I'm aware of the reasons behind this issue. However, I'm still unsure 
whether this is a safe enough solution. A user could obtain an instance 
of a Clipboard object by using its public constructor. They could also 
get it using Clipboard.getSystemClipboard(), and the latter could call 
the methods that you're changing from a non-EDT thread (directly or 
indirectly). In any case, the fix that you're proposing changes the 
threading contract for these methods considerably. And I don't think 
that this change is safe.

--
best regards,
Anthony

On 4/7/2014 5:52 PM, Petr Pchelko wrote:
>> Clipboard is a part of AWT API. The AWT is a multi-threaded GUI toolkit, which means that users can call Clipboard's methods on
>> any thread. If we remove invokeLater(), we break this contract, which I'm not sure we want to do.
> The FlavorListener and ClipboardOwner interfaces do not state that the callbacks would be called on EDT, so at least we are not breaking the spec.
> The problem here is that Clipboard would be a  part of a different module and must be independent from AWT or the desktop module. Even reflectively independent.
> This means we have 2 options here: option 1 is implemented in the fix.
>
> Option 2 is to declare some "DelayedNotificationService", make the Clipboard look for this service using a ServiceLoader and make AWT implement the service
> using the invokeLater. So if the Clipboard would be used in absence of desktop module it would deliver the notifications in place, and with the desktop module it will
> use the invokeLater. Personally I think that the second option is way more fragile and unnecessary complicated.
>
> The only place where the Clipboard is used directly is in swing's sandbox clipboard, but it's used internally and only on EDT. And it does not leak to the user.
> So if we just remove the invokeLater we would likely not break anything. With the second option I would not be so sure.
>
> With best regards. Petr.
>
> On 07.04.2014, at 17:42, Anthony Petrov <anthony.petrov at oracle.com> wrote:
>
>> Hi Petr,
>>
>> Clipboard is a part of AWT API. The AWT is a multi-threaded GUI toolkit, which means that users can call Clipboard's methods on any thread. If we remove invokeLater(), we break this contract, which I'm not sure we want to do.
>>
>> --
>> best regards,
>> Anthony
>>
>> On 4/7/2014 5:16 PM, Petr Pchelko wrote:
>>> Hello, AWT Team.
>>>
>>> Please review the fix for the issue:
>>> https://bugs.openjdk.java.net/browse/JDK-8039377
>>> The fix is here:
>>> http://cr.openjdk.java.net/~pchelko/9/8039377/webrev.00/
>>>
>>> The problem: Clipboard depend on the EventQueue. The solution - remove the invokeLater. The Clipboard object is used only as a Swing sandbox clipboard which is used from the EDT.
>>> The user can't use in as the System clipboard, so there's no worries about the callback being executed on some privileged thread. So we can simply remove the invokeLater here.
>>>
>>> With best regards. Petr.
>>>
>


More information about the awt-dev mailing list