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/core/impl/semaphore.h>
24 #include <ripple/beast/core/LockFreeStack.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 {
35  class PerfLog;
36 }
37 
40 class Workers
41 {
42 public:
44  struct Callback
45  {
46  virtual ~Callback () = default;
47  Callback() = default;
48  Callback(Callback const&) = delete;
49  Callback& operator=(Callback const&) = delete;
50 
61  virtual void processTask (int instance) = 0;
62  };
63 
71  explicit Workers (Callback& callback,
72  perf::PerfLog* perfLog,
73  std::string const& threadNames = "Worker",
74  int numberOfThreads =
75  static_cast<int>(std::thread::hardware_concurrency()));
76 
77  ~Workers ();
78 
87  int getNumberOfThreads () const noexcept;
88 
92  void setNumberOfThreads (int numberOfThreads);
93 
102  void pauseAllThreadsAndWait ();
103 
112  void addTask ();
113 
118  int numberOfCurrentlyRunningTasks () const noexcept;
119 
120  //--------------------------------------------------------------------------
121 
122 private:
123  struct PausedTag
124  {
125  explicit PausedTag() = default;
126  };
127 
128  /* A Worker executes tasks on its provided thread.
129 
130  These are the states:
131 
132  Active: Running the task processing loop.
133  Idle: Active, but blocked on waiting for a task.
134  Paused: Blocked waiting to exit or become active.
135  */
136  class Worker
137  : public beast::LockFreeStack <Worker>::Node
138  , public beast::LockFreeStack <Worker, PausedTag>::Node
139  {
140  public:
141  Worker (Workers& workers,
142  std::string const& threadName,
143  int const instance);
144 
145  ~Worker ();
146 
147  void notify ();
148 
149  private:
150  void run ();
151 
152  private:
155  int const instance_;
156 
160  int wakeCount_; // how many times to un-pause
162  };
163 
164 private:
165  static void deleteWorkers (beast::LockFreeStack <Worker>& stack);
166 
167 private:
170  std::string m_threadNames; // The name to give each thread
171  std::condition_variable m_cv; // signaled when all threads paused
174  semaphore m_semaphore; // each pending task is 1 resource
175  int m_numberOfThreads; // how many we want active now
176  std::atomic <int> m_activeCount; // to know when all are paused
177  std::atomic <int> m_pauseCount; // how many threads need to pause now
178  std::atomic <int> m_runningTaskCount; // how many calls to processTask() active
179  beast::LockFreeStack <Worker> m_everyone; // holds all created workers
181 };
182 
183 } // beast
184 
185 #endif
ripple::Workers::m_cv
std::condition_variable m_cv
Definition: Workers.h:171
ripple::Workers::perfLog_
perf::PerfLog * perfLog_
Definition: Workers.h:169
ripple::Workers::Callback::processTask
virtual void processTask(int instance)=0
Perform a task.
std::string
STL class.
ripple::Workers::deleteWorkers
static void deleteWorkers(beast::LockFreeStack< Worker > &stack)
Definition: Workers.cpp:132
ripple::Workers::m_pauseCount
std::atomic< int > m_pauseCount
Definition: Workers.h:177
ripple::Workers::getNumberOfThreads
int getNumberOfThreads() const noexcept
Retrieve the desired number of threads.
Definition: Workers.cpp:52
ripple::Workers::Worker::instance_
const int instance_
Definition: Workers.h:155
ripple::Workers::Worker::mutex_
std::mutex mutex_
Definition: Workers.h:158
ripple::Workers::m_paused
beast::LockFreeStack< Worker, PausedTag > m_paused
Definition: Workers.h:180
ripple::Workers::m_everyone
beast::LockFreeStack< Worker > m_everyone
Definition: Workers.h:179
ripple::Workers::setNumberOfThreads
void setNumberOfThreads(int numberOfThreads)
Set the desired number of threads.
Definition: Workers.cpp:61
ripple::Workers::Worker::~Worker
~Worker()
Definition: Workers.cpp:163
ripple::perf::PerfLog
Singleton class that maintains performance counters and optionally writes Json-formatted data to a di...
Definition: PerfLog.h:44
ripple::Workers::Worker::Worker
Worker(Workers &workers, std::string const &threadName, int const instance)
Definition: Workers.cpp:152
ripple::Workers::PausedTag
Definition: Workers.h:123
ripple::Workers::Worker::wakeup_
std::condition_variable wakeup_
Definition: Workers.h:159
ripple::Workers::Worker::wakeCount_
int wakeCount_
Definition: Workers.h:160
ripple::Workers::Callback
Called to perform tasks as needed.
Definition: Workers.h:44
ripple::Workers::m_threadNames
std::string m_threadNames
Definition: Workers.h:170
ripple::Workers::m_numberOfThreads
int m_numberOfThreads
Definition: Workers.h:175
ripple::Workers::~Workers
~Workers()
Definition: Workers.cpp:45
ripple::Workers::m_activeCount
std::atomic< int > m_activeCount
Definition: Workers.h:176
ripple::Workers::m_runningTaskCount
std::atomic< int > m_runningTaskCount
Definition: Workers.h:178
thread
ripple::basic_semaphore< std::mutex, std::condition_variable >
ripple::Workers::Worker::m_workers
Workers & m_workers
Definition: Workers.h:153
std::thread::hardware_concurrency
T hardware_concurrency(T... args)
ripple::Workers::Worker::threadName_
const std::string threadName_
Definition: Workers.h:154
ripple::Workers::m_semaphore
semaphore m_semaphore
Definition: Workers.h:174
ripple::Workers::pauseAllThreadsAndWait
void pauseAllThreadsAndWait()
Pause all threads and wait until they are paused.
Definition: Workers.cpp:111
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
A group of threads that process tasks.
Definition: Workers.h:40
ripple::Workers::Worker
Definition: Workers.h:136
ripple::Workers::Worker::notify
void notify()
Definition: Workers.cpp:175
ripple::Workers::Worker::run
void run()
Definition: Workers.cpp:182
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:122
ripple::Workers::Callback::Callback
Callback()=default
ripple::Workers::Callback::~Callback
virtual ~Callback()=default
ripple::Workers::Worker::thread_
std::thread thread_
Definition: Workers.h:157
mutex
ripple::Workers::m_mut
std::mutex m_mut
Definition: Workers.h:172
ripple::Workers::m_callback
Callback & m_callback
Definition: Workers.h:168
ripple::Workers::numberOfCurrentlyRunningTasks
int numberOfCurrentlyRunningTasks() const noexcept
Get the number of currently executing calls of Callback::processTask.
Definition: Workers.cpp:127
ripple::Workers::Worker::shouldExit_
bool shouldExit_
Definition: Workers.h:161
ripple::Workers::m_allPaused
bool m_allPaused
Definition: Workers.h:173
beast::LockFreeStack
Multiple Producer, Multiple Consumer (MPMC) intrusive stack.
Definition: LockFreeStack.h:143
string