<Swing Dev> JDK-8189938: Proposed patch

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Thu Feb 8 21:58:32 UTC 2018


Hi, Matthias.
Did you have a chance to find why this code works on jdk8u152(this is 
reported in the bug description).

On 08/02/2018 10:32, Matthias Bläsing wrote:
> Hi all,
> 
> last month I saw the message from Reinhard Pointer on this list:
> 
> http://mail.openjdk.java.net/pipermail/swing-dev/2018-January/008132.html
> 
> referring to this bug:
> 
> https://bugs.openjdk.java.net/browse/JDK-8189938
> 
> With the instructions given in:
> 
> https://bugs.openjdk.java.net/browse/JDK-8193928 (closed as duplicate of JDK-8189938)
> 
> I was able to reproduce the problem on a clean Windows 10 Installation,
> as described in the initial report.
> 
> The resulting exception leads to my proposed fix:
> 
>          Could not initialize COM: HRESULT=0x80010106
> 
> That HRESULT translates to: RPC_E_CHANGED_MODE
> 
> This means, that the COM subsystem is already initialized, but with a
> different mode. The code uses CoInitialize and this initializes the
> threading module to be apartment threaded. The above HRESULT means the
> thread was already initialized to be multi-threaded.
> 
> The mode can't be changed after is was set once, so instead of bailing
> out, I suggest to accept the situation and initialize to be multi-
> threaded.
> 
> The consequence is that calls from COM to Java could end up on the
> wrong thread. A quick look through the code suggest, that COM advises
> are not used, so this is a risk that should be taken.
> 
> The fix in this case works like this:
> 
>   * try to initialize COM as it was
>   * check the return
>   * if it is RPC_E_CHANGED_MODE, retry initialization als multi-threaded
>   * only if that fails raise an exception
> 
> One could argue, that if COM is already initialized, you don't need to
> do it yourself, but documentation states, that every successful call to
> CoInitialize/CoInitializeEx must be paired with CoUninitialize.
> 
> D3DPipelineManager tracks this in bComInitialized, the other two
> callers in the JDK are:
> 
> - PLATFORM_API_WinOS_DirectSound.cpp
> - ShellFolder2.cpp
> 
> Both are covered in the patches. For ShellFolder2 there is an
> initialization check, this is modified as described above. And if both
> initialization variant (apartment threaded and multi threaded fail)
> this raises an exception.
> 
> PLATFORM_API_WinOS_DirectSound is slightly different. The fallback in
> the initialization is still done, but no exception is raised in the
> error case. This follows the code flow before this change.
> 
> I attached the diffs against JDK10 and JDK9 to this email. If they are
> stripped, they can be found here:
> 
> http://www.doppel-helix.eu/JDK8189938-openjdk9.diff
> http://www.doppel-helix.eu/JDK8189938-openjdk10.diff
> 
> I hope this helps with a fix.
> 
> Greetings
> 
> Matthias
> 


-- 
Best regards, Sergey.



More information about the swing-dev mailing list