/src/botan/build/include/botan/internal/thread_pool.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * (C) 2019 Jack Lloyd |
3 | | * |
4 | | * Botan is released under the Simplified BSD License (see license.txt) |
5 | | */ |
6 | | |
7 | | #ifndef BOTAN_THREAD_POOL_H_ |
8 | | #define BOTAN_THREAD_POOL_H_ |
9 | | |
10 | | #include <botan/types.h> |
11 | | #include <functional> |
12 | | #include <deque> |
13 | | #include <vector> |
14 | | #include <memory> |
15 | | #include <utility> |
16 | | #include <type_traits> |
17 | | #include <mutex> |
18 | | #include <thread> |
19 | | #include <future> |
20 | | #include <condition_variable> |
21 | | |
22 | | namespace Botan { |
23 | | |
24 | | class BOTAN_TEST_API Thread_Pool |
25 | | { |
26 | | public: |
27 | | /** |
28 | | * Return an instance to a shared thread pool |
29 | | */ |
30 | | static Thread_Pool& global_instance(); |
31 | | |
32 | | /** |
33 | | * Initialize a thread pool with some number of threads |
34 | | * @param pool_size number of threads in the pool, if 0 |
35 | | * then some default value is chosen |
36 | | */ |
37 | | Thread_Pool(size_t pool_size = 0); |
38 | | |
39 | 0 | ~Thread_Pool() { shutdown(); } |
40 | | |
41 | | void shutdown(); |
42 | | |
43 | 0 | size_t worker_count() const { return m_workers.size(); } |
44 | | |
45 | | Thread_Pool(const Thread_Pool&) = delete; |
46 | | Thread_Pool& operator=(const Thread_Pool&) = delete; |
47 | | |
48 | | Thread_Pool(Thread_Pool&&) = delete; |
49 | | Thread_Pool& operator=(Thread_Pool&&) = delete; |
50 | | |
51 | | /* |
52 | | * Enqueue some work |
53 | | */ |
54 | | void queue_thunk(std::function<void ()>); |
55 | | |
56 | | template<class F, class... Args> |
57 | | auto run(F&& f, Args&&... args) -> std::future<typename std::invoke_result<F, Args...>::type> |
58 | 0 | { |
59 | 0 | typedef typename std::invoke_result<F, Args...>::type return_type; |
60 | |
|
61 | 0 | auto future_work = std::bind(std::forward<F>(f), std::forward<Args>(args)...); |
62 | 0 | auto task = std::make_shared<std::packaged_task<return_type ()>>(future_work); |
63 | 0 | auto future_result = task->get_future(); |
64 | 0 | queue_thunk([task]() { (*task)(); }); Unexecuted instantiation: rsa.cpp:std::__1::future<Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}::invoke_result<Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}>::type> Botan::Thread_Pool::run<Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}>(Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}::invoke_result&&, (Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}&&)...)::{lambda()#1}::operator()() const Unexecuted instantiation: std::__1::future<std::__1::invoke_result<void (Botan::XMSS_PrivateKey::*&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned long, unsigned long, Botan::XMSS_Address&, Botan::XMSS_Hash&), Botan::XMSS_PrivateKey*, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, unsigned long, unsigned long, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<Botan::XMSS_Hash> >::type> Botan::Thread_Pool::run<void (Botan::XMSS_PrivateKey::*&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned long, unsigned long, Botan::XMSS_Address&, Botan::XMSS_Hash&), Botan::XMSS_PrivateKey*, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, unsigned long, unsigned long, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<Botan::XMSS_Hash> >(void (Botan::XMSS_PrivateKey::*&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned long, unsigned long, Botan::XMSS_Address&, Botan::XMSS_Hash&), Botan::XMSS_PrivateKey*&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >&&, unsigned long&&, unsigned long&&, std::__1::reference_wrapper<Botan::XMSS_Address>&&, std::__1::reference_wrapper<Botan::XMSS_Hash>&&)::{lambda()#1}::operator()() const Unexecuted instantiation: std::__1::future<std::__1::invoke_result<void (*)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Address&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Hash&, Botan::XMSS_Parameters const&), std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Hash>, std::__1::reference_wrapper<Botan::XMSS_Parameters const> >::type> Botan::Thread_Pool::run<void (*)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Address&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Hash&, Botan::XMSS_Parameters const&), std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Hash>, std::__1::reference_wrapper<Botan::XMSS_Parameters const> >(void (*&&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Address&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Hash&, Botan::XMSS_Parameters const&), std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>&&, std::__1::reference_wrapper<Botan::XMSS_Address>&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>&&, std::__1::reference_wrapper<Botan::XMSS_Hash>&&, std::__1::reference_wrapper<Botan::XMSS_Parameters const>&&)::{lambda()#1}::operator()() const |
65 | 0 | return future_result; |
66 | 0 | } Unexecuted instantiation: rsa.cpp:std::__1::future<Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}::invoke_result<Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}>::type> Botan::Thread_Pool::run<Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}>(Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}::invoke_result&&, (Botan::(anonymous namespace)::RSA_Private_Operation::rsa_private_op(Botan::BigInt const&) const::{lambda()#1}&&)...) Unexecuted instantiation: std::__1::future<std::__1::invoke_result<void (Botan::XMSS_PrivateKey::*&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned long, unsigned long, Botan::XMSS_Address&, Botan::XMSS_Hash&), Botan::XMSS_PrivateKey*, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, unsigned long, unsigned long, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<Botan::XMSS_Hash> >::type> Botan::Thread_Pool::run<void (Botan::XMSS_PrivateKey::*&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned long, unsigned long, Botan::XMSS_Address&, Botan::XMSS_Hash&), Botan::XMSS_PrivateKey*, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, unsigned long, unsigned long, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<Botan::XMSS_Hash> >(void (Botan::XMSS_PrivateKey::*&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned long, unsigned long, Botan::XMSS_Address&, Botan::XMSS_Hash&), Botan::XMSS_PrivateKey*&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >&&, unsigned long&&, unsigned long&&, std::__1::reference_wrapper<Botan::XMSS_Address>&&, std::__1::reference_wrapper<Botan::XMSS_Hash>&&) Unexecuted instantiation: std::__1::future<std::__1::invoke_result<void (*)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Address&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Hash&, Botan::XMSS_Parameters const&), std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Hash>, std::__1::reference_wrapper<Botan::XMSS_Parameters const> >::type> Botan::Thread_Pool::run<void (*)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Address&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Hash&, Botan::XMSS_Parameters const&), std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Address>, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>, std::__1::reference_wrapper<Botan::XMSS_Hash>, std::__1::reference_wrapper<Botan::XMSS_Parameters const> >(void (*&&)(std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Address&, std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const&, Botan::XMSS_Hash&, Botan::XMSS_Parameters const&), std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > >&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>&&, std::__1::reference_wrapper<Botan::XMSS_Address>&&, std::__1::reference_wrapper<std::__1::vector<unsigned char, Botan::secure_allocator<unsigned char> > const>&&, std::__1::reference_wrapper<Botan::XMSS_Hash>&&, std::__1::reference_wrapper<Botan::XMSS_Parameters const>&&) |
67 | | |
68 | | private: |
69 | | void worker_thread(); |
70 | | |
71 | | // Only touched in constructor and destructor |
72 | | std::vector<std::thread> m_workers; |
73 | | |
74 | | std::mutex m_mutex; |
75 | | std::condition_variable m_more_tasks; |
76 | | std::deque<std::function<void ()>> m_tasks; |
77 | | bool m_shutdown; |
78 | | }; |
79 | | |
80 | | } |
81 | | |
82 | | #endif |