////////////////////////////////////////////////////////////////////////////// // // (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