From 3d36cdfd6f71b0ed7c152003acf91e8432b78461 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 26 Jun 2022 15:45:10 +0200 Subject: WIP --- src/build.cc | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) (limited to 'src/build.cc') diff --git a/src/build.cc b/src/build.cc index 98952e0..502c67c 100644 --- a/src/build.cc +++ b/src/build.cc @@ -52,8 +52,13 @@ int build(const Settings& settings, std::list> processes; + const auto start_interval = 50ms; + const auto poll_interval = 10ms; + auto last = std::chrono::system_clock::now() - start_interval; + // Start all tasks bool done{false}; + std::shared_ptr nextTask{}; while(!done) { bool started_one{false}; @@ -65,7 +70,14 @@ int build(const Settings& settings, break; } - auto task = getNextTask(all_tasks, dirtyTasks); + if(!nextTask) + { + nextTask = getNextTask(all_tasks, dirtyTasks); + } + + auto task = nextTask; + nextTask.reset(); + if(task == nullptr) { if(processes.empty() && !dirtyTasks.empty()) @@ -77,6 +89,16 @@ int build(const Settings& settings, break; } + auto now = std::chrono::system_clock::now(); + if(now - last < start_interval) + { + // Make sure we don't start tasks too close to each other to prevent + // straining the disk. + std::this_thread::sleep_for(start_interval - (now - last)); + } + + last = now; + processes.emplace_back( std::async(std::launch::async, [task]() @@ -84,9 +106,11 @@ int build(const Settings& settings, return task->run(); })); started_one = true; - // Make sure we don't start tasks on top of each other to prevent - // straining the disk. - std::this_thread::sleep_for(50ms); + + //if(!nextTask) + //{ + // nextTask = getNextTask(all_tasks, dirtyTasks); + //} } for(auto process = processes.begin(); @@ -108,9 +132,9 @@ int build(const Settings& settings, break; } - if(!started_one) // prevent polling too fast if no task is yet ready + if(!started_one && nextTask) // prevent polling too fast if no task is yet ready { - std::this_thread::sleep_for(10ms); + std::this_thread::sleep_for(poll_interval); } } -- cgit v1.2.3