blob: 2233d95c0617837318e7f23c7252a068bdf96f64 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sync_manager.h"
namespace netemul {
void SyncManager::BusSubscribe(std::string busName, std::string clientName,
::fidl::InterfaceRequest<Bus::FBus> bus) {
auto& b = GetBus(busName);
b.Subscribe(clientName, std::move(bus));
}
Bus& SyncManager::GetBus(const std::string& name) {
auto f = buses_.find(name);
if (f != buses_.end()) {
return *f->second;
}
// bus doesn't exist yet, create it:
auto bus = std::make_unique<Bus>(dispatcher_);
auto ret = buses_.insert(std::pair<std::string, Bus::Ptr>(name, std::move(bus)));
return *ret.first->second;
}
fidl::InterfaceRequestHandler<fuchsia::netemul::sync::SyncManager> SyncManager::GetHandler() {
return bindings_.GetHandler(this, dispatcher_);
}
void SyncManager::WaitForBarrierThreshold(::std::string barrierName, uint32_t threshold,
int64_t timeout,
WaitForBarrierThresholdCallback callback) {
auto barrier = counter_barriers_.find(barrierName);
if (barrier == counter_barriers_.end()) {
barrier =
counter_barriers_
.insert(std::make_pair(barrierName, std::make_unique<CounterBarrier>(dispatcher_)))
.first;
}
barrier->second->AddWatch(threshold, timeout, std::move(callback));
if (barrier->second->empty()) {
counter_barriers_.erase(barrier);
}
}
SyncManager::~SyncManager() = default;
} // namespace netemul