1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_PERFTEST_UTIL_H_ 6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_PERFTEST_UTIL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h" 12*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 15*6777b538SAndroid Build Coastguard Worker #include <windows.h> 16*6777b538SAndroid Build Coastguard Worker #endif 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 19*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 20*6777b538SAndroid Build Coastguard Worker #include "base/process/process_metrics.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_executor.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h" 23*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 24*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel.h" 25*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_listener.h" 26*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message.h" 27*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_sender.h" 28*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_test.mojom.h" 29*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/receiver.h" 30*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/system/message_pipe.h" 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 33*6777b538SAndroid Build Coastguard Worker #include <windows.h> 34*6777b538SAndroid Build Coastguard Worker #endif 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker namespace IPC { 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SingleThreadTaskRunner> GetIOThreadTaskRunner(); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // This channel listener just replies to all messages with the exact same 41*6777b538SAndroid Build Coastguard Worker // message. It assumes each message has one string parameter. When the string 42*6777b538SAndroid Build Coastguard Worker // "quit" is sent, it will exit. 43*6777b538SAndroid Build Coastguard Worker class ChannelReflectorListener : public Listener { 44*6777b538SAndroid Build Coastguard Worker public: 45*6777b538SAndroid Build Coastguard Worker ChannelReflectorListener(); 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker ~ChannelReflectorListener() override; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker void Init(Sender* channel, base::OnceClosure quit_closure); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker bool OnMessageReceived(const Message& message) override; 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker void OnHello(); 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker void OnPing(const std::string& payload); 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker void OnSyncPing(const std::string& payload, std::string* response); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker void OnQuit(); 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker void Send(IPC::Message* message); 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker private: 64*6777b538SAndroid Build Coastguard Worker raw_ptr<Sender> channel_; 65*6777b538SAndroid Build Coastguard Worker base::OnceClosure quit_closure_; 66*6777b538SAndroid Build Coastguard Worker }; 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker // This class locks the current thread to a particular CPU core. This is 69*6777b538SAndroid Build Coastguard Worker // important because otherwise the different threads and processes of these 70*6777b538SAndroid Build Coastguard Worker // tests end up on different CPU cores which means that all of the cores are 71*6777b538SAndroid Build Coastguard Worker // lightly loaded so the OS (Windows and Linux) fails to ramp up the CPU 72*6777b538SAndroid Build Coastguard Worker // frequency, leading to unpredictable and often poor performance. 73*6777b538SAndroid Build Coastguard Worker class LockThreadAffinity { 74*6777b538SAndroid Build Coastguard Worker public: 75*6777b538SAndroid Build Coastguard Worker explicit LockThreadAffinity(int cpu_number); 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker LockThreadAffinity(const LockThreadAffinity&) = delete; 78*6777b538SAndroid Build Coastguard Worker LockThreadAffinity& operator=(const LockThreadAffinity&) = delete; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker ~LockThreadAffinity(); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker private: 83*6777b538SAndroid Build Coastguard Worker bool affinity_set_ok_; 84*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 85*6777b538SAndroid Build Coastguard Worker DWORD_PTR old_affinity_; 86*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) 87*6777b538SAndroid Build Coastguard Worker cpu_set_t old_cpuset_; 88*6777b538SAndroid Build Coastguard Worker #endif 89*6777b538SAndroid Build Coastguard Worker }; 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker // Avoid core 0 due to conflicts with Intel's Power Gadget. 92*6777b538SAndroid Build Coastguard Worker // Setting thread affinity will fail harmlessly on single/dual core machines. 93*6777b538SAndroid Build Coastguard Worker const int kSharedCore = 2; 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker class MojoPerfTestClient { 96*6777b538SAndroid Build Coastguard Worker public: 97*6777b538SAndroid Build Coastguard Worker MojoPerfTestClient(); 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker ~MojoPerfTestClient(); 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker int Run(MojoHandle handle); 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker private: 104*6777b538SAndroid Build Coastguard Worker base::SingleThreadTaskExecutor main_task_executor_; 105*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ChannelReflectorListener> listener_; 106*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Channel> channel_; 107*6777b538SAndroid Build Coastguard Worker mojo::ScopedMessagePipeHandle handle_; 108*6777b538SAndroid Build Coastguard Worker }; 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker class ReflectorImpl : public IPC::mojom::Reflector { 111*6777b538SAndroid Build Coastguard Worker public: 112*6777b538SAndroid Build Coastguard Worker explicit ReflectorImpl(mojo::ScopedMessagePipeHandle handle, 113*6777b538SAndroid Build Coastguard Worker base::OnceClosure quit_closure); 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker ~ReflectorImpl() override; 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker private: 118*6777b538SAndroid Build Coastguard Worker // IPC::mojom::Reflector: 119*6777b538SAndroid Build Coastguard Worker void Ping(const std::string& value, PingCallback callback) override; 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker void SyncPing(const std::string& value, PingCallback callback) override; 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Worker void Quit() override; 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker base::OnceClosure quit_closure_; 126*6777b538SAndroid Build Coastguard Worker mojo::Receiver<IPC::mojom::Reflector> receiver_; 127*6777b538SAndroid Build Coastguard Worker }; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker } // namespace IPC 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_PERFTEST_UTIL_H_ 132