MCPcopy Create free account
hub / github.com/ModOrganizer2/modorganizer / waitForProcesses

Function waitForProcesses

src/processrunner.cpp:355–425  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

353}
354
355ProcessRunner::Results waitForProcesses(const std::vector<HANDLE>& initialProcesses,
356 UILocker::Session* ls)
357{
358 if (initialProcesses.empty()) {
359 // nothing to wait for
360 return ProcessRunner::Completed;
361 }
362
363 // using a job so any child process started by any of those processes can also
364 // be captured and monitored
365 env::HandlePtr job(CreateJobObjectW(nullptr, nullptr));
366 if (!job) {
367 const auto e = GetLastError();
368
369 log::error("failed to create job to wait for processes, {}",
370 formatSystemMessage(e));
371
372 return ProcessRunner::Error;
373 }
374
375 bool oneWorked = false;
376
377 for (auto&& h : initialProcesses) {
378 if (::AssignProcessToJobObject(job.get(), h)) {
379 oneWorked = true;
380 } else {
381 const auto e = GetLastError();
382
383 // this happens when closing MO while multiple processes are running,
384 // so the logging is disabled until it gets fixed
385
386 // log::error(
387 // "can't assign process to job to wait for processes, {}",
388 // formatSystemMessage(e));
389
390 // keep going
391 }
392 }
393
394 HANDLE monitor = INVALID_HANDLE_VALUE;
395
396 if (oneWorked) {
397 monitor = job.get();
398 } else {
399 // none of the handles could be added to the job, just monitor the first one
400 monitor = initialProcesses[0];
401 }
402
403 auto results = ProcessRunner::Running;
404 std::atomic<bool> interrupt(false);
405
406 auto* t = QThread::create(waitForProcessesThread, std::ref(results), monitor, ls,
407 std::ref(interrupt));
408
409 QEventLoop events;
410 QObject::connect(t, &QThread::finished, [&] {
411 events.quit();
412 });

Callers 2

waitForProcessFunction · 0.85

Calls 6

isRunningMethod · 0.80
waitMethod · 0.80
emptyMethod · 0.45
getMethod · 0.45
startMethod · 0.45
execMethod · 0.45

Tested by

no test coverage detected