blob: 8a05425b9badee6ce98f89916bb37a009b8c55e0 [file] [log] [blame]
// Copyright 2018 The Chromium OS 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 "vm_tools/concierge/startup_listener_impl.h"
#include <inttypes.h>
#include <string.h>
namespace vm_tools {
namespace concierge {
grpc::Status StartupListenerImpl::VmReady(grpc::ServerContext* ctx,
const vm_tools::EmptyMessage* request,
vm_tools::EmptyMessage* response) {
uint64_t cid = 0;
if (sscanf(ctx->peer().c_str(), "vsock:%" PRIu64, &cid) != 1) {
LOG(WARNING) << "Failed to parse peer address " << ctx->peer();
return grpc::Status(grpc::FAILED_PRECONDITION,
"Invalid peer for StartupListener");
}
base::AutoLock lock(vm_lock_);
auto iter = pending_vms_.find(cid);
if (iter == pending_vms_.end()) {
LOG(ERROR) << "Received VmReady from vm with unknown context id: " << cid;
return grpc::Status(grpc::FAILED_PRECONDITION, "VM is not known");
}
iter->second->Signal();
pending_vms_.erase(iter);
return grpc::Status::OK;
}
void StartupListenerImpl::AddPendingVm(uint32_t cid,
base::WaitableEvent* event) {
base::AutoLock lock(vm_lock_);
pending_vms_[cid] = event;
}
void StartupListenerImpl::RemovePendingVm(uint32_t cid) {
base::AutoLock lock(vm_lock_);
pending_vms_.erase(cid);
}
} // namespace concierge
} // namespace vm_tools