xref: /aosp_15_r20/test/dittosuite/src/instruction_factory.cpp (revision 6fa2df46f119dce7527f5beb2814eca0e6f886ac)
1*6fa2df46SAndroid Build Coastguard Worker // Copyright (C) 2021 The Android Open Source Project
2*6fa2df46SAndroid Build Coastguard Worker //
3*6fa2df46SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*6fa2df46SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*6fa2df46SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*6fa2df46SAndroid Build Coastguard Worker //
7*6fa2df46SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*6fa2df46SAndroid Build Coastguard Worker //
9*6fa2df46SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*6fa2df46SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*6fa2df46SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6fa2df46SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*6fa2df46SAndroid Build Coastguard Worker // limitations under the License.
14*6fa2df46SAndroid Build Coastguard Worker 
15*6fa2df46SAndroid Build Coastguard Worker #include <ditto/instruction_factory.h>
16*6fa2df46SAndroid Build Coastguard Worker 
17*6fa2df46SAndroid Build Coastguard Worker #include <fcntl.h>
18*6fa2df46SAndroid Build Coastguard Worker #include <sys/types.h>
19*6fa2df46SAndroid Build Coastguard Worker 
20*6fa2df46SAndroid Build Coastguard Worker #include <random>
21*6fa2df46SAndroid Build Coastguard Worker 
22*6fa2df46SAndroid Build Coastguard Worker #include <ditto/binder_request.h>
23*6fa2df46SAndroid Build Coastguard Worker #include <ditto/binder_service.h>
24*6fa2df46SAndroid Build Coastguard Worker #include <ditto/close_file.h>
25*6fa2df46SAndroid Build Coastguard Worker #include <ditto/cpu_work.h>
26*6fa2df46SAndroid Build Coastguard Worker #include <ditto/delete_file.h>
27*6fa2df46SAndroid Build Coastguard Worker #include <ditto/instruction_set.h>
28*6fa2df46SAndroid Build Coastguard Worker #include <ditto/invalidate_cache.h>
29*6fa2df46SAndroid Build Coastguard Worker #include <ditto/lock.h>
30*6fa2df46SAndroid Build Coastguard Worker #include <ditto/logger.h>
31*6fa2df46SAndroid Build Coastguard Worker #include <ditto/memory_allocation.h>
32*6fa2df46SAndroid Build Coastguard Worker #include <ditto/multiprocessing.h>
33*6fa2df46SAndroid Build Coastguard Worker #include <ditto/multithreading.h>
34*6fa2df46SAndroid Build Coastguard Worker #include <ditto/multithreading_utils.h>
35*6fa2df46SAndroid Build Coastguard Worker #include <ditto/open_file.h>
36*6fa2df46SAndroid Build Coastguard Worker #include <ditto/read_directory.h>
37*6fa2df46SAndroid Build Coastguard Worker #include <ditto/read_write_file.h>
38*6fa2df46SAndroid Build Coastguard Worker #include <ditto/resize_file.h>
39*6fa2df46SAndroid Build Coastguard Worker #include <ditto/shared_variables.h>
40*6fa2df46SAndroid Build Coastguard Worker #include <ditto/syscall.h>
41*6fa2df46SAndroid Build Coastguard Worker 
42*6fa2df46SAndroid Build Coastguard Worker namespace dittosuite {
43*6fa2df46SAndroid Build Coastguard Worker typedef dittosuiteproto::Instruction::InstructionOneofCase InstructionType;
44*6fa2df46SAndroid Build Coastguard Worker typedef dittosuiteproto::BinderRequest::ServiceOneofCase RequestService;
45*6fa2df46SAndroid Build Coastguard Worker typedef dittosuiteproto::CpuWork::TypeCase CpuWorkType;
46*6fa2df46SAndroid Build Coastguard Worker 
CreateFromProtoInstructionSet(const dittosuite::Instruction::Params & instruction_params,const std::list<int> & thread_ids,const dittosuiteproto::InstructionSet & proto_instruction_set)47*6fa2df46SAndroid Build Coastguard Worker std::unique_ptr<InstructionSet> InstructionFactory::CreateFromProtoInstructionSet(
48*6fa2df46SAndroid Build Coastguard Worker     const dittosuite::Instruction::Params& instruction_params, const std::list<int>& thread_ids,
49*6fa2df46SAndroid Build Coastguard Worker     const dittosuiteproto::InstructionSet& proto_instruction_set) {
50*6fa2df46SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<Instruction>> instructions;
51*6fa2df46SAndroid Build Coastguard Worker   for (const auto& instruction : proto_instruction_set.instructions()) {
52*6fa2df46SAndroid Build Coastguard Worker     instructions.push_back(
53*6fa2df46SAndroid Build Coastguard Worker         InstructionFactory::CreateFromProtoInstruction(thread_ids, instruction));
54*6fa2df46SAndroid Build Coastguard Worker   }
55*6fa2df46SAndroid Build Coastguard Worker 
56*6fa2df46SAndroid Build Coastguard Worker   if (proto_instruction_set.has_iterate_options()) {
57*6fa2df46SAndroid Build Coastguard Worker     const auto& options = proto_instruction_set.iterate_options();
58*6fa2df46SAndroid Build Coastguard Worker 
59*6fa2df46SAndroid Build Coastguard Worker     int list_key = SharedVariables::GetKey(thread_ids, options.list_name());
60*6fa2df46SAndroid Build Coastguard Worker     int item_key = SharedVariables::GetKey(thread_ids, options.item_name());
61*6fa2df46SAndroid Build Coastguard Worker     auto access_order = ConvertOrder(options.access_order());
62*6fa2df46SAndroid Build Coastguard Worker     auto reseeding = ConvertReseeding(options.reseeding());
63*6fa2df46SAndroid Build Coastguard Worker 
64*6fa2df46SAndroid Build Coastguard Worker     uint32_t seed = options.seed();
65*6fa2df46SAndroid Build Coastguard Worker     if (!options.has_seed()) {
66*6fa2df46SAndroid Build Coastguard Worker       seed = time(nullptr);
67*6fa2df46SAndroid Build Coastguard Worker     }
68*6fa2df46SAndroid Build Coastguard Worker 
69*6fa2df46SAndroid Build Coastguard Worker     return std::make_unique<InstructionSet>(instruction_params, std::move(instructions), list_key,
70*6fa2df46SAndroid Build Coastguard Worker                                             item_key, access_order, reseeding, seed);
71*6fa2df46SAndroid Build Coastguard Worker   } else {
72*6fa2df46SAndroid Build Coastguard Worker     return std::make_unique<InstructionSet>(instruction_params, std::move(instructions));
73*6fa2df46SAndroid Build Coastguard Worker   }
74*6fa2df46SAndroid Build Coastguard Worker }
75*6fa2df46SAndroid Build Coastguard Worker 
CreateFromProtoInstruction(const std::list<int> & thread_ids,const dittosuiteproto::Instruction & proto_instruction)76*6fa2df46SAndroid Build Coastguard Worker std::unique_ptr<Instruction> InstructionFactory::CreateFromProtoInstruction(
77*6fa2df46SAndroid Build Coastguard Worker     const std::list<int>& thread_ids, const dittosuiteproto::Instruction& proto_instruction) {
78*6fa2df46SAndroid Build Coastguard Worker   Instruction::Params instruction_params(Syscall::GetSyscall(), proto_instruction.repeat(),
79*6fa2df46SAndroid Build Coastguard Worker                                          proto_instruction.period_us(),
80*6fa2df46SAndroid Build Coastguard Worker                                          proto_instruction.offset_us());
81*6fa2df46SAndroid Build Coastguard Worker 
82*6fa2df46SAndroid Build Coastguard Worker   switch (proto_instruction.instruction_oneof_case()) {
83*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kInstructionSet: {
84*6fa2df46SAndroid Build Coastguard Worker       return InstructionFactory::CreateFromProtoInstructionSet(instruction_params, thread_ids,
85*6fa2df46SAndroid Build Coastguard Worker                                                                proto_instruction.instruction_set());
86*6fa2df46SAndroid Build Coastguard Worker     }
87*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kOpenFile: {
88*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.open_file();
89*6fa2df46SAndroid Build Coastguard Worker 
90*6fa2df46SAndroid Build Coastguard Worker       int fd_key = -1;
91*6fa2df46SAndroid Build Coastguard Worker       if (options.has_output_fd()) {
92*6fa2df46SAndroid Build Coastguard Worker         fd_key = SharedVariables::GetKey(thread_ids, options.output_fd());
93*6fa2df46SAndroid Build Coastguard Worker       }
94*6fa2df46SAndroid Build Coastguard Worker 
95*6fa2df46SAndroid Build Coastguard Worker       dittosuite::OpenFile::AccessMode access_mode;
96*6fa2df46SAndroid Build Coastguard Worker       {
97*6fa2df46SAndroid Build Coastguard Worker         switch (options.access_mode()) {
98*6fa2df46SAndroid Build Coastguard Worker           case dittosuiteproto::AccessMode::READ_ONLY:
99*6fa2df46SAndroid Build Coastguard Worker             access_mode = OpenFile::AccessMode::kReadOnly;
100*6fa2df46SAndroid Build Coastguard Worker             break;
101*6fa2df46SAndroid Build Coastguard Worker           case dittosuiteproto::AccessMode::WRITE_ONLY:
102*6fa2df46SAndroid Build Coastguard Worker             access_mode = OpenFile::AccessMode::kWriteOnly;
103*6fa2df46SAndroid Build Coastguard Worker             break;
104*6fa2df46SAndroid Build Coastguard Worker           case dittosuiteproto::AccessMode::READ_WRITE:
105*6fa2df46SAndroid Build Coastguard Worker             access_mode = OpenFile::AccessMode::kReadWrite;
106*6fa2df46SAndroid Build Coastguard Worker             break;
107*6fa2df46SAndroid Build Coastguard Worker           default:
108*6fa2df46SAndroid Build Coastguard Worker             LOGF("Invalid instruction OpenFile access mode: it should be at least read or write");
109*6fa2df46SAndroid Build Coastguard Worker             break;
110*6fa2df46SAndroid Build Coastguard Worker         }
111*6fa2df46SAndroid Build Coastguard Worker       }
112*6fa2df46SAndroid Build Coastguard Worker 
113*6fa2df46SAndroid Build Coastguard Worker       if (options.has_input()) {
114*6fa2df46SAndroid Build Coastguard Worker         int input_key = SharedVariables::GetKey(thread_ids, options.input());
115*6fa2df46SAndroid Build Coastguard Worker         return std::make_unique<OpenFile>(instruction_params, input_key, options.create(),
116*6fa2df46SAndroid Build Coastguard Worker                                           options.direct_io(), fd_key, access_mode);
117*6fa2df46SAndroid Build Coastguard Worker       } else if (options.has_path_name()) {
118*6fa2df46SAndroid Build Coastguard Worker         return std::make_unique<OpenFile>(instruction_params, options.path_name(), options.create(),
119*6fa2df46SAndroid Build Coastguard Worker                                           options.direct_io(), fd_key, access_mode);
120*6fa2df46SAndroid Build Coastguard Worker       } else {
121*6fa2df46SAndroid Build Coastguard Worker         return std::make_unique<OpenFile>(instruction_params, options.create(), options.direct_io(),
122*6fa2df46SAndroid Build Coastguard Worker                                           fd_key, access_mode);
123*6fa2df46SAndroid Build Coastguard Worker       }
124*6fa2df46SAndroid Build Coastguard Worker     }
125*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kDeleteFile: {
126*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.delete_file();
127*6fa2df46SAndroid Build Coastguard Worker 
128*6fa2df46SAndroid Build Coastguard Worker       if (options.has_input()) {
129*6fa2df46SAndroid Build Coastguard Worker         int input_key = SharedVariables::GetKey(thread_ids, options.input());
130*6fa2df46SAndroid Build Coastguard Worker         return std::make_unique<DeleteFile>(instruction_params, input_key);
131*6fa2df46SAndroid Build Coastguard Worker       } else {
132*6fa2df46SAndroid Build Coastguard Worker         return std::make_unique<DeleteFile>(instruction_params, options.path_name());
133*6fa2df46SAndroid Build Coastguard Worker       }
134*6fa2df46SAndroid Build Coastguard Worker     }
135*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kCloseFile: {
136*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.close_file();
137*6fa2df46SAndroid Build Coastguard Worker 
138*6fa2df46SAndroid Build Coastguard Worker       int fd_key = SharedVariables::GetKey(thread_ids, options.input_fd());
139*6fa2df46SAndroid Build Coastguard Worker 
140*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<CloseFile>(instruction_params, fd_key);
141*6fa2df46SAndroid Build Coastguard Worker     }
142*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kResizeFile: {
143*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.resize_file();
144*6fa2df46SAndroid Build Coastguard Worker 
145*6fa2df46SAndroid Build Coastguard Worker       int fd_key = SharedVariables::GetKey(thread_ids, options.input_fd());
146*6fa2df46SAndroid Build Coastguard Worker 
147*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<ResizeFile>(instruction_params, options.size(), fd_key);
148*6fa2df46SAndroid Build Coastguard Worker     }
149*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kWriteFile: {
150*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.write_file();
151*6fa2df46SAndroid Build Coastguard Worker 
152*6fa2df46SAndroid Build Coastguard Worker       auto access_order = ConvertOrder(options.access_order());
153*6fa2df46SAndroid Build Coastguard Worker 
154*6fa2df46SAndroid Build Coastguard Worker       uint32_t seed = options.seed();
155*6fa2df46SAndroid Build Coastguard Worker       if (!options.has_seed()) {
156*6fa2df46SAndroid Build Coastguard Worker         seed = time(nullptr);
157*6fa2df46SAndroid Build Coastguard Worker       }
158*6fa2df46SAndroid Build Coastguard Worker 
159*6fa2df46SAndroid Build Coastguard Worker       auto reseeding = ConvertReseeding(options.reseeding());
160*6fa2df46SAndroid Build Coastguard Worker       int fd_key = SharedVariables::GetKey(thread_ids, options.input_fd());
161*6fa2df46SAndroid Build Coastguard Worker 
162*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<WriteFile>(instruction_params, options.size(), options.block_size(),
163*6fa2df46SAndroid Build Coastguard Worker                                          options.starting_offset(), access_order, seed, reseeding,
164*6fa2df46SAndroid Build Coastguard Worker                                          options.fsync(), fd_key);
165*6fa2df46SAndroid Build Coastguard Worker     }
166*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kReadFile: {
167*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.read_file();
168*6fa2df46SAndroid Build Coastguard Worker 
169*6fa2df46SAndroid Build Coastguard Worker       auto access_order = ConvertOrder(options.access_order());
170*6fa2df46SAndroid Build Coastguard Worker 
171*6fa2df46SAndroid Build Coastguard Worker       uint32_t seed = options.seed();
172*6fa2df46SAndroid Build Coastguard Worker       if (!options.has_seed()) {
173*6fa2df46SAndroid Build Coastguard Worker         seed = time(nullptr);
174*6fa2df46SAndroid Build Coastguard Worker       }
175*6fa2df46SAndroid Build Coastguard Worker 
176*6fa2df46SAndroid Build Coastguard Worker       auto fadvise = ConvertReadFAdvise(access_order, options.fadvise());
177*6fa2df46SAndroid Build Coastguard Worker       auto reseeding = ConvertReseeding(options.reseeding());
178*6fa2df46SAndroid Build Coastguard Worker       int fd_key = SharedVariables::GetKey(thread_ids, options.input_fd());
179*6fa2df46SAndroid Build Coastguard Worker 
180*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<ReadFile>(instruction_params, options.size(), options.block_size(),
181*6fa2df46SAndroid Build Coastguard Worker                                         options.starting_offset(), access_order, seed, reseeding,
182*6fa2df46SAndroid Build Coastguard Worker                                         fadvise, fd_key);
183*6fa2df46SAndroid Build Coastguard Worker     }
184*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kReadDirectory: {
185*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.read_directory();
186*6fa2df46SAndroid Build Coastguard Worker 
187*6fa2df46SAndroid Build Coastguard Worker       int output_key = SharedVariables::GetKey(thread_ids, options.output());
188*6fa2df46SAndroid Build Coastguard Worker 
189*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<ReadDirectory>(instruction_params, options.directory_name(),
190*6fa2df46SAndroid Build Coastguard Worker                                              output_key);
191*6fa2df46SAndroid Build Coastguard Worker     }
192*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kResizeFileRandom: {
193*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.resize_file_random();
194*6fa2df46SAndroid Build Coastguard Worker 
195*6fa2df46SAndroid Build Coastguard Worker       uint32_t seed = options.seed();
196*6fa2df46SAndroid Build Coastguard Worker       if (!options.has_seed()) {
197*6fa2df46SAndroid Build Coastguard Worker         seed = time(nullptr);
198*6fa2df46SAndroid Build Coastguard Worker       }
199*6fa2df46SAndroid Build Coastguard Worker 
200*6fa2df46SAndroid Build Coastguard Worker       auto reseeding = ConvertReseeding(options.reseeding());
201*6fa2df46SAndroid Build Coastguard Worker       int fd_key = SharedVariables::GetKey(thread_ids, options.input_fd());
202*6fa2df46SAndroid Build Coastguard Worker 
203*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<ResizeFileRandom>(instruction_params, options.min(), options.max(),
204*6fa2df46SAndroid Build Coastguard Worker                                                 seed, reseeding, fd_key);
205*6fa2df46SAndroid Build Coastguard Worker     }
206*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kMultithreading: {
207*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.multithreading();
208*6fa2df46SAndroid Build Coastguard Worker 
209*6fa2df46SAndroid Build Coastguard Worker       std::vector<MultithreadingParams> thread_params;
210*6fa2df46SAndroid Build Coastguard Worker       std::vector<std::unique_ptr<Instruction>> instructions;
211*6fa2df46SAndroid Build Coastguard Worker 
212*6fa2df46SAndroid Build Coastguard Worker       for (int t = 0; t < options.threads().size(); t++) {
213*6fa2df46SAndroid Build Coastguard Worker         const auto& thread = options.threads()[t];
214*6fa2df46SAndroid Build Coastguard Worker         for (int i = 0; i < thread.spawn(); i++) {
215*6fa2df46SAndroid Build Coastguard Worker           auto thread_ids_copy = thread_ids;
216*6fa2df46SAndroid Build Coastguard Worker           thread_ids_copy.push_back(InstructionFactory::GenerateThreadId());
217*6fa2df46SAndroid Build Coastguard Worker           instructions.push_back(InstructionFactory::CreateFromProtoInstruction(
218*6fa2df46SAndroid Build Coastguard Worker               thread_ids_copy, thread.instruction()));
219*6fa2df46SAndroid Build Coastguard Worker 
220*6fa2df46SAndroid Build Coastguard Worker           std::string thread_name;
221*6fa2df46SAndroid Build Coastguard Worker           if (thread.has_name()) {
222*6fa2df46SAndroid Build Coastguard Worker             thread_name = thread.name() + "_" + std::to_string(i);
223*6fa2df46SAndroid Build Coastguard Worker           } else {
224*6fa2df46SAndroid Build Coastguard Worker             thread_name = std::to_string(t) + "_" + std::to_string(i);
225*6fa2df46SAndroid Build Coastguard Worker           }
226*6fa2df46SAndroid Build Coastguard Worker 
227*6fa2df46SAndroid Build Coastguard Worker           SchedAttr sched_attr(Syscall::GetSyscall());
228*6fa2df46SAndroid Build Coastguard Worker           if (thread.has_sched_attr()) {
229*6fa2df46SAndroid Build Coastguard Worker             sched_attr = thread.sched_attr();
230*6fa2df46SAndroid Build Coastguard Worker           }
231*6fa2df46SAndroid Build Coastguard Worker 
232*6fa2df46SAndroid Build Coastguard Worker           SchedAffinity sched_affinity(Syscall::GetSyscall());
233*6fa2df46SAndroid Build Coastguard Worker           if (thread.has_sched_affinity()) {
234*6fa2df46SAndroid Build Coastguard Worker             sched_affinity = thread.sched_affinity();
235*6fa2df46SAndroid Build Coastguard Worker           }
236*6fa2df46SAndroid Build Coastguard Worker 
237*6fa2df46SAndroid Build Coastguard Worker           thread_params.push_back(MultithreadingParams(thread_name, sched_attr, sched_affinity));
238*6fa2df46SAndroid Build Coastguard Worker         }
239*6fa2df46SAndroid Build Coastguard Worker       }
240*6fa2df46SAndroid Build Coastguard Worker 
241*6fa2df46SAndroid Build Coastguard Worker       if (options.fork()) {
242*6fa2df46SAndroid Build Coastguard Worker         return std::make_unique<Multiprocessing>(instruction_params, std::move(instructions),
243*6fa2df46SAndroid Build Coastguard Worker                                                  std::move(thread_params));
244*6fa2df46SAndroid Build Coastguard Worker       } else {
245*6fa2df46SAndroid Build Coastguard Worker         return std::make_unique<Multithreading>(instruction_params, std::move(instructions),
246*6fa2df46SAndroid Build Coastguard Worker                                                 std::move(thread_params));
247*6fa2df46SAndroid Build Coastguard Worker       }
248*6fa2df46SAndroid Build Coastguard Worker     }
249*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kInvalidateCache: {
250*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<InvalidateCache>(instruction_params);
251*6fa2df46SAndroid Build Coastguard Worker     }
252*6fa2df46SAndroid Build Coastguard Worker #if __ANDROID__
253*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kBinderRequest: {
254*6fa2df46SAndroid Build Coastguard Worker       const auto& binder_request = proto_instruction.binder_request();
255*6fa2df46SAndroid Build Coastguard Worker       switch (binder_request.service_oneof_case()) {
256*6fa2df46SAndroid Build Coastguard Worker         case RequestService::kServiceName: {
257*6fa2df46SAndroid Build Coastguard Worker           const auto& options = proto_instruction.binder_request();
258*6fa2df46SAndroid Build Coastguard Worker           return std::make_unique<BinderRequestDitto>(instruction_params, options.service_name());
259*6fa2df46SAndroid Build Coastguard Worker           break;
260*6fa2df46SAndroid Build Coastguard Worker         }
261*6fa2df46SAndroid Build Coastguard Worker         case RequestService::kRunningService: {
262*6fa2df46SAndroid Build Coastguard Worker           return std::make_unique<BinderRequestMountService>(instruction_params);
263*6fa2df46SAndroid Build Coastguard Worker           break;
264*6fa2df46SAndroid Build Coastguard Worker         }
265*6fa2df46SAndroid Build Coastguard Worker         case RequestService::kGenericService: {
266*6fa2df46SAndroid Build Coastguard Worker           const auto& options = proto_instruction.binder_request();
267*6fa2df46SAndroid Build Coastguard Worker           const auto& generic_service = options.generic_service();
268*6fa2df46SAndroid Build Coastguard Worker           return std::make_unique<GenericBinderRequest>(instruction_params, generic_service.name(), generic_service.code(), generic_service.parcel_input());
269*6fa2df46SAndroid Build Coastguard Worker         }
270*6fa2df46SAndroid Build Coastguard Worker         case RequestService::SERVICE_ONEOF_NOT_SET: {
271*6fa2df46SAndroid Build Coastguard Worker           LOGF("No service specified for BinderRequest");
272*6fa2df46SAndroid Build Coastguard Worker           break;
273*6fa2df46SAndroid Build Coastguard Worker         }
274*6fa2df46SAndroid Build Coastguard Worker       }
275*6fa2df46SAndroid Build Coastguard Worker       break;
276*6fa2df46SAndroid Build Coastguard Worker     }
277*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kBinderService: {
278*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.binder_service();
279*6fa2df46SAndroid Build Coastguard Worker 
280*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<BinderService>(instruction_params, options.name(), options.threads());
281*6fa2df46SAndroid Build Coastguard Worker     }
282*6fa2df46SAndroid Build Coastguard Worker #endif /*__ANDROID__*/
283*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kCpuWork: {
284*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.cpu_work();
285*6fa2df46SAndroid Build Coastguard Worker 
286*6fa2df46SAndroid Build Coastguard Worker       switch (options.type_case()) {
287*6fa2df46SAndroid Build Coastguard Worker         case CpuWorkType::kCycles: {
288*6fa2df46SAndroid Build Coastguard Worker           return std::make_unique<CpuWorkCycles>(instruction_params, options.cycles());
289*6fa2df46SAndroid Build Coastguard Worker           break;
290*6fa2df46SAndroid Build Coastguard Worker         }
291*6fa2df46SAndroid Build Coastguard Worker         case CpuWorkType::kUtilization: {
292*6fa2df46SAndroid Build Coastguard Worker           return std::make_unique<CpuWorkUtilization>(instruction_params, options.utilization());
293*6fa2df46SAndroid Build Coastguard Worker           break;
294*6fa2df46SAndroid Build Coastguard Worker         }
295*6fa2df46SAndroid Build Coastguard Worker         case CpuWorkType::kDurationUs: {
296*6fa2df46SAndroid Build Coastguard Worker           return std::make_unique<CpuWorkDurationUs>(instruction_params, options.duration_us());
297*6fa2df46SAndroid Build Coastguard Worker           break;
298*6fa2df46SAndroid Build Coastguard Worker         }
299*6fa2df46SAndroid Build Coastguard Worker         case CpuWorkType::TYPE_NOT_SET: {
300*6fa2df46SAndroid Build Coastguard Worker           LOGF("No type specified for CpuWorkload");
301*6fa2df46SAndroid Build Coastguard Worker           break;
302*6fa2df46SAndroid Build Coastguard Worker         }
303*6fa2df46SAndroid Build Coastguard Worker       }
304*6fa2df46SAndroid Build Coastguard Worker     }
305*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kMemAlloc: {
306*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.mem_alloc();
307*6fa2df46SAndroid Build Coastguard Worker 
308*6fa2df46SAndroid Build Coastguard Worker       dittosuite::FreePolicy free_policy = ConvertFreePolicy(options.free_policy());
309*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<MemoryAllocation>(instruction_params, options.size(), free_policy);
310*6fa2df46SAndroid Build Coastguard Worker       break;
311*6fa2df46SAndroid Build Coastguard Worker     }
312*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kLock: {
313*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.lock();
314*6fa2df46SAndroid Build Coastguard Worker 
315*6fa2df46SAndroid Build Coastguard Worker       if (!options.has_mutex() || !options.mutex().has_name()) {
316*6fa2df46SAndroid Build Coastguard Worker         LOGF("Locking instruction must have a mutex and the mutex must be named");
317*6fa2df46SAndroid Build Coastguard Worker       }
318*6fa2df46SAndroid Build Coastguard Worker       if (!SharedVariables::Exists(thread_ids, options.mutex().name())) {
319*6fa2df46SAndroid Build Coastguard Worker         LOGF(
320*6fa2df46SAndroid Build Coastguard Worker             "Could not find mutex declaration. Mutexes must be declared in the global section of "
321*6fa2df46SAndroid Build Coastguard Worker             "the .ditto file");
322*6fa2df46SAndroid Build Coastguard Worker       }
323*6fa2df46SAndroid Build Coastguard Worker 
324*6fa2df46SAndroid Build Coastguard Worker       auto mux_key = SharedVariables::GetKey(thread_ids, options.mutex().name());
325*6fa2df46SAndroid Build Coastguard Worker       auto mux = std::get_if<pthread_mutex_t>(SharedVariables::GetPointer(mux_key));
326*6fa2df46SAndroid Build Coastguard Worker 
327*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<Lock>(instruction_params, mux);
328*6fa2df46SAndroid Build Coastguard Worker       break;
329*6fa2df46SAndroid Build Coastguard Worker     }
330*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::kUnlock: {
331*6fa2df46SAndroid Build Coastguard Worker       const auto& options = proto_instruction.unlock();
332*6fa2df46SAndroid Build Coastguard Worker 
333*6fa2df46SAndroid Build Coastguard Worker       if (!options.has_mutex() || !options.mutex().has_name()) {
334*6fa2df46SAndroid Build Coastguard Worker         LOGF("Locking instruction must have a mutex and the mutex must be named");
335*6fa2df46SAndroid Build Coastguard Worker       }
336*6fa2df46SAndroid Build Coastguard Worker 
337*6fa2df46SAndroid Build Coastguard Worker       if (!SharedVariables::Exists(thread_ids, options.mutex().name())) {
338*6fa2df46SAndroid Build Coastguard Worker         LOGF(
339*6fa2df46SAndroid Build Coastguard Worker             "Could not find mutex declaration. Mutexes must be declared in the global section of "
340*6fa2df46SAndroid Build Coastguard Worker             "the .ditto file");
341*6fa2df46SAndroid Build Coastguard Worker       }
342*6fa2df46SAndroid Build Coastguard Worker 
343*6fa2df46SAndroid Build Coastguard Worker       auto mux_key = SharedVariables::GetKey(thread_ids, options.mutex().name());
344*6fa2df46SAndroid Build Coastguard Worker       auto mux = std::get_if<pthread_mutex_t>(SharedVariables::GetPointer(mux_key));
345*6fa2df46SAndroid Build Coastguard Worker 
346*6fa2df46SAndroid Build Coastguard Worker       return std::make_unique<Unlock>(instruction_params, mux);
347*6fa2df46SAndroid Build Coastguard Worker       break;
348*6fa2df46SAndroid Build Coastguard Worker     }
349*6fa2df46SAndroid Build Coastguard Worker     case InstructionType::INSTRUCTION_ONEOF_NOT_SET: {
350*6fa2df46SAndroid Build Coastguard Worker       LOGF("Instruction was not set in .ditto file");
351*6fa2df46SAndroid Build Coastguard Worker       break;
352*6fa2df46SAndroid Build Coastguard Worker     }
353*6fa2df46SAndroid Build Coastguard Worker     default: {
354*6fa2df46SAndroid Build Coastguard Worker       LOGF("Invalid instruction was set in .ditto file");
355*6fa2df46SAndroid Build Coastguard Worker     }
356*6fa2df46SAndroid Build Coastguard Worker   }
357*6fa2df46SAndroid Build Coastguard Worker }
358*6fa2df46SAndroid Build Coastguard Worker 
GenerateThreadId()359*6fa2df46SAndroid Build Coastguard Worker int InstructionFactory::GenerateThreadId() {
360*6fa2df46SAndroid Build Coastguard Worker   return current_thread_id_++;
361*6fa2df46SAndroid Build Coastguard Worker }
362*6fa2df46SAndroid Build Coastguard Worker 
363*6fa2df46SAndroid Build Coastguard Worker int InstructionFactory::current_thread_id_ = 0;
364*6fa2df46SAndroid Build Coastguard Worker 
ConvertReseeding(const dittosuiteproto::Reseeding proto_reseeding)365*6fa2df46SAndroid Build Coastguard Worker Reseeding InstructionFactory::ConvertReseeding(const dittosuiteproto::Reseeding proto_reseeding) {
366*6fa2df46SAndroid Build Coastguard Worker   switch (proto_reseeding) {
367*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::Reseeding::ONCE: {
368*6fa2df46SAndroid Build Coastguard Worker       return Reseeding::kOnce;
369*6fa2df46SAndroid Build Coastguard Worker     }
370*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::Reseeding::EACH_ROUND_OF_CYCLES: {
371*6fa2df46SAndroid Build Coastguard Worker       return Reseeding::kEachRoundOfCycles;
372*6fa2df46SAndroid Build Coastguard Worker     }
373*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::Reseeding::EACH_CYCLE: {
374*6fa2df46SAndroid Build Coastguard Worker       return Reseeding::kEachCycle;
375*6fa2df46SAndroid Build Coastguard Worker     }
376*6fa2df46SAndroid Build Coastguard Worker     default: {
377*6fa2df46SAndroid Build Coastguard Worker       LOGF("Invalid Reseeding was provided");
378*6fa2df46SAndroid Build Coastguard Worker     }
379*6fa2df46SAndroid Build Coastguard Worker   }
380*6fa2df46SAndroid Build Coastguard Worker }
381*6fa2df46SAndroid Build Coastguard Worker 
ConvertOrder(const dittosuiteproto::Order proto_order)382*6fa2df46SAndroid Build Coastguard Worker Order InstructionFactory::ConvertOrder(const dittosuiteproto::Order proto_order) {
383*6fa2df46SAndroid Build Coastguard Worker   switch (proto_order) {
384*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::Order::SEQUENTIAL: {
385*6fa2df46SAndroid Build Coastguard Worker       return Order::kSequential;
386*6fa2df46SAndroid Build Coastguard Worker     }
387*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::Order::RANDOM: {
388*6fa2df46SAndroid Build Coastguard Worker       return Order::kRandom;
389*6fa2df46SAndroid Build Coastguard Worker     }
390*6fa2df46SAndroid Build Coastguard Worker     default: {
391*6fa2df46SAndroid Build Coastguard Worker       LOGF("Invalid Order was provided");
392*6fa2df46SAndroid Build Coastguard Worker     }
393*6fa2df46SAndroid Build Coastguard Worker   }
394*6fa2df46SAndroid Build Coastguard Worker }
395*6fa2df46SAndroid Build Coastguard Worker 
ConvertReadFAdvise(const Order access_order,const dittosuiteproto::ReadFile_ReadFAdvise proto_fadvise)396*6fa2df46SAndroid Build Coastguard Worker int InstructionFactory::ConvertReadFAdvise(
397*6fa2df46SAndroid Build Coastguard Worker     const Order access_order, const dittosuiteproto::ReadFile_ReadFAdvise proto_fadvise) {
398*6fa2df46SAndroid Build Coastguard Worker   switch (proto_fadvise) {
399*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::ReadFile_ReadFAdvise_AUTOMATIC: {
400*6fa2df46SAndroid Build Coastguard Worker       switch (access_order) {
401*6fa2df46SAndroid Build Coastguard Worker         case Order::kSequential: {
402*6fa2df46SAndroid Build Coastguard Worker           return POSIX_FADV_SEQUENTIAL;
403*6fa2df46SAndroid Build Coastguard Worker         }
404*6fa2df46SAndroid Build Coastguard Worker         case Order::kRandom: {
405*6fa2df46SAndroid Build Coastguard Worker           return POSIX_FADV_RANDOM;
406*6fa2df46SAndroid Build Coastguard Worker         }
407*6fa2df46SAndroid Build Coastguard Worker       }
408*6fa2df46SAndroid Build Coastguard Worker     }
409*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::ReadFile_ReadFAdvise_NORMAL: {
410*6fa2df46SAndroid Build Coastguard Worker       return POSIX_FADV_NORMAL;
411*6fa2df46SAndroid Build Coastguard Worker     }
412*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::ReadFile_ReadFAdvise_SEQUENTIAL: {
413*6fa2df46SAndroid Build Coastguard Worker       return POSIX_FADV_SEQUENTIAL;
414*6fa2df46SAndroid Build Coastguard Worker     }
415*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::ReadFile_ReadFAdvise_RANDOM: {
416*6fa2df46SAndroid Build Coastguard Worker       return POSIX_FADV_RANDOM;
417*6fa2df46SAndroid Build Coastguard Worker     }
418*6fa2df46SAndroid Build Coastguard Worker     default: {
419*6fa2df46SAndroid Build Coastguard Worker       LOGF("Invalid ReadFAdvise was provided");
420*6fa2df46SAndroid Build Coastguard Worker     }
421*6fa2df46SAndroid Build Coastguard Worker   }
422*6fa2df46SAndroid Build Coastguard Worker }
423*6fa2df46SAndroid Build Coastguard Worker 
ConvertFreePolicy(const dittosuiteproto::FreePolicy proto_policy)424*6fa2df46SAndroid Build Coastguard Worker FreePolicy InstructionFactory::ConvertFreePolicy(const dittosuiteproto::FreePolicy proto_policy) {
425*6fa2df46SAndroid Build Coastguard Worker   switch (proto_policy) {
426*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::FreePolicy::FREE_POLICY_EVERY_PERIOD:
427*6fa2df46SAndroid Build Coastguard Worker       return FreePolicy::kFreeEveryPeriod;
428*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::FreePolicy::FREE_POLICY_LAST_PERIOD:
429*6fa2df46SAndroid Build Coastguard Worker       return FreePolicy::kFreeLastPeriod;
430*6fa2df46SAndroid Build Coastguard Worker     case dittosuiteproto::FreePolicy::FREE_POLICY_KEEP:
431*6fa2df46SAndroid Build Coastguard Worker       return FreePolicy::kKeep;
432*6fa2df46SAndroid Build Coastguard Worker     default: {
433*6fa2df46SAndroid Build Coastguard Worker       LOGF("Invalid FreePolicy");
434*6fa2df46SAndroid Build Coastguard Worker     }
435*6fa2df46SAndroid Build Coastguard Worker   }
436*6fa2df46SAndroid Build Coastguard Worker }
437*6fa2df46SAndroid Build Coastguard Worker 
438*6fa2df46SAndroid Build Coastguard Worker }  // namespace dittosuite
439