#include "include/private/dvr/performance_client.h" #include <sys/types.h> #include <pdx/default_transport/client_channel_factory.h> #include <pdx/rpc/remote_method.h> #include <pdx/rpc/string_wrapper.h> #include <private/dvr/performance_rpc.h> using android::pdx::rpc::WrapString; namespace android { namespace dvr { PerformanceClient::PerformanceClient(int* error) : BASE(pdx::default_transport::ClientChannelFactory::Create( PerformanceRPC::kClientPath)) { if (error) *error = Client::error(); } int PerformanceClient::SetCpuPartition(pid_t task_id, const std::string& partition) { if (task_id == 0) task_id = gettid(); return ReturnStatusOrError( InvokeRemoteMethod<PerformanceRPC::SetCpuPartition>(task_id, partition)); } int PerformanceClient::SetCpuPartition(pid_t task_id, const char* partition) { if (task_id == 0) task_id = gettid(); return ReturnStatusOrError( InvokeRemoteMethod<PerformanceRPC::SetCpuPartition>( task_id, WrapString(partition))); } int PerformanceClient::SetSchedulerClass(pid_t task_id, const std::string& scheduler_class) { if (task_id == 0) task_id = gettid(); return ReturnStatusOrError( InvokeRemoteMethod<PerformanceRPC::SetSchedulerClass>(task_id, scheduler_class)); } int PerformanceClient::SetSchedulerClass(pid_t task_id, const char* scheduler_class) { if (task_id == 0) task_id = gettid(); return ReturnStatusOrError( InvokeRemoteMethod<PerformanceRPC::SetSchedulerClass>( task_id, WrapString(scheduler_class))); } int PerformanceClient::GetCpuPartition(pid_t task_id, std::string* partition_out) { if (partition_out == nullptr) return -EINVAL; if (task_id == 0) task_id = gettid(); auto status = InvokeRemoteMethodInPlace<PerformanceRPC::GetCpuPartition>( partition_out, task_id); return status ? 0 : -status.error(); } int PerformanceClient::GetCpuPartition(pid_t task_id, char* partition_out, std::size_t size) { if (partition_out == nullptr) return -EINVAL; if (task_id == 0) task_id = gettid(); auto wrapper = WrapString(partition_out, size); auto status = InvokeRemoteMethodInPlace<PerformanceRPC::GetCpuPartition>( &wrapper, task_id); if (!status) return -status.error(); if (wrapper.size() < size) partition_out[wrapper.size()] = '\0'; return 0; } } // namespace dvr } // namespace android extern "C" int dvrSetCpuPartition(pid_t task_id, const char* partition) { int error; if (auto client = android::dvr::PerformanceClient::Create(&error)) return client->SetCpuPartition(task_id, partition); else return error; } extern "C" int dvrSetSchedulerClass(pid_t task_id, const char* scheduler_class) { int error; if (auto client = android::dvr::PerformanceClient::Create(&error)) return client->SetSchedulerClass(task_id, scheduler_class); else return error; } extern "C" int dvrGetCpuPartition(pid_t task_id, char* partition, size_t size) { int error; if (auto client = android::dvr::PerformanceClient::Create(&error)) return client->GetCpuPartition(task_id, partition, size); else return error; }