diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/build.cc | 36 | 
1 files changed, 30 insertions, 6 deletions
| 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<std::future<int>> 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<Task> 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);  		}  	} | 
