Re: breaking yield loops on forced quit.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi *,

Am 12.03.21 um 12:16 schrieb Michael Meeks:
	We've recently had problems with dialogs running in Online Kit
processes that are not cleaning up properly when the process is asked
to quit by the core.

	The proximate fix is/was to hard kill the remote process =)
but - I'd love to do better if possible.

... regression?

	If you see vcl's:

Dialog::Execute () ...

     // Yield util EndDialog is called or dialog gets destroyed
     // (the latter should not happen, but better safe than sorry
     while ( !xWindow->IsDisposed() && mbInExecute )
         Application::Yield();

	You see one of these:

	while (condition)
		Application::Yield();

	archetypes. Of which there a dozen+ scattered around the code eg.

sfx2/source/doc/printhelper.cxx-                while( m_pPrinter->IsPrinting() )
sfx2/source/doc/printhelper.cxx:                    Application::Yield();

	etc. etc.

	Not least because Application:Yield becomes an instant-return when
we're trying to quit. So - we could add a flag:

	while (condition && !(new Application::mbAppQuit accessor))

	to all suspicious looking call-sites.

	Perhaps it'd be nicer to have a:

	Application::YieldWhile([]{ return m_pPrinter->IsPrinting(); });

	or somesuch - so we can add that this just once (?)

There is also:

static void Quit();
static void EndYield();

so we can add

bool Application::IsQuit()
{
    return ImplGetSVData()->maAppData.mbAppQuit;
}

From my POV and your example, whatever IsPrinting is testing (I assume some thread or OS API), should return earlier / cancel processing / check IsQuit / imply called EndYield. I don't think trying to "beef up" Application::Yield in whatever direction will help, but might introduce other problems, like un-joined threads, missing cleanup and whatnot.

Adding a !Application::IsQuit to a yield loop, might be the right fix in some cases, but not generally. Application::Quit already sets mbAppQuit and calls PostUserEvent to wake up yield.

JMG
_______________________________________________
LibreOffice mailing list
LibreOffice@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/libreoffice



[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux