#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;
}