• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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