int prefork(std::string &err) {
assert(!forked);
int r = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
+ std::ostringstream oss;
if (r < 0) {
- std::ostringstream oss;
oss << "[" << getpid() << "]: unable to create socketpair: " << cpp_strerror(errno);
err = oss.str();
return r;
return childpid != 0;
}
- int parent_wait(std::string &err) {
+ int parent_wait(std::string &err_msg) {
assert(forked);
int r = -1;
oss << "[" << getpid() << "]" << " returned exit_status " << cpp_strerror(err);
}
}
- err = oss.str();
+ err_msg = oss.str();
return err;
}
if (m_started) {
return -EDOM;
}
+ int ret;
bool use_threads = SysTestSettings::inst().use_threads();
if (use_threads) {
- int ret = pthread_create(&m_pthread, NULL, systest_runnable_pthread_helper,
+ ret = pthread_create(&m_pthread, NULL, systest_runnable_pthread_helper,
static_cast<void*>(this));
if (ret)
return ret;
m_started = true;
- return 0;
- }
- else {
- prefork.prefork();
+ } else {
+ std::string err_msg;
+ ret = preforker.prefork(err_msg);
+ if (ret < 0)
+ preforker.exit(ret);
- if (prefork.is_child()) {
+ if (preforker.is_child()) {
m_started = true;
void *retptr = systest_runnable_pthread_helper(static_cast<void*>(this));
- prefork.exit((int)(uintptr_t)retptr);
+ preforker.exit((int)(uintptr_t)retptr);
} else {
m_started = true;
- return 0;
}
}
+ return 0;
}
std::string SysTestRunnable::
}
return "";
} else {
- ret = preforker.parent_wait();
- if (ret < 0) {
- ostringstream oss;
- oss << get_id_str() << " waitpid error: " << cpp_strerror(err);
- return oss.str();
- } else {
- return "";
- }
+ std::string err_msg;
+ ret = preforker.parent_wait(err_msg);
+ return err_msg;
}
}