<AWT Dev> [16] RFR 8232114: JVM crashed at imjpapi.dll in native code

Anton Litvinov anton.litvinov at oracle.com
Thu Aug 20 14:14:47 UTC 2020

Hi Dmitry,

The fix looks well, but I have next a few comments relatively to it:

1) In the new function "AwtToolkit::InvokeInputMethodFunction(UINT, 
WPARAM, LPARAM)", which you created, the call "PostMessage(msg, wParam, 
lParam);" may fail and return "0", so in that case the next call 
"::WaitForSingleObject(m_inputMethodWaitEvent, INFINITE);" may become 
blocked forever. I suggest to handle this possible failure, for example 
in the next way:

if (PostMessage(msg, wParam, lParam)) {
     ::WaitForSingleObject(m_inputMethodWaitEvent, INFINITE);
     return m_inputMethodData;
return 0;

2) In "AwtToolkit::WndProc" function in the code handling the messages: 
"WM_AWT_OPENCANDIDATEWINDOW" I do not find calls to "Imm*" system 
functions. Therefore maybe there is no need to send these messages 
through "PostMessage"?

Thank you,

On 18/08/2020 06:46, Dmitry Markov wrote:
> Thank you, Sergey!
> Looking for one more "+1”. Any volunteers?
> Regards,
> Dmitry
>> On 17 Aug 2020, at 21:06, Sergey Bylokhov <sergey.bylokhov at oracle.com 
>> <mailto:sergey.bylokhov at oracle.com>> wrote:
>> Looks fine.
>> On 17.08.2020 02:32, Dmitry Markov wrote:
>>> Hi Sergey,
>>> I have added that information to InvokeInputMethodFunction(). Please 
>>> find the new webrev 
>>> here:http://cr.openjdk.java.net/~dmarkov/8232114/webrev.01/
>>> Regards,
>>> Dmitry
>>>> On 15 Aug 2020, at 03:05, Sergey Bylokhov 
>>>> <sergey.bylokhov at oracle.com 
>>>> <mailto:sergey.bylokhov at oracle.com><mailto:sergey.bylokhov at oracle.com>> 
>>>> wrote:
>>>> On 12.08.2020 05:09, Dmitry Markov wrote:
>>>>> TranslateMessage() does not invoke PeekMessage(). In our case 
>>>>> TranslateMessage() is called by AWT. IME functionality may call 
>>>>> PeekMessage() during TranslateMessage() execution. However that 
>>>>> PeekMessage() call is intended for processing non-queued 
>>>>>  messages, (i.e. the messages send via SendMessage() call).
>>>>> I contacted Microsoft regarding this problem and one of their 
>>>>> suggestions was to use PostMessage() instead of SendMessage() for 
>>>>> IME messages to avoid IME internal data corruption and the crash.
>>>>> The proposed fix was tested by the stress test for several weeks 
>>>>> and no issues were observed. So I feel quite confident that it 
>>>>> eliminates the issue.
>>>>> There is no exact message which triggers the crash. Usually the 
>>>>> crash is caused by one of the following messages: 
>>>>> I observed that it was triggered by WM_AWT_DESTROYCONTEXT or 
>>>>> WM_AWT_CREATECONTEXT. It looks like almost every IME-related 
>>>>> message may cause the crash.  I think SendMessage() call should be 
>>>>> substituted by PostMessage() for all IME messages.
>>>> Ok, then please add this(or similar) information to the new method 
>>>> "InvokeInputMethodFunction",
>>>> otherwise it could be removed in the future/replaced back to the 
>>>> sendMessage.
>>>>> Regards,
>>>>> Dmitry
>>>>>> On 12 Aug 2020, at 06:16, Sergey Bylokhov 
>>>>>> <Sergey.Bylokhov at oracle.com 
>>>>>> <mailto:Sergey.Bylokhov at oracle.com><mailto:Sergey.Bylokhov at oracle.com>> 
>>>>>> wrote:
>>>>>> Hi, Dmitry.
>>>>>> On 11.08.2020 01:07, Dmitry Markov wrote:
>>>>>>> Problem description:
>>>>>>> The root cause of the crash is the lack of synchronisation in 
>>>>>>> imjpapi.dll. In particular when IME messages are processed in 
>>>>>>> the message loop and another message triggered through a 
>>>>>>> SendMessage() call, this clears the buffer context so on further 
>>>>>>> processing the message loop in IME context will point to invalid 
>>>>>>> memory buffer. Microsoft article devoted to this issue: 
>>>>>>> https://docs.microsoft.com/en-us/troubleshoot/windows/win32/ime-crash-processing-cross-thread-sent-message
>>>>>> The documentation above also states that PeekMessage, called by 
>>>>>> the TranslateMessage when the IME is ON, can proceed the posted 
>>>>>> messages as well if that true then the current fix does not help.
>>>>>>> Fix:
>>>>>>> Replace SendMessage() with PostMessage() for IME messages and 
>>>>>>> implement event based mechanism to notify the sender that the 
>>>>>>> message processing is completed.
>>>>>> What exact message broke the IME, the "WM_AWT_DESTROYCONTEXT"?
>>>>>>> Testing:
>>>>>>> mach5 client tests (jtreg headful, jck, etc.) are green.
>>>>>>> Regards,
>>>>>>> Dmitry
>>>>>> --
>>>>>> Best regards, Sergey.
>>>> --
>>>> Best regards, Sergey.
>> --
>> Best regards, Sergey.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/awt-dev/attachments/20200820/4143986e/attachment.htm>

More information about the awt-dev mailing list