mirror of
https://github.com/ProgramSnail/build_system_2022.git
synced 2025-12-06 00:48:42 +00:00
init
This commit is contained in:
parent
4d899f64a7
commit
b4a7121411
23 changed files with 681 additions and 11 deletions
44
dependency_manager.cpp
Normal file
44
dependency_manager.cpp
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
#include "dependency_manager.hpp"
|
||||
|
||||
namespace build_system {
|
||||
|
||||
void DependencyManager::waitAll() {
|
||||
for (size_t i = 0; i < dependency_counters_.size(); ++i) {
|
||||
wait(i);
|
||||
}
|
||||
}
|
||||
|
||||
void DependencyManager::wait(size_t id) {
|
||||
auto &counter = dependency_counters_[id];
|
||||
size_t counter_value = counter.load();
|
||||
while (counter_value != 0) {
|
||||
counter.wait(counter_value);
|
||||
counter_value = counter.load();
|
||||
}
|
||||
}
|
||||
|
||||
size_t DependencyManager::add(size_t id,
|
||||
const std::vector<size_t>& dependences) {
|
||||
size_t new_id = dependency_counters_.size();
|
||||
|
||||
dependency_counters_.emplace_back(dependences.size());
|
||||
|
||||
tasks_consequences_.emplace_back();
|
||||
|
||||
for (auto& dependency_id : dependences) {
|
||||
tasks_consequences_[to_new_id[dependency_id]].push_back(new_id);
|
||||
}
|
||||
|
||||
to_new_id[id] = new_id;
|
||||
return new_id;
|
||||
}
|
||||
|
||||
void DependencyManager::done(size_t id) {
|
||||
for (auto &consequence_id : tasks_consequences_[id]) {
|
||||
if (dependency_counters_[consequence_id].fetch_sub(1) == 1) {
|
||||
dependency_counters_[consequence_id].notify_all();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}; // namespace build_system
|
||||
Loading…
Add table
Add a link
Reference in a new issue