]> 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 1c90aa8e2229ac6192fcc9bff7c92b7c59417e2a..7b0f0187f762cf03defc63645cc285f9db647934 100644 (file)
@@ -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;
 }