1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
//===-- ExecutionQueue.cpp ------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2018 - 2019 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "llbuild/Basic/ExecutionQueue.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include <future>
#include <vector>
using namespace llbuild;
using namespace llbuild::basic;
JobDescriptor::~JobDescriptor() {
}
QueueJobContext::~QueueJobContext() {
}
ExecutionQueue::ExecutionQueue(ExecutionQueueDelegate& delegate)
: delegate(delegate)
{
}
ExecutionQueue::~ExecutionQueue() {
}
ProcessStatus ExecutionQueue::executeProcess(QueueJobContext* context,
ArrayRef<StringRef> commandLine) {
std::promise<ProcessStatus> p;
auto result = p.get_future();
executeProcess(context, commandLine, {}, {true},
{[&p](ProcessResult result) mutable {
p.set_value(result.status);
}});
return result.get();
}
bool ExecutionQueue::executeShellCommand(QueueJobContext* context,
StringRef command) {
SmallString<1024> commandStorage(command);
std::vector<StringRef> commandLine(
#if defined(_WIN32)
{"C:\\windows\\system32\\cmd.exe", "/C", commandStorage.c_str()});
#else
{DefaultShellPath, "-c", commandStorage.c_str()});
#endif
return executeProcess(context, commandLine) == ProcessStatus::Succeeded;
}
ExecutionQueueDelegate::~ExecutionQueueDelegate() {
}
|