ACAV f0ba4b7c9529
Abstract Syntax Tree (AST) visualization tool for C, C++, and Objective-C
Loading...
Searching...
No Matches
ParallelProcessRunner.h
Go to the documentation of this file.
1/*$!{
2* Aurora Clang AST Viewer (ACAV)
3*
4* Copyright (c) 2026 Min Liu
5* Copyright (c) 2026 Michael David Adams
6*
7* SPDX-License-Identifier: GPL-2.0-or-later
8*
9* This program is free software; you can redistribute it and/or modify
10* it under the terms of the GNU General Public License as published by
11* the Free Software Foundation; either version 2 of the License, or
12* (at your option) any later version.
13*
14* This program is distributed in the hope that it will be useful,
15* but WITHOUT ANY WARRANTY; without even the implied warranty of
16* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17* GNU General Public License for more details.
18*
19* You should have received a copy of the GNU General Public License along
20* with this program; if not, see <https://www.gnu.org/licenses/>.
21}$!*/
22
25#pragma once
26
27#include <QElapsedTimer>
28#include <QHash>
29#include <QObject>
30#include <QProcess>
31#include <QString>
32#include <QStringList>
33#include <QTemporaryDir>
34#include <vector>
35
36#include "core/LogEntry.h"
37
38namespace acav {
39
61class ParallelProcessRunner : public QObject {
62 Q_OBJECT
63
64public:
65 explicit ParallelProcessRunner(QObject *parent = nullptr);
66 ~ParallelProcessRunner() override;
67
69 bool isRunning() const;
70
72 void setParallelCount(int count);
73
75 int getParallelCount() const { return parallelCount_; }
76
78 void cancel();
79
80signals:
82 void error(const QString &errorMessage);
83
85 void progress(const QString &message);
86
90 void chunkCompleted(int chunkIndex, int totalChunks);
91
95 void chunkFailed(int chunkIndex, const QString &errorMessage);
96
98 void logMessage(const LogEntry &entry);
99
100protected:
108 virtual std::vector<QStringList> chunkInputData(
109 const QStringList &inputData,
110 int chunkCount) const;
111
119 virtual QStringList prepareProcessArguments(
120 int chunkIndex,
121 const QStringList &chunkData,
122 const QString &tempOutputPath) = 0;
123
131 virtual bool mergeResults(
132 const QStringList &tempOutputPaths,
133 const QString &finalOutputPath,
134 QString &errorMessage) = 0;
135
143 virtual void onAllCompleted(int successCount, int failureCount, int totalCount);
144
148 QString getTempOutputPath(int chunkIndex) const;
149
154 void runParallel(
155 const QString &programPath,
156 const QStringList &inputData,
157 const QString &finalOutputPath);
158
159 // Protected members accessible to subclasses
161 QStringList errorMessages_;
162 QTemporaryDir tempDir_;
163 QElapsedTimer elapsed_;
164
165private slots:
166 void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
167 void onProcessError(QProcess::ProcessError error);
168 void onProcessStdOut();
169 void onProcessStdErr();
170
171private:
172 QString processSource(QProcess *process) const;
173 void checkAllProcessesCompleted();
174
175 // Configuration
176 QString programPath_;
177 int parallelCount_; // Number of parallel processes (0 = auto-detect)
178
179 // Process management
180 std::vector<QProcess*> processes_;
181 QStringList tempOutputPaths_;
182 int completedProcessCount_;
183 int failedProcessCount_;
184 QHash<QProcess*, QString> pendingStdout_;
185 QHash<QProcess*, QString> pendingStderr_;
186};
187
188} // namespace acav
virtual std::vector< QStringList > chunkInputData(const QStringList &inputData, int chunkCount) const
Divide input data into chunks for parallel processing.
void error(const QString &errorMessage)
Emitted when an error occurs that prevents execution.
void chunkCompleted(int chunkIndex, int totalChunks)
Emitted when a single chunk completes successfully.
QString getTempOutputPath(int chunkIndex) const
Get path to temporary output file for a chunk.
void progress(const QString &message)
Emitted with progress updates (e.g., "Completed 3/8 chunks").
virtual bool mergeResults(const QStringList &tempOutputPaths, const QString &finalOutputPath, QString &errorMessage)=0
Merge outputs from all chunks into final result.
QString finalOutputPath_
Final output file path.
void setParallelCount(int count)
Set number of parallel processes (0 = auto-detect from CPU cores).
void logMessage(const LogEntry &entry)
Emitted when a chunk process produces log output.
int getParallelCount() const
Get current parallel count setting.
void chunkFailed(int chunkIndex, const QString &errorMessage)
Emitted when a single chunk fails.
void cancel()
Cancel all running processes.
virtual QStringList prepareProcessArguments(int chunkIndex, const QStringList &chunkData, const QString &tempOutputPath)=0
Prepare command-line arguments for a specific chunk.
virtual void onAllCompleted(int successCount, int failureCount, int totalCount)
Called when all processes have completed (success or failure).
bool isRunning() const
Check if any process is currently running.
QStringList errorMessages_
Aggregated error messages.
void runParallel(const QString &programPath, const QStringList &inputData, const QString &finalOutputPath)
Start parallel execution.
QTemporaryDir tempDir_
Temporary directory for chunk outputs.