]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
Improve task management to use blocking wait if possible
[builder.git] / source / builder.cpp
index 6c508026c6e7a67e6b32198609e3a5c112d21d9b..7b0f0187f762cf03defc63645cc285f9db647934 100644 (file)
@@ -365,7 +365,7 @@ int Builder::load_build_file(const FS::Path &fn)
        logger.log("files", format("Reading %s", fn));
 
        DataFile::Parser parser(in, fn.str());
-       Loader loader(*this, fn.subpath(0, fn.size()-1));
+       Loader loader(*this);
        loader.load(parser);
 
        return 0;
@@ -457,10 +457,11 @@ int Builder::do_build()
 
        bool fail = false;
        bool finish = false;
+       bool starved = false;
 
        while(!finish)
        {
-               if(tasks.size()<jobs && !fail)
+               if(tasks.size()<jobs && !fail && !starved)
                {
                        Target *tgt = cmdline->get_buildable_target();
                        if(tgt)
@@ -488,13 +489,20 @@ int Builder::do_build()
                        }
                        else if(tasks.empty())
                                finish = true;
+                       else
+                               starved = true;
                }
                else
                        Time::sleep(10*Time::msec);
 
                for(unsigned i=0; i<tasks.size();)
                {
-                       Task::Status status = tasks[i]->check();
+                       Task::Status status;
+                       if(jobs==1 || (tasks.size()==1 && starved))
+                               status = tasks[i]->wait();
+                       else
+                               status = tasks[i]->check();
+
                        if(status!=Task::RUNNING)
                        {
                                ++count;
@@ -505,6 +513,7 @@ int Builder::do_build()
                                        fail = true;
                                if(tasks.empty() && fail)
                                        finish = true;
+                               starved = false;
                        }
                        else
                                ++i;
@@ -518,6 +527,13 @@ int Builder::do_build()
        else if(show_progress)
                logger.log("summary", "Build complete");
 
+       if(!dry_run)
+       {
+               const PackageManager::PackageMap &packages = package_manager.get_packages();
+               for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i)
+                       i->second->save_caches();
+       }
+
        return fail;
 }
 
@@ -579,9 +595,8 @@ string Builder::usagemsg;
 string Builder::helpmsg;
 
 
-Builder::Loader::Loader(Builder &b, const FS::Path &s):
-       DataFile::ObjectLoader<Builder>(b),
-       src(s)
+Builder::Loader::Loader(Builder &b):
+       DataFile::ObjectLoader<Builder>(b)
 {
        add("architecture", &Loader::architecture);
        add("binary_package", &Loader::binpkg);
@@ -618,7 +633,7 @@ void Builder::Loader::profile(const string &)
 
 void Builder::Loader::package(const string &n)
 {
-       SourcePackage *pkg = new SourcePackage(obj, n, src);
+       SourcePackage *pkg = new SourcePackage(obj, n, get_source());
        if(!obj.main_pkg)
                obj.main_pkg = pkg;