Kea 2.7.6
multi_threading_mgr.h
Go to the documentation of this file.
1// Copyright (C) 2019-2024 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef MULTI_THREADING_MGR_H
8#define MULTI_THREADING_MGR_H
9
10#include <util/thread_pool.h>
11#include <functional>
12#include <list>
13
14#include <boost/noncopyable.hpp>
15
16#include <stdint.h>
17
18namespace isc {
19namespace util {
20
21
38 typedef std::function<void()> Callback;
39
47 CSCallbackSet(const std::string& name, const Callback& check_cb,
48 const Callback& entry_cb, const Callback& exit_cb)
49 : name_(name), check_cb_(check_cb), entry_cb_(entry_cb),
50 exit_cb_(exit_cb) {}
51
53 std::string name_;
54
57
60
63};
64
72public:
75
85 void addCallbackSet(const std::string& name,
86 const CSCallbackSet::Callback& check_cb,
87 const CSCallbackSet::Callback& entry_cb,
88 const CSCallbackSet::Callback& exit_cb);
89
94 void removeCallbackSet(const std::string& name);
95
97 void removeAll();
98
100 const std::list<CSCallbackSet>& getCallbackSets();
101
102private:
104 std::list<CSCallbackSet> cb_sets_;
105};
106
136class MultiThreadingMgr : public boost::noncopyable {
137public:
144 static MultiThreadingMgr& instance();
145
150 bool getMode() const;
151
155 void setMode(bool enabled);
156
161 void setTestMode(const bool test_mode) {
162 test_mode_ = test_mode;
163 }
164
169 bool isTestMode() const {
170 return (test_mode_);
171 }
172
186
199 void exitCriticalSection();
200
204 bool isInCriticalSection();
205
209 ThreadPool<std::function<void()>>& getThreadPool();
210
214 uint32_t getThreadPoolSize() const;
215
219 void setThreadPoolSize(uint32_t size);
220
224 uint32_t getPacketQueueSize();
225
229 void setPacketQueueSize(uint32_t size);
230
236 static uint32_t detectThreadCount();
237
250 void apply(bool enabled, uint32_t thread_count, uint32_t queue_size);
251
264 void addCriticalSectionCallbacks(const std::string& name,
265 const CSCallbackSet::Callback& check_cb,
266 const CSCallbackSet::Callback& entry_cb,
267 const CSCallbackSet::Callback& exit_cb);
268
276 void removeCriticalSectionCallbacks(const std::string& name);
277
280
281protected:
282
285
287 virtual ~MultiThreadingMgr();
288
289private:
290
303 void checkCallbacksPermissions();
304
311 void callEntryCallbacks();
312
319 void callExitCallbacks();
320
325 bool enabled_;
326
328 bool test_mode_;
329
336 uint32_t critical_section_count_;
337
339 uint32_t thread_pool_size_;
340
342 ThreadPool<std::function<void()>> thread_pool_;
343
345 CSCallbackSetList cs_callbacks_;
346};
347
355 MultiThreadingLock(std::mutex& mutex);
356
357private:
359 std::unique_lock<std::mutex> lock_;
360};
361
364
374class MultiThreadingCriticalSection : public boost::noncopyable {
375public:
376
382
388};
389
390} // namespace util
391} // namespace isc
392
393#endif // MULTI_THREADING_MGR_H
Maintains list of unique CSCallbackSets.
void removeCallbackSet(const std::string &name)
Removes a callback set from the list.
const std::list< CSCallbackSet > & getCallbackSets()
Fetches the list of callback sets.
void removeAll()
Removes all callbacks from the list.
void addCallbackSet(const std::string &name, const CSCallbackSet::Callback &check_cb, const CSCallbackSet::Callback &entry_cb, const CSCallbackSet::Callback &exit_cb)
Adds a callback set to the list.
RAII class creating a critical section.
void removeAllCriticalSectionCallbacks()
Removes all callbacks in the list of CriticalSection callbacks.
void setMode(bool enabled)
Set the multi-threading mode.
virtual ~MultiThreadingMgr()
Destructor.
bool isTestMode() const
Checks if the MultiThreadingMgr is in the test mode.
static MultiThreadingMgr & instance()
Returns a single instance of Multi Threading Manager.
void enterCriticalSection()
Enter critical section.
void setThreadPoolSize(uint32_t size)
Set the configured dhcp thread pool size.
uint32_t getPacketQueueSize()
Get the configured dhcp packet queue size.
void removeCriticalSectionCallbacks(const std::string &name)
Removes the set of callbacks associated with a given name from the list of CriticalSection callbacks.
void setPacketQueueSize(uint32_t size)
Set the configured dhcp packet queue size.
uint32_t getThreadPoolSize() const
Get the configured dhcp thread pool size.
ThreadPool< std::function< void()> > & getThreadPool()
Get the dhcp thread pool.
bool isInCriticalSection()
Is in critical section flag.
void setTestMode(const bool test_mode)
Sets or clears the test mode for MultiThreadingMgr.
static uint32_t detectThreadCount()
The system current detected hardware concurrency thread count.
void apply(bool enabled, uint32_t thread_count, uint32_t queue_size)
Apply the multi-threading related settings.
bool getMode() const
Get the multi-threading mode.
void addCriticalSectionCallbacks(const std::string &name, const CSCallbackSet::Callback &check_cb, const CSCallbackSet::Callback &entry_cb, const CSCallbackSet::Callback &exit_cb)
Adds a set of callbacks to the list of CriticalSection callbacks.
void exitCriticalSection()
Exit critical section.
Defines the logger used by the top-level component of kea-lfc.
Embodies a named set of CriticalSection callbacks.
std::function< void()> Callback
Defines a callback as a simple void() functor.
Callback check_cb_
Check permissions callback associated with name.
CSCallbackSet(const std::string &name, const Callback &check_cb, const Callback &entry_cb, const Callback &exit_cb)
Constructor.
Callback entry_cb_
Entry point callback associated with name.
std::string name_
Name by which the callback can be found.
Callback exit_cb_
Exit point callback associated with name.
RAII lock object to protect the code in the same scope with a mutex.
MultiThreadingLock(std::mutex &mutex)
Constructor locks the mutex if multi-threading is enabled.
Defines a thread pool which uses a thread pool queue for managing work items.
Definition thread_pool.h:34