Hi Can someone take look at this call stack and threadlock that appears to happen very occasionally with our app on one VM.
I have not been able to reproduce on a dev machine.
We are using amBlocking for the firedac query but getting a call to check synchronize twice where we get a threadlock on second one.
This is main thread.
Have checked the 22.0 code and no changes this is from v19.0, procedure in FireDAC.Stan.Async:
procedure TFDStanAsyncExecutor.Run
Here is the offending code:
else if (FMode = amNonBlocking) or not (
(rMsg.message >= WM_KEYDOWN) and (rMsg.message <= WM_DEADCHAR) and
((FAsyncDlg = nil) or not FAsyncDlg.IsFormActive) or
(rMsg.message >= WM_MOUSEFIRST) and (rMsg.message <= WM_MOUSELAST) and
((FAsyncDlg = nil) or not FAsyncDlg.IsFormMouseMessage(rMsg)) or
(rMsg.message >= WM_SYSKEYDOWN) and (rMsg.message <= WM_SYSDEADCHAR)
) then begin
TranslateMessage(rMsg);
DispatchMessage(rMsg);
end;
To fix im proposing to add in this to the above code block so messages can not be processed with amBlocking.
if FMode <> amBlocking then
Anyone else seen this behavior?
Now also it could be possible for a threadlock if we were using amNonBlocking from what i can see - that would also be bad.
FireDAC.Stan.Async amBlocking causing threadlock
in Databases
Posted
Hi Can someone take look at this call stack and threadlock that appears to happen very occasionally with our app on one VM.
I have not been able to reproduce on a dev machine.
We are using amBlocking for the firedac query but getting a call to check synchronize twice where we get a threadlock on second one.
This is main thread.
Have checked the 22.0 code and no changes this is from v19.0, procedure in FireDAC.Stan.Async:
procedure TFDStanAsyncExecutor.Run
Here is the offending code:
else if (FMode = amNonBlocking) or not ( (rMsg.message >= WM_KEYDOWN) and (rMsg.message <= WM_DEADCHAR) and ((FAsyncDlg = nil) or not FAsyncDlg.IsFormActive) or (rMsg.message >= WM_MOUSEFIRST) and (rMsg.message <= WM_MOUSELAST) and ((FAsyncDlg = nil) or not FAsyncDlg.IsFormMouseMessage(rMsg)) or (rMsg.message >= WM_SYSKEYDOWN) and (rMsg.message <= WM_SYSDEADCHAR) ) then begin TranslateMessage(rMsg); DispatchMessage(rMsg); end;
To fix im proposing to add in this to the above code block so messages can not be processed with amBlocking.
if FMode <> amBlocking then
Anyone else seen this behavior?
Now also it could be possible for a threadlock if we were using amNonBlocking from what i can see - that would also be bad.