From e2c1bd3d713ffe0b8eede711e84f64e0fe4ae836 Mon Sep 17 00:00:00 2001 From: TheCharlatan Date: Sun, 17 Nov 2024 17:36:48 +0100 Subject: [PATCH] kernel: Add chainstate manager option for setting worker threads Re-use the same pattern used for the context options. This allows users to set the number of threads used in the validation thread pool. --- src/kernel/bitcoinkernel.cpp | 6 ++++++ src/kernel/bitcoinkernel.h | 12 ++++++++++++ src/kernel/bitcoinkernel_wrapper.h | 5 +++++ src/test/kernel/test_kernel.cpp | 1 + 4 files changed, 24 insertions(+) diff --git a/src/kernel/bitcoinkernel.cpp b/src/kernel/bitcoinkernel.cpp index 445ccca94df..be0f9808b89 100644 --- a/src/kernel/bitcoinkernel.cpp +++ b/src/kernel/bitcoinkernel.cpp @@ -689,6 +689,12 @@ btck_ChainstateManagerOptions* btck_chainstate_manager_options_create(const btck } } +void btck_chainstate_manager_options_set_worker_threads_num(btck_ChainstateManagerOptions* opts, int worker_threads) +{ + LOCK(btck_ChainstateManagerOptions::get(opts).m_mutex); + btck_ChainstateManagerOptions::get(opts).m_chainman_options.worker_threads_num = worker_threads; +} + void btck_chainstate_manager_options_destroy(btck_ChainstateManagerOptions* options) { delete options; diff --git a/src/kernel/bitcoinkernel.h b/src/kernel/bitcoinkernel.h index 59094aefd61..63cad6ad4a5 100644 --- a/src/kernel/bitcoinkernel.h +++ b/src/kernel/bitcoinkernel.h @@ -729,6 +729,18 @@ BITCOINKERNEL_API btck_ChainstateManagerOptions* BITCOINKERNEL_WARN_UNUSED_RESUL const char* blocks_directory, size_t blocks_directory_len) BITCOINKERNEL_ARG_NONNULL(1, 2); +/** + * @brief Set the number of available worker threads used during validation. + * + * @param[in] chainstate_manager_options Non-null, options to be set. + * @param[in] worker_threads The number of worker threads that should be spawned in the thread pool + * used for validation. When set to 0 no parallel verification is done. + * The value range is clamped internally between 0 and 15. + */ +BITCOINKERNEL_API void btck_chainstate_manager_options_set_worker_threads_num( + btck_ChainstateManagerOptions* chainstate_manager_options, + int worker_threads) BITCOINKERNEL_ARG_NONNULL(1); + /** * Destroy the chainstate manager options. */ diff --git a/src/kernel/bitcoinkernel_wrapper.h b/src/kernel/bitcoinkernel_wrapper.h index 7d5c3063c9c..bdd71916a16 100644 --- a/src/kernel/bitcoinkernel_wrapper.h +++ b/src/kernel/bitcoinkernel_wrapper.h @@ -628,6 +628,11 @@ public: : UniqueHandle{btck_chainstate_manager_options_create(context.get(), data_dir.c_str(), data_dir.length(), blocks_dir.c_str(), blocks_dir.length())} { } + + void SetWorkerThreads(int worker_threads) + { + btck_chainstate_manager_options_set_worker_threads_num(get(), worker_threads); + } }; class ChainMan : UniqueHandle diff --git a/src/test/kernel/test_kernel.cpp b/src/test/kernel/test_kernel.cpp index bc00e85c2da..4b2dc5dc201 100644 --- a/src/test/kernel/test_kernel.cpp +++ b/src/test/kernel/test_kernel.cpp @@ -502,5 +502,6 @@ BOOST_AUTO_TEST_CASE(btck_chainman_tests) auto context{create_context(notifications, ChainType::MAINNET)}; ChainstateManagerOptions chainman_opts{context, test_directory.m_directory.string(), (test_directory.m_directory / "blocks").string()}; + chainman_opts.SetWorkerThreads(4); ChainMan chainman{context, chainman_opts}; }