// 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
