1 #include "include/private/dvr/performance_client.h"
2
3 #include <sys/types.h>
4
5 #include <pdx/default_transport/client_channel_factory.h>
6 #include <pdx/rpc/remote_method.h>
7 #include <pdx/rpc/string_wrapper.h>
8 #include <private/dvr/performance_rpc.h>
9
10 using android::pdx::rpc::WrapString;
11
12 namespace android {
13 namespace dvr {
14
PerformanceClient(int * error)15 PerformanceClient::PerformanceClient(int* error)
16 : BASE(pdx::default_transport::ClientChannelFactory::Create(
17 PerformanceRPC::kClientPath)) {
18 if (error)
19 *error = Client::error();
20 }
21
SetCpuPartition(pid_t task_id,const std::string & partition)22 int PerformanceClient::SetCpuPartition(pid_t task_id,
23 const std::string& partition) {
24 if (task_id == 0)
25 task_id = gettid();
26
27 return ReturnStatusOrError(
28 InvokeRemoteMethod<PerformanceRPC::SetCpuPartition>(task_id, partition));
29 }
30
SetCpuPartition(pid_t task_id,const char * partition)31 int PerformanceClient::SetCpuPartition(pid_t task_id, const char* partition) {
32 if (task_id == 0)
33 task_id = gettid();
34
35 return ReturnStatusOrError(
36 InvokeRemoteMethod<PerformanceRPC::SetCpuPartition>(
37 task_id, WrapString(partition)));
38 }
39
SetSchedulerClass(pid_t task_id,const std::string & scheduler_class)40 int PerformanceClient::SetSchedulerClass(pid_t task_id,
41 const std::string& scheduler_class) {
42 if (task_id == 0)
43 task_id = gettid();
44
45 return ReturnStatusOrError(
46 InvokeRemoteMethod<PerformanceRPC::SetSchedulerClass>(task_id,
47 scheduler_class));
48 }
49
SetSchedulerClass(pid_t task_id,const char * scheduler_class)50 int PerformanceClient::SetSchedulerClass(pid_t task_id,
51 const char* scheduler_class) {
52 if (task_id == 0)
53 task_id = gettid();
54
55 return ReturnStatusOrError(
56 InvokeRemoteMethod<PerformanceRPC::SetSchedulerClass>(
57 task_id, WrapString(scheduler_class)));
58 }
59
GetCpuPartition(pid_t task_id,std::string * partition_out)60 int PerformanceClient::GetCpuPartition(pid_t task_id,
61 std::string* partition_out) {
62 if (partition_out == nullptr)
63 return -EINVAL;
64
65 if (task_id == 0)
66 task_id = gettid();
67
68 auto status = InvokeRemoteMethodInPlace<PerformanceRPC::GetCpuPartition>(
69 partition_out, task_id);
70 return status ? 0 : -status.error();
71 }
72
GetCpuPartition(pid_t task_id,char * partition_out,std::size_t size)73 int PerformanceClient::GetCpuPartition(pid_t task_id, char* partition_out,
74 std::size_t size) {
75 if (partition_out == nullptr)
76 return -EINVAL;
77
78 if (task_id == 0)
79 task_id = gettid();
80
81 auto wrapper = WrapString(partition_out, size);
82 auto status = InvokeRemoteMethodInPlace<PerformanceRPC::GetCpuPartition>(
83 &wrapper, task_id);
84 if (!status)
85 return -status.error();
86
87 if (wrapper.size() < size)
88 partition_out[wrapper.size()] = '\0';
89
90 return 0;
91 }
92
93 } // namespace dvr
94 } // namespace android
95
dvrSetCpuPartition(pid_t task_id,const char * partition)96 extern "C" int dvrSetCpuPartition(pid_t task_id, const char* partition) {
97 int error;
98 if (auto client = android::dvr::PerformanceClient::Create(&error))
99 return client->SetCpuPartition(task_id, partition);
100 else
101 return error;
102 }
103
dvrSetSchedulerClass(pid_t task_id,const char * scheduler_class)104 extern "C" int dvrSetSchedulerClass(pid_t task_id,
105 const char* scheduler_class) {
106 int error;
107 if (auto client = android::dvr::PerformanceClient::Create(&error))
108 return client->SetSchedulerClass(task_id, scheduler_class);
109 else
110 return error;
111 }
112
dvrGetCpuPartition(pid_t task_id,char * partition,size_t size)113 extern "C" int dvrGetCpuPartition(pid_t task_id, char* partition, size_t size) {
114 int error;
115 if (auto client = android::dvr::PerformanceClient::Create(&error))
116 return client->GetCpuPartition(task_id, partition, size);
117 else
118 return error;
119 }
120