Make a reaper usable for processes from non-main thread

The reap() method needs to be called from the same
thread as the passed process lives in.

In case we are passing a process that lives in a non-main
thread, we move it into the main thread and schedule a call
to reap it again, this time from the main thread.

In addition, make sure that Internal::d is accessed only
from the main thread.

Change-Id: I32c836584b5da3050f9254e53cee352c79e536b9
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2021-09-01 14:16:45 +02:00
parent 3dc9f709c9
commit 2d412aeab5

View File

@@ -157,6 +157,19 @@ void reap(QtcProcess *process, int timeoutMs)
if (!process)
return;
QTC_ASSERT(QThread::currentThread() == process->thread(), return);
// Neither can move object with a parent into a different thread
// nor reaping the process with a parent makes any sense.
process->setParent(nullptr);
if (process->thread() != qApp->thread()) {
process->moveToThread(qApp->thread());
QMetaObject::invokeMethod(process, [process, timeoutMs] {
reap(process, timeoutMs);
}); // will be queued
return;
}
QTC_ASSERT(Internal::d, return);
new Internal::ProcessReaper(process, timeoutMs);