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 #pragma once 16*6fa2df46SAndroid Build Coastguard Worker 17*6fa2df46SAndroid Build Coastguard Worker #include <pthread.h> 18*6fa2df46SAndroid Build Coastguard Worker 19*6fa2df46SAndroid Build Coastguard Worker #include <memory> 20*6fa2df46SAndroid Build Coastguard Worker #include <string> 21*6fa2df46SAndroid Build Coastguard Worker #include <thread> 22*6fa2df46SAndroid Build Coastguard Worker 23*6fa2df46SAndroid Build Coastguard Worker #include <ditto/multithreading_utils.h> 24*6fa2df46SAndroid Build Coastguard Worker #include <ditto/result.h> 25*6fa2df46SAndroid Build Coastguard Worker #include <ditto/sampler.h> 26*6fa2df46SAndroid Build Coastguard Worker #include <ditto/syscall.h> 27*6fa2df46SAndroid Build Coastguard Worker #include <ditto/tracer.h> 28*6fa2df46SAndroid Build Coastguard Worker 29*6fa2df46SAndroid Build Coastguard Worker namespace dittosuite { 30*6fa2df46SAndroid Build Coastguard Worker 31*6fa2df46SAndroid Build Coastguard Worker enum class Order { kSequential, kRandom }; 32*6fa2df46SAndroid Build Coastguard Worker enum class Reseeding { kOnce, kEachRoundOfCycles, kEachCycle }; 33*6fa2df46SAndroid Build Coastguard Worker enum class FreePolicy { kKeep, kFreeLastPeriod, kFreeEveryPeriod }; 34*6fa2df46SAndroid Build Coastguard Worker 35*6fa2df46SAndroid Build Coastguard Worker class Instruction { 36*6fa2df46SAndroid Build Coastguard Worker public: 37*6fa2df46SAndroid Build Coastguard Worker struct Params { 38*6fa2df46SAndroid Build Coastguard Worker Params(SyscallInterface& syscall, int repeat = 1, uint64_t period_us = 0, 39*6fa2df46SAndroid Build Coastguard Worker uint64_t offset_us = 0) syscall_Params40*6fa2df46SAndroid Build Coastguard Worker : syscall_(syscall), repeat_(repeat), period_us_(period_us), offset_us_(offset_us) {} 41*6fa2df46SAndroid Build Coastguard Worker SyscallInterface& syscall_; 42*6fa2df46SAndroid Build Coastguard Worker int repeat_; 43*6fa2df46SAndroid Build Coastguard Worker uint64_t period_us_; 44*6fa2df46SAndroid Build Coastguard Worker uint64_t offset_us_; 45*6fa2df46SAndroid Build Coastguard Worker }; 46*6fa2df46SAndroid Build Coastguard Worker 47*6fa2df46SAndroid Build Coastguard Worker explicit Instruction(const std::string& name, const Params& params); 48*6fa2df46SAndroid Build Coastguard Worker virtual ~Instruction() = default; 49*6fa2df46SAndroid Build Coastguard Worker 50*6fa2df46SAndroid Build Coastguard Worker virtual void SetUp(); 51*6fa2df46SAndroid Build Coastguard Worker void Run(); 52*6fa2df46SAndroid Build Coastguard Worker void RunSynchronized(pthread_barrier_t* barrier, const MultithreadingParams& params); 53*6fa2df46SAndroid Build Coastguard Worker std::thread SpawnThread(pthread_barrier_t* barrier, const MultithreadingParams& params); 54*6fa2df46SAndroid Build Coastguard Worker virtual void TearDown(); 55*6fa2df46SAndroid Build Coastguard Worker 56*6fa2df46SAndroid Build Coastguard Worker virtual std::unique_ptr<Result> CollectResults(const std::string& prefix); 57*6fa2df46SAndroid Build Coastguard Worker 58*6fa2df46SAndroid Build Coastguard Worker static void SetAbsolutePathKey(int absolute_path_key); 59*6fa2df46SAndroid Build Coastguard Worker static void SetArgv(char** argv); 60*6fa2df46SAndroid Build Coastguard Worker static void SetArgc(int argc); 61*6fa2df46SAndroid Build Coastguard Worker 62*6fa2df46SAndroid Build Coastguard Worker protected: 63*6fa2df46SAndroid Build Coastguard Worker virtual void SetUpSingle(); 64*6fa2df46SAndroid Build Coastguard Worker virtual void RunSingle() = 0; 65*6fa2df46SAndroid Build Coastguard Worker /* This function is executed after every RunSingle(). In some cases, for 66*6fa2df46SAndroid Build Coastguard Worker * example in the implementation of a producer-consumer, the consumer should 67*6fa2df46SAndroid Build Coastguard Worker * know at what time it should stop with its execution, and this can be 68*6fa2df46SAndroid Build Coastguard Worker * handled by the producer to send a special message at the last 69*6fa2df46SAndroid Build Coastguard Worker * TearDownSingle. The last iteration of TearDownSingle has the `is_last` 70*6fa2df46SAndroid Build Coastguard Worker * value set to true, false otherwise. */ 71*6fa2df46SAndroid Build Coastguard Worker virtual void TearDownSingle(bool is_last); 72*6fa2df46SAndroid Build Coastguard Worker 73*6fa2df46SAndroid Build Coastguard Worker std::string GetAbsolutePath(); 74*6fa2df46SAndroid Build Coastguard Worker 75*6fa2df46SAndroid Build Coastguard Worker static int absolute_path_key_; 76*6fa2df46SAndroid Build Coastguard Worker static char **argv_; 77*6fa2df46SAndroid Build Coastguard Worker static int argc_; 78*6fa2df46SAndroid Build Coastguard Worker std::string name_; 79*6fa2df46SAndroid Build Coastguard Worker SyscallInterface& syscall_; 80*6fa2df46SAndroid Build Coastguard Worker int repeat_; 81*6fa2df46SAndroid Build Coastguard Worker uint64_t period_us_; 82*6fa2df46SAndroid Build Coastguard Worker uint64_t offset_us_; 83*6fa2df46SAndroid Build Coastguard Worker TimeSampler time_sampler_; 84*6fa2df46SAndroid Build Coastguard Worker Tracer tracer_; 85*6fa2df46SAndroid Build Coastguard Worker 86*6fa2df46SAndroid Build Coastguard Worker private: 87*6fa2df46SAndroid Build Coastguard Worker timespec next_wakeup_; 88*6fa2df46SAndroid Build Coastguard Worker }; 89*6fa2df46SAndroid Build Coastguard Worker 90*6fa2df46SAndroid Build Coastguard Worker } // namespace dittosuite 91