<div dir="ltr">Hey,<br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 23, 2018 at 9:18 AM, Miklos Vajna <span dir="ltr"><<a href="mailto:vmiklos@collabora.co.uk" target="_blank">vmiklos@collabora.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Markus,<br>
<br>
I've added UITest_writerperfect_<wbr>epubexport a while ago, and while I did<br>
not see it hanging in the recent past, both Noel and Stephan run into<br>
a hang of it from time to time.<br>
<br>
The code is here:<br>
<br>
writerperfect/qa/uitest/<wbr>epubexport/epubexport.py<br>
<br>
The backtrace always looks like this:<br>
self.ui_test.execute_blocking_<wbr>action() gets an UNO method where invoking<br>
it opens a dialog and the python method also gets a callback. When the<br>
hang happens, then it seems the problem is that the Python thread waits<br>
for the dialog to be closed, but in fact it's already closed, so it<br>
waits forever joining the python thread.<br></blockquote><div><br></div><div>That is not really correct. The dialog is not closed which is actually the problem. However I have now spend a few days looking at the code and related code pieces and I have still no idea how this could happen.</div></div><div class="gmail_quote">If my understanding is not completely wrong there is no race condition in the UI testing framework. I traced all the calls and could not find a case where you can click on the ok button and the dialog will not be destroyed unless the SvpSalInstance::DoReleaseYield never returns. Currently that would be my best guess.</div><div class="gmail_quote"><br></div><div class="gmail_quote"><div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
I don't think there is anything really special in this test, rather I<br>
guess the problem happens here more frequently (than elsewhere) because<br>
normally these dialogs are invoked via UNO commands, where we just<br>
execute the UNO command, wait for the dialog to appear then work with<br>
it. (I did not look at the implementation, perhaps in this case there is<br>
no Python thread involved?) <br></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
So I wonder -- do you think it would be possible or would make sense to<br>
have a way similar to self.xUITest.executeCommand (execute a blocking<br>
command async), but for UNO methods that open a dialog? I.e. also<br>
similar to self.ui_test.execute_blocking_<wbr>action, but without an actual<br>
callback.<br></blockquote><div><br></div><div>Well, the¬†execute_blocking_action method already does that. It will execute your call in a separate thread and waits with the execution of the handler code until the event for the dialog has been received. That approach allows to execute either normal blocking UNO commands or blocking UI actions. I also spend quite some time now looking for potential race conditions and could not find one as there is nothing being executed until the dialog executed event has been received at which point access to the dialog will work.</div><div><br></div><div>If someone can reproduce this case it would be nice to check a few things in gdb.</div><div><br></div><div>The first one would be whether we actually are stuck in SvpSalInstance::DoReleaseYield or are looping in Dialog::Execute?</div><div>The other one would be the value of pSVData->maWinData.mpExecuteDialogs</div><div>And the last thing would be whether the dialog is already disposed.</div><div><br></div><div><br></div><div>For now I pushed a patch that will let the tests fail instead of being stuck.<br></div><div><br></div><div>Regards,</div><div>Markus<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Perhaps that would be a fix for these strange hangs.<br>
<br>
Backtraces:<br>
- python: <a href="https://pastebin.ca/3942603" rel="noreferrer" target="_blank">https://pastebin.ca/3942603</a><br>
- native one: <a href="https://pastebin.ca/3942628" rel="noreferrer" target="_blank">https://pastebin.ca/3942628</a><br>
<br>
(From a run that resulted in a hang for Noel.)<br>
<br>
Thanks,<br>
<br>
Miklos<br>
</blockquote></div><br></div></div>