diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/thread/test/test_11611.cpp | |
parent | Initial commit. (diff) | |
download | ceph-upstream.tar.xz ceph-upstream.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/thread/test/test_11611.cpp')
-rw-r--r-- | src/boost/libs/thread/test/test_11611.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/boost/libs/thread/test/test_11611.cpp b/src/boost/libs/thread/test/test_11611.cpp new file mode 100644 index 00000000..0a38b4b2 --- /dev/null +++ b/src/boost/libs/thread/test/test_11611.cpp @@ -0,0 +1,66 @@ +// Copyright (C) 2014 Vicente Botet +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#define BOOST_THREAD_VERSION 4 + +#include <iostream> + +#define BOOST_THREAD_PROVIDES_FUTURE +#define BOOST_THREAD_PROVIDES_EXECUTORS +#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION + +#if __cplusplus >= 201103L +#include <boost/thread/executors/loop_executor.hpp> +#include <boost/thread/executors/serial_executor.hpp> +#endif +#include <boost/thread/thread.hpp> +#include <boost/atomic.hpp> + +using namespace std; + +int main() +{ +#if __cplusplus >= 201103L + static std::size_t const nWorks = 100000; + boost::atomic<unsigned> execCount(0u); + boost::loop_executor ex; + + boost::thread t([&ex]() + { + ex.loop(); + }); + + { + boost::serial_executor serial(ex); + + for (size_t i = 0; i < nWorks; i++) + serial.submit([i, &execCount] { + //std::cout << i << "."; + ++execCount; + }); + + serial.close(); + } + unsigned const cnt = execCount.load(); + if (cnt != nWorks) { + // Since the serial_executor is closed, all work should have been done, + // even though the loop_executor ex is not. + std::cerr << "Only " << cnt << " of " << nWorks << " works executed!\n"; + return 1; + } + + if (ex.try_executing_one()) { + std::cerr + << "loop_executor::try_executing_one suceeded on closed executor!\n"; + return 1; + } + + ex.close(); + + t.join(); + std::cout << "end\n" << std::endl; +#endif + return 0; +} |