X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternaltask.cpp;h=643831e993b9b7e8a8d4c2b65f11245c612bba18;hb=1c42eb92bc1f07baecbb8752e532608426621c05;hp=fea331a72207004e14acd85b5ebfb94fb910a840;hpb=06678c3bb61404c483e4b9c39eaa7e7fb3f40c62;p=builder.git diff --git a/source/externaltask.cpp b/source/externaltask.cpp index fea331a..643831e 100644 --- a/source/externaltask.cpp +++ b/source/externaltask.cpp @@ -50,6 +50,8 @@ void ExternalTask::start() if(stdout_dest==CAPTURE || stderr_dest==CAPTURE) capture_pipe = new IO::Pipe; + prepare(); + if((pid = fork())) { if(pid==-1) @@ -91,12 +93,21 @@ void ExternalTask::start() } Task::Status ExternalTask::check() +{ + return do_wait(false); +} + +Task::Status ExternalTask::wait() +{ + return do_wait(true); +} + +Task::Status ExternalTask::do_wait(bool block) { if(pid>0) { - // XXX This is sub-optimal, should have support for a blocking wait int status; - if(waitpid(pid, &status, WNOHANG)==pid) + if(waitpid(pid, &status, (block ? 0 : WNOHANG))==pid) { if(WIFEXITED(status)) exit_code = WEXITSTATUS(status); @@ -145,9 +156,7 @@ string ExternalTask::run_and_capture_output(const Arguments &argv, const FS::Pat task.set_stdout(CAPTURE); task.set_stderr(IGNORE); task.start(); - Task::Status status; - while((status=task.check())==RUNNING) ; - if(status!=SUCCESS) + if(task.wait()!=SUCCESS) throw runtime_error(format("%s failed", argv.front())); return task.get_output(); }