rippled
Workers.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_CORE_WORKERS_H_INCLUDED
21 #define RIPPLE_CORE_WORKERS_H_INCLUDED
22 
23 #include <ripple/beast/core/LockFreeStack.h>
24 #include <ripple/core/impl/semaphore.h>
25 #include <atomic>
26 #include <condition_variable>
27 #include <mutex>
28 #include <string>
29 #include <thread>
30 
31 namespace ripple {
32 
33 namespace perf {
34 class PerfLog;
35 }
36 
68 class Workers
69 {
70 public:
72  struct Callback
73  {
74  virtual ~Callback() = default;
75  Callback() = default;
76  Callback(Callback const&) = delete;
77  Callback&
78  operator=(Callback const&) = delete;
79 
90  virtual void
91  processTask(int instance) = 0;
92  };
93 
101  explicit Workers(
102  Callback& callback,
103  perf::PerfLog* perfLog,
104  std::string const& threadNames = "Worker",
105  int numberOfThreads =
106  static_cast<int>(std::thread::hardware_concurrency()));
107 
108  ~Workers();
109 
118  int
119  getNumberOfThreads() const noexcept;
120 
124  void
125  setNumberOfThreads(int numberOfThreads);
126 
135  void
136  stop();
137 
146  void
147  addTask();
148 
153  int
154  numberOfCurrentlyRunningTasks() const noexcept;
155 
156  //--------------------------------------------------------------------------
157 
158 private:
159  struct PausedTag
160  {
161  explicit PausedTag() = default;
162  };
163 
164  /* A Worker executes tasks on its provided thread.
165 
166  These are the states:
167 
168  Active: Running the task processing loop.
169  Idle: Active, but blocked on waiting for a task.
170  Paused: Blocked waiting to exit or become active.
171  */
172  class Worker : public beast::LockFreeStack<Worker>::Node,
173  public beast::LockFreeStack<Worker, PausedTag>::Node
174  {
175  public:
176  Worker(
177  Workers& workers,
178  std::string const& threadName,
179  int const instance);
180 
181  ~Worker();
182 
183  void
184  notify();
185 
186  private:
187  void
188  run();
189 
190  private:
193  int const instance_;
194 
198  int wakeCount_; // how many times to un-pause
200  };
201 
202 private:
203  static void
205 
206 private:
209  std::string m_threadNames; // The name to give each thread
210  std::condition_variable m_cv; // signaled when all threads paused
213  semaphore m_semaphore; // each pending task is 1 resource
214  int m_numberOfThreads; // how many we want active now
215  std::atomic<int> m_activeCount; // to know when all are paused
216  std::atomic<int> m_pauseCount; // how many threads need to pause now
218  m_runningTaskCount; // how many calls to processTask() active
219  beast::LockFreeStack<Worker> m_everyone; // holds all created workers
221  m_paused; // holds just paused workers
222 };
223 
224 } // namespace ripple
225 
226 #endif
ripple::Workers::m_cv
std::condition_variable m_cv
Definition: Workers.h:210
ripple::Workers::perfLog_
perf::PerfLog * perfLog_
Definition: Workers.h:208
ripple::Workers::Callback::processTask
virtual void processTask(int instance)=0
Perform a task.
std::string
STL class.
ripple::Workers::stop
void stop()
Pause all threads and wait until they are paused.
Definition: Workers.cpp:114
ripple::Workers::deleteWorkers
static void deleteWorkers(beast::LockFreeStack< Worker > &stack)
Definition: Workers.cpp:138
ripple::Workers::m_pauseCount
std::atomic< int > m_pauseCount
Definition: Workers.h:216
ripple::Workers::getNumberOfThreads
int getNumberOfThreads() const noexcept
Retrieve the desired number of threads.
Definition: Workers.cpp:53
ripple::Workers::Worker::instance_
const int instance_
Definition: Workers.h:193
ripple::Workers::Worker::mutex_
std::mutex mutex_
Definition: Workers.h:196
ripple::Workers::m_paused
beast::LockFreeStack< Worker, PausedTag > m_paused
Definition: Workers.h:221
ripple::Workers::m_everyone
beast::LockFreeStack< Worker > m_everyone
Definition: Workers.h:219
ripple::Workers::setNumberOfThreads
void setNumberOfThreads(int numberOfThreads)
Set the desired number of threads.
Definition: Workers.cpp:63
ripple::Workers::Worker::~Worker
~Worker()
Definition: Workers.cpp:171
ripple::perf::PerfLog
Singleton class that maintains performance counters and optionally writes Json-formatted data to a di...
Definition: PerfLog.h:48
ripple::Workers::Worker::Worker
Worker(Workers &workers, std::string const &threadName, int const instance)
Definition: Workers.cpp:158
ripple::Workers::PausedTag
Definition: Workers.h:159
ripple::Workers::Worker::wakeup_
std::condition_variable wakeup_
Definition: Workers.h:197
ripple::Workers::Worker::wakeCount_
int wakeCount_
Definition: Workers.h:198
ripple::Workers::Callback
Called to perform tasks as needed.
Definition: Workers.h:72
ripple::Workers::m_threadNames
std::string m_threadNames
Definition: Workers.h:209
ripple::Workers::m_numberOfThreads
int m_numberOfThreads
Definition: Workers.h:214
ripple::Workers::~Workers
~Workers()
Definition: Workers.cpp:45
ripple::Workers::m_activeCount
std::atomic< int > m_activeCount
Definition: Workers.h:215
ripple::Workers::m_runningTaskCount
std::atomic< int > m_runningTaskCount
Definition: Workers.h:218
thread
ripple::basic_semaphore< std::mutex, std::condition_variable >
ripple::Workers::Worker::m_workers
Workers & m_workers
Definition: Workers.h:191
std::thread::hardware_concurrency
T hardware_concurrency(T... args)
ripple::Workers::Worker::threadName_
const std::string threadName_
Definition: Workers.h:192
ripple::Workers::m_semaphore
semaphore m_semaphore
Definition: Workers.h:213
atomic
ripple::Workers::Workers
Workers(Callback &callback, perf::PerfLog *perfLog, std::string const &threadNames="Worker", int numberOfThreads=static_cast< int >(std::thread::hardware_concurrency()))
Create the object.
Definition: Workers.cpp:27
ripple::Workers
Workers is effectively a thread pool.
Definition: Workers.h:68
ripple::Workers::Worker
Definition: Workers.h:172
ripple::Workers::Worker::notify
void notify()
Definition: Workers.cpp:184
ripple::Workers::Worker::run
void run()
Definition: Workers.cpp:192
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Workers::Callback::operator=
Callback & operator=(Callback const &)=delete
condition_variable
ripple::Workers::addTask
void addTask()
Add a task to be performed.
Definition: Workers.cpp:126
ripple::Workers::Callback::Callback
Callback()=default
ripple::Workers::Callback::~Callback
virtual ~Callback()=default
ripple::Workers::Worker::thread_
std::thread thread_
Definition: Workers.h:195
mutex
ripple::Workers::m_mut
std::mutex m_mut
Definition: Workers.h:211
ripple::Workers::m_callback
Callback & m_callback
Definition: Workers.h:207
ripple::Workers::numberOfCurrentlyRunningTasks
int numberOfCurrentlyRunningTasks() const noexcept
Get the number of currently executing calls of Callback::processTask.
Definition: Workers.cpp:132
ripple::Workers::Worker::shouldExit_
bool shouldExit_
Definition: Workers.h:199
ripple::Workers::m_allPaused
bool m_allPaused
Definition: Workers.h:212
beast::LockFreeStack
Multiple Producer, Multiple Consumer (MPMC) intrusive stack.
Definition: LockFreeStack.h:155
string