blob: f5bf7aa914ecddf684a64f37e64f8f41a82e8182 [file] [log] [blame]
// Copyright 2019 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 "scheduler_profile.h"
#include <fidl/fuchsia.scheduler/cpp/wire.h>
#include <lib/fdio/directory.h>
#include <lib/service/llcpp/service.h>
#include <lib/zx/channel.h>
#include <lib/zx/profile.h>
#include <lib/zx/thread.h>
#include <stdio.h>
#include <string.h>
#include <zircon/types.h>
namespace internal {
namespace {
fidl::ClientEnd<fuchsia_scheduler::ProfileProvider> scheduler_profile_provider;
} // namespace
zx_status_t connect_scheduler_profile_provider() {
zx::status client_end = service::Connect<fuchsia_scheduler::ProfileProvider>();
if (client_end.is_ok()) {
scheduler_profile_provider = std::move(client_end.value());
}
return client_end.status_value();
}
zx_status_t get_scheduler_profile(uint32_t priority, const char* name, zx_handle_t* profile) {
fidl::WireResult result =
fidl::WireCall(scheduler_profile_provider)
->GetProfile(priority, fidl::StringView::FromExternal(name, strlen(name)));
if (!result.ok()) {
return result.status();
}
fidl::WireResponse response = std::move(result.value());
if (response.status != ZX_OK) {
return response.status;
}
*profile = response.profile.release();
return ZX_OK;
}
zx_status_t get_scheduler_deadline_profile(uint64_t capacity, uint64_t deadline, uint64_t period,
const char* name, zx_handle_t* profile) {
fidl::WireResult result =
fidl::WireCall(scheduler_profile_provider)
->GetDeadlineProfile(capacity, deadline, period,
fidl::StringView::FromExternal(name, strlen(name)));
if (!result.ok()) {
return result.status();
}
fidl::WireResponse response = std::move(result.value());
if (response.status != ZX_OK) {
return response.status;
}
*profile = response.profile.release();
return ZX_OK;
}
zx_status_t set_scheduler_profile_by_role(zx_handle_t thread, const char* role, size_t role_size) {
zx::unowned_thread original_thread{thread};
zx::thread duplicate_thread;
zx_status_t status =
original_thread->duplicate(ZX_RIGHT_TRANSFER | ZX_RIGHT_MANAGE_THREAD, &duplicate_thread);
if (status != ZX_OK) {
return status;
}
fidl::WireResult result = fidl::WireCall(scheduler_profile_provider)
->SetProfileByRole(std::move(duplicate_thread),
fidl::StringView::FromExternal(role, role_size));
if (!result.ok()) {
return result.status();
}
fidl::WireResponse response = std::move(result.value());
if (response.status != ZX_OK) {
return response.status;
}
return ZX_OK;
}
} // namespace internal