From 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 27 Apr 2024 20:24:20 +0200 Subject: Adding upstream version 14.2.21. Signed-off-by: Daniel Baumann --- .../interprocess/test/named_condition_test.cpp | 189 +++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 src/boost/libs/interprocess/test/named_condition_test.cpp (limited to 'src/boost/libs/interprocess/test/named_condition_test.cpp') diff --git a/src/boost/libs/interprocess/test/named_condition_test.cpp b/src/boost/libs/interprocess/test/named_condition_test.cpp new file mode 100644 index 00000000..6aa9c781 --- /dev/null +++ b/src/boost/libs/interprocess/test/named_condition_test.cpp @@ -0,0 +1,189 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2004-2012. 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) +// +// See http://www.boost.org/libs/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include "condition_test_template.hpp" +#include "named_creation_template.hpp" +#include +#include +#include "get_process_id_name.hpp" + +using namespace boost::interprocess; + +struct condition_deleter +{ + std::string name; + + ~condition_deleter() + { + if(name.empty()) + named_condition::remove(test::add_to_process_id_name("named_condition")); + else + named_condition::remove(name.c_str()); + } +}; + +inline std::string num_to_string(int n) +{ std::stringstream s; s << n; return s.str(); } + +//This wrapper is necessary to have a default constructor +//in generic mutex_test_template functions +class named_condition_test_wrapper + : public condition_deleter, public named_condition +{ + public: + + named_condition_test_wrapper() + : named_condition(open_or_create, + (test::add_to_process_id_name("test_cond") + num_to_string(count)).c_str()) + { + condition_deleter::name += test::add_to_process_id_name("test_cond"); + condition_deleter::name += num_to_string(count); + ++count; + } + + ~named_condition_test_wrapper() + { --count; } + + + template + void wait(L& lock) + { + ipcdetail::internal_mutex_lock internal_lock(lock); + named_condition::wait(internal_lock); + } + + template + void wait(L& lock, Pr pred) + { + ipcdetail::internal_mutex_lock internal_lock(lock); + named_condition::wait(internal_lock, pred); + } + + template + bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time) + { + ipcdetail::internal_mutex_lock internal_lock(lock); + return named_condition::timed_wait(internal_lock, abs_time); + } + + template + bool timed_wait(L& lock, const boost::posix_time::ptime &abs_time, Pr pred) + { + ipcdetail::internal_mutex_lock internal_lock(lock); + return named_condition::timed_wait(internal_lock, abs_time, pred); + } + + static int count; +}; + +int named_condition_test_wrapper::count = 0; + +//This wrapper is necessary to have a common constructor +//in generic named_creation_template functions +class named_condition_creation_test_wrapper + : public condition_deleter, public named_condition +{ + public: + named_condition_creation_test_wrapper(create_only_t) + : named_condition(create_only, test::add_to_process_id_name("named_condition")) + { ++count_; } + + named_condition_creation_test_wrapper(open_only_t) + : named_condition(open_only, test::add_to_process_id_name("named_condition")) + { ++count_; } + + named_condition_creation_test_wrapper(open_or_create_t) + : named_condition(open_or_create, test::add_to_process_id_name("named_condition")) + { ++count_; } + + ~named_condition_creation_test_wrapper() { + if(--count_){ + ipcdetail::interprocess_tester:: + dont_close_on_destruction(static_cast(*this)); + } + } + static int count_; +}; + +int named_condition_creation_test_wrapper::count_ = 0; + +struct mutex_deleter +{ + std::string name; + + ~mutex_deleter() + { + if(name.empty()) + named_mutex::remove(test::add_to_process_id_name("named_mutex")); + else + named_mutex::remove(name.c_str()); + } +}; + +//This wrapper is necessary to have a default constructor +//in generic mutex_test_template functions +class named_mutex_test_wrapper + : public mutex_deleter, public named_mutex +{ + public: + named_mutex_test_wrapper() + : named_mutex(open_or_create, + (test::add_to_process_id_name("test_mutex") + num_to_string(count)).c_str()) + { + mutex_deleter::name += test::add_to_process_id_name("test_mutex"); + mutex_deleter::name += num_to_string(count); + ++count; + } + + typedef named_mutex internal_mutex_type; + + internal_mutex_type &internal_mutex() + { return *this; } + + ~named_mutex_test_wrapper() + { --count; } + + static int count; +}; + +int named_mutex_test_wrapper::count = 0; + +int main () +{ + try{ + //Remove previous mutexes and conditions + named_mutex::remove(test::add_to_process_id_name("test_mutex0")); + named_condition::remove(test::add_to_process_id_name("test_cond0")); + named_condition::remove(test::add_to_process_id_name("test_cond1")); + named_condition::remove(test::add_to_process_id_name("named_condition")); + named_mutex::remove(test::add_to_process_id_name("named_mutex")); + + test::test_named_creation(); + test::do_test_condition(); + } + catch(std::exception &ex){ + std::cout << ex.what() << std::endl; + return 1; + } + named_mutex::remove(test::add_to_process_id_name("test_mutex0")); + named_condition::remove(test::add_to_process_id_name("test_cond0")); + named_condition::remove(test::add_to_process_id_name("test_cond1")); + named_condition::remove(test::add_to_process_id_name("named_condition")); + named_mutex::remove(test::add_to_process_id_name("named_mutex")); + return 0; +} + +#include -- cgit v1.2.3