X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fexternaltask.cpp;h=5f5d394597b3a7d073d80bc2caa830172ba97d92;hb=1dbeace0c44127bee08a3a8b231f4c8dcf707b2c;hp=fea331a72207004e14acd85b5ebfb94fb910a840;hpb=06678c3bb61404c483e4b9c39eaa7e7fb3f40c62;p=builder.git diff --git a/source/externaltask.cpp b/source/externaltask.cpp index fea331a..5f5d394 100644 --- a/source/externaltask.cpp +++ b/source/externaltask.cpp @@ -91,12 +91,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 +154,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(); }