1//////////////////////////////////////////////////////////////////////////////
2//
3// (C) Copyright Ion Gaztanaga 2004-2012. Distributed under the Boost
4// Software License, Version 1.0. (See accompanying file
5// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6//
7// See http://www.boost.org/libs/interprocess for documentation.
8//
9//////////////////////////////////////////////////////////////////////////////
10
11#ifndef BOOST_INTERPROCESS_TEST_NAMED_RESOURCE_TEMPLATE_HEADER
12#define BOOST_INTERPROCESS_TEST_NAMED_RESOURCE_TEMPLATE_HEADER
13
14#include <boost/interprocess/detail/config_begin.hpp>
15#include <boost/interprocess/exceptions.hpp>
16#include "boost_interprocess_check.hpp"
17#include "get_process_id_name.hpp"
18#include <iostream>
19#include <typeinfo>
20#include <boost/interprocess/creation_tags.hpp>
21
22namespace boost { namespace interprocess { namespace test {
23
24template <class NamedResource>
25inline void create_then_open_then_open_or_create()
26{
27 BOOST_TRY{
28 //Create it and open it twice
29 NamedResource nresource1(create_only);
30 NamedResource nresource2(open_only);
31 NamedResource nresource3(open_or_create);
32 }
33 BOOST_CATCH(...){
34 //This shouldn't throw so show the error
35 BOOST_INTERPROCESS_CHECK( false );
36 } BOOST_CATCH_END
37}
38
39template <class NamedResource>
40inline void open_or_create_then_create()
41{
42 //Create it with open_or_create and try to create it twice
43 NamedResource nresource1(open_or_create);
44 BOOST_TRY{
45 NamedResource nresource2(create_only);
46 }
47 BOOST_CATCH(interprocess_exception &err){
48 BOOST_INTERPROCESS_CHECK(err.get_error_code() == already_exists_error);
49 } BOOST_CATCH_END
50}
51
52template <class NamedResource>
53inline void dont_create_and_open()
54{
55 //Try to open it without creating
56 BOOST_TRY{
57 NamedResource nresource1(open_only);
58 }
59 BOOST_CATCH(interprocess_exception &err){
60 BOOST_INTERPROCESS_CHECK(err.get_error_code() == not_found_error);
61 return;
62 } BOOST_CATCH_END
63 //The mutex should not exist
64 BOOST_INTERPROCESS_CHECK(false);
65}
66
67template <class NamedResource>
68inline void test_named_creation()
69{
70 std::cout << "create_then_open_then_open_or_create<"
71 << typeid(NamedResource).name() << ">" << std::endl;
72 create_then_open_then_open_or_create<NamedResource>();
73 std::cout << "open_or_create_then_create<"
74 << typeid(NamedResource).name() << ">" << std::endl;
75 open_or_create_then_create<NamedResource>();
76 std::cout << "dont_create_and_open<"
77 << typeid(NamedResource).name() << ">" << std::endl;
78 dont_create_and_open<NamedResource>();
79}
80
81template<class NamedSync>
82class named_sync_wrapper
83 : public NamedSync
84{
85 public:
86 named_sync_wrapper()
87 : NamedSync(open_or_create, test::get_process_id_ptr_name(this))
88 {}
89
90 ~named_sync_wrapper()
91 {
92 NamedSync::remove(test::get_process_id_ptr_name(this));
93 }
94};
95
96template<class NamedSync>
97struct named_sync_deleter
98{
99 ~named_sync_deleter()
100 { NamedSync::remove(test::get_process_id_name()); }
101};
102
103#if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES)
104
105template<class NamedSync>
106struct named_sync_deleter_w
107{
108 ~named_sync_deleter_w()
109 { NamedSync::remove(test::get_process_id_wname()); }
110};
111
112#endif //#if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES)
113
114
115//This wrapper is necessary to have a common constructor
116//in generic named_creation_template functions
117template<class NamedSync>
118class named_sync_creation_test_wrapper
119 : public test::named_sync_deleter<NamedSync>, public NamedSync
120{
121 public:
122 named_sync_creation_test_wrapper(create_only_t)
123 : NamedSync(create_only, test::get_process_id_name())
124 {}
125
126 named_sync_creation_test_wrapper(open_only_t)
127 : NamedSync(open_only, test::get_process_id_name())
128 {}
129
130 named_sync_creation_test_wrapper(open_or_create_t)
131 : NamedSync(open_or_create, test::get_process_id_name())
132 {}
133
134 ~named_sync_creation_test_wrapper()
135 {}
136};
137
138#if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES)
139
140//This wrapper is necessary to have a common constructor
141//in generic named_creation_template functions
142template<class NamedSync>
143class named_sync_creation_test_wrapper_w
144 : public test::named_sync_deleter_w<NamedSync>, public NamedSync
145{
146 public:
147 named_sync_creation_test_wrapper_w(create_only_t)
148 : NamedSync(create_only, test::get_process_id_wname())
149 {}
150
151 named_sync_creation_test_wrapper_w(open_only_t)
152 : NamedSync(open_only, test::get_process_id_wname())
153 {}
154
155 named_sync_creation_test_wrapper_w(open_or_create_t)
156 : NamedSync(open_or_create, test::get_process_id_wname())
157 {}
158
159 ~named_sync_creation_test_wrapper_w()
160 {}
161};
162
163#endif //#if defined(BOOST_INTERPROCESS_WCHAR_NAMED_RESOURCES)
164
165}}} //namespace boost { namespace interprocess { namespace test {
166
167#include <boost/interprocess/detail/config_end.hpp>
168
169#endif //BOOST_INTERPROCESS_TEST_NAMED_RESOURCE_TEMPLATE_HEADER
170

source code of boost/libs/interprocess/test/named_creation_template.hpp