/// @brief Constructor.
///
- /// @param sync enables synchronous mode (spawning thread waits on
- /// child to complete if true)
+ /// @param mode specifies synchronous or asynchronous mode.
/// @param executable A full path to the program to be executed.
/// @param args Arguments for the program to be executed.
/// @param vars Environment variables for the program to be executed.
/// @param inherit_env whether the spawned process will inherit the
/// environment before adding 'vars' on top.
- ProcessSpawnImpl(const bool sync,
+ ProcessSpawnImpl(const ProcessSpawn::SpawnMode mode,
const std::string& executable,
const ProcessArgs& args,
const ProcessEnvVars& vars,
/// @brief Whether the process is waited immediately after spawning
/// (synchronous) or not (asynchronous).
- bool sync_;
+ ProcessSpawn::SpawnMode mode_;
/// @brief Path to an executable.
std::string executable_;
static IOSignalSetInitializer init(io_service);
}
-ProcessSpawnImpl::ProcessSpawnImpl(const bool sync,
+ProcessSpawnImpl::ProcessSpawnImpl(const ProcessSpawn::SpawnMode mode,
const std::string& executable,
const ProcessArgs& args,
const ProcessEnvVars& vars,
const bool inherit_env)
- : sync_(sync), executable_(executable), args_(new char*[args.size() + 2]),
+ : mode_(mode), executable_(executable), args_(new char*[args.size() + 2]),
store_(false) {
// Size of vars except the trailing null
pid_t
ProcessSpawnImpl::spawn(bool dismiss) {
lock_guard<std::mutex> lk(mutex_);
- if (!sync_) {
+ if (mode_ == ProcessSpawn::ASYNC) {
ProcessSpawnImpl::IOSignalSetInitializer::initIOSignalSet(ProcessSpawn::getIOService());
}
// Create the child
process_collection_[this].insert(std::pair<pid_t, ProcessStatePtr>(pid, ProcessStatePtr(new ProcessState())));
}
- if (sync_) {
+ if (mode_ == ProcessSpawn::SYNC) {
waitForProcess(SIGCHLD, pid, /* sync = */ true);
}
IOServicePtr ProcessSpawn::io_service_;
-ProcessSpawn::ProcessSpawn(const bool sync,
+ProcessSpawn::ProcessSpawn(const SpawnMode mode,
const std::string& executable,
const ProcessArgs& args,
const ProcessEnvVars& vars,
const bool inherit_env /* = false */)
- : impl_(new ProcessSpawnImpl(sync, executable, args, vars, inherit_env)) {
+ : impl_(new ProcessSpawnImpl(mode, executable, args, vars, inherit_env)) {
}
std::string
args.push_back("-e");
args.push_back("64");
- ProcessSpawn process(false, TEST_SCRIPT_SH, args);
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH, args);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
args.push_back("TEST_VARIABLE_VALUE");
vars.push_back("TEST_VARIABLE_NAME=TEST_VARIABLE_VALUE");
- ProcessSpawn process(false, TEST_SCRIPT_SH, args, vars);
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH, args, vars);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
vector<string> args;
args.push_back("-p");
- ProcessSpawn process(false, TEST_SCRIPT_SH, args);
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH, args);
pid_t pid1 = 0;
ASSERT_NO_THROW(pid1 = process.spawn());
// This test verifies that the external application can be ran without
// arguments and that the exit code is gathered.
TEST_F(ProcessSpawnTest, spawnNoArgs) {
- ProcessSpawn process(false, TEST_SCRIPT_SH);
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
// application can't be executed.
TEST_F(ProcessSpawnTest, invalidExecutable) {
std::string expected = "File not found: foo";
- ASSERT_THROW_MSG(ProcessSpawn process(false, "foo"),
+ ASSERT_THROW_MSG(ProcessSpawn process(ProcessSpawn::ASYNC, "foo"),
ProcessSpawnError, expected);
std::string name = INVALID_TEST_SCRIPT_SH;
expected = "File not executable: ";
expected += name;
- ASSERT_THROW_MSG(ProcessSpawn process(false, name),
+ ASSERT_THROW_MSG(ProcessSpawn process(ProcessSpawn::ASYNC, name),
ProcessSpawnError, expected);
}
args.push_back("-y");
args.push_back("foo");
args.push_back("bar");
- ProcessSpawn process(false, TEST_SCRIPT_SH, args);
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH, args);
std::string expected = TEST_SCRIPT_SH;
expected += " -x -y foo bar";
EXPECT_EQ(expected, process.getCommandLine());
{
// Case 2: no arguments.
- ProcessSpawn process(false, TEST_SCRIPT_SH);
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH);
EXPECT_EQ(TEST_SCRIPT_SH, process.getCommandLine());
}
}
args.push_back("-s");
args.push_back("10");
- ProcessSpawn process(false, TEST_SCRIPT_SH, args);
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH, args);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
ProcessEnvVars vars{"VAR=value"};
- ProcessSpawn process(false, TEST_SCRIPT_SH, args, vars,
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH, args, vars,
/* inherit_env = */ true);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
ProcessEnvVars vars{"VAR=value"};
- ProcessSpawn process(false, TEST_SCRIPT_SH, args, vars,
+ ProcessSpawn process(ProcessSpawn::ASYNC, TEST_SCRIPT_SH, args, vars,
/* inherit_env = */ true);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
args.push_back("-e");
args.push_back("64");
- ProcessSpawn process(true, TEST_SCRIPT_SH, args);
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH, args);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
args.push_back("TEST_VARIABLE_VALUE");
vars.push_back("TEST_VARIABLE_NAME=TEST_VARIABLE_VALUE");
- ProcessSpawn process(true, TEST_SCRIPT_SH, args, vars);
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH, args, vars);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
vector<string> args;
args.push_back("-p");
- ProcessSpawn process(true, TEST_SCRIPT_SH, args);
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH, args);
pid_t pid1 = 0;
ASSERT_NO_THROW(pid1 = process.spawn());
// This test verifies that the external application can be ran synchronously
// without arguments and that the exit code is gathered.
TEST_F(ProcessSpawnTest, spawnNoArgsSync) {
- ProcessSpawn process(true, TEST_SCRIPT_SH);
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
// application can't be executed synchronously.
TEST_F(ProcessSpawnTest, invalidExecutableSync) {
std::string expected = "File not found: foo";
- ASSERT_THROW_MSG(ProcessSpawn process(true, "foo"),
+ ASSERT_THROW_MSG(ProcessSpawn process(ProcessSpawn::SYNC, "foo"),
ProcessSpawnError, expected);
std::string name = INVALID_TEST_SCRIPT_SH;
expected = "File not executable: ";
expected += name;
- ASSERT_THROW_MSG(ProcessSpawn process(true, name),
+ ASSERT_THROW_MSG(ProcessSpawn process(ProcessSpawn::SYNC, name),
ProcessSpawnError, expected);
}
args.push_back("-y");
args.push_back("foo");
args.push_back("bar");
- ProcessSpawn process(true, TEST_SCRIPT_SH, args);
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH, args);
std::string expected = TEST_SCRIPT_SH;
expected += " -x -y foo bar";
EXPECT_EQ(expected, process.getCommandLine());
{
// Case 2: no arguments.
- ProcessSpawn process(true, TEST_SCRIPT_SH);
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH);
EXPECT_EQ(TEST_SCRIPT_SH, process.getCommandLine());
}
}
// This test verifies that the synchronous process reports as not running after
// it was spawned.
TEST_F(ProcessSpawnTest, isRunningSync) {
- ProcessSpawn process(true, TEST_SCRIPT_SH);
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
ProcessEnvVars vars{"VAR=value"};
- ProcessSpawn process(true, TEST_SCRIPT_SH, args, vars,
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH, args, vars,
/* inherit_env = */ true);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());
ProcessEnvVars vars{"VAR=value"};
- ProcessSpawn process(true, TEST_SCRIPT_SH, args, vars,
+ ProcessSpawn process(ProcessSpawn::SYNC, TEST_SCRIPT_SH, args, vars,
/* inherit_env = */ true);
pid_t pid = 0;
ASSERT_NO_THROW(pid = process.spawn());