]> git.tdb.fi Git - builder.git/blobdiff - source/externaltask.cpp
Be more efficient when running commands synchronously
[builder.git] / source / externaltask.cpp
index fea331a72207004e14acd85b5ebfb94fb910a840..5f5d394597b3a7d073d80bc2caa830172ba97d92 100644 (file)
@@ -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();
 }