forked from qt-creator/qt-creator
When reaping a process: do one call to terminate() and after 500 ms timeout (default) do one call to kill() if the process is still running. When the process finishes, end reaping by deleting the reaper and its process. Ensure that the state of the process is NotRunning before deleting it. Eliminate the need to process events in ProcessReaper's destructor. This change removes the emergency counter, which could caused issues when the process was still running and the emergency conter was above 5. Before, we were forcefully deleting the running process. Now we wait as long as it's needed for process to finish. Since the reaper was operating in the main thread before, it could happen that ProcessReaper inside the process launcher could have blocked the launcher's main thread considerably, when emergency counter exceeded the value of 5 and the destructor of QProcess was run in turn. In this case the process launcher couldn't operate and couldn't handle other running processes. This could cause that corresponding running QtcProcesses on Creator side timed out. Moving the reaper to the separate thread eliminates this issue. Change-Id: Id78953a2aec5cb08dc869621386b6a61a182e81c Reviewed-by: hjk <hjk@qt.io>
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2021 The Qt Company Ltd.
|
|
** Contact: https://www.qt.io/licensing/
|
|
**
|
|
** This file is part of Qt Creator.
|
|
**
|
|
** Commercial License Usage
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
** accordance with the commercial license agreement provided with the
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
|
**
|
|
** GNU General Public License Usage
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
** General Public License version 3 as published by the Free Software
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
** included in the packaging of this file. Please review the following
|
|
** information to ensure the GNU General Public License requirements will
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
|
**
|
|
****************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include "utils_global.h"
|
|
|
|
#include "singleton.h"
|
|
|
|
#include <QThread>
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
class QProcess;
|
|
QT_END_NAMESPACE
|
|
|
|
namespace Utils {
|
|
namespace Internal { class ProcessReaperPrivate; }
|
|
|
|
class QTCREATOR_UTILS_EXPORT ProcessReaper final
|
|
: public SingletonWithOptionalDependencies<ProcessReaper>
|
|
{
|
|
public:
|
|
static void reap(QProcess *process, int timeoutMs = 500);
|
|
|
|
private:
|
|
ProcessReaper();
|
|
~ProcessReaper();
|
|
|
|
QThread m_thread;
|
|
Internal::ProcessReaperPrivate *m_private;
|
|
friend class SingletonWithOptionalDependencies<ProcessReaper>;
|
|
};
|
|
|
|
} // namespace Utils
|