Hi Sergey,

I have added that information to InvokeInputMethodFunction(). Please find the 
new webrev here: http://cr.openjdk.java.net/~dmarkov/8232114/webrev.01/ 
<http://cr.openjdk.java.net/~dmarkov/8232114/webrev.01/>

Regards,
Dmitry

> On 15 Aug 2020, at 03:05, Sergey Bylokhov <sergey.bylok...@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: WM_AWT_ASSOCIATECONTEXT or 
>> WM_AWT_SETOPENSTATUS but several times 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.bylok...@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.

Reply via email to