1 //////////////////////////////////////////////////////////////////////////////
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)
7 // See http://www.boost.org/libs/interprocess for documentation.
9 //////////////////////////////////////////////////////////////////////////////
11 #include "mutex_test_template.hpp"
12 #include "sharable_mutex_test_template.hpp"
13 #include <boost/interprocess/sync/interprocess_upgradable_mutex.hpp>
14 #include <boost/interprocess/sync/scoped_lock.hpp>
15 #include <boost/interprocess/sync/sharable_lock.hpp>
16 #include <boost/interprocess/sync/upgradable_lock.hpp>
17 #include <boost/date_time/posix_time/posix_time_types.hpp>
22 using namespace boost::interprocess
;
24 test::test_all_lock
<interprocess_upgradable_mutex
>();
25 test::test_all_mutex
<interprocess_upgradable_mutex
>();
26 test::test_all_sharable_mutex
<interprocess_upgradable_mutex
>();
28 //Test lock transition
30 typedef interprocess_upgradable_mutex Mutex
;
34 //Conversions to scoped_lock
36 scoped_lock
<Mutex
> lock(mut
);
37 scoped_lock
<Mutex
> e_lock(boost::move(lock
));
41 scoped_lock
<Mutex
> lock(mut
);
42 scoped_lock
<Mutex
> e_lock(mut2
);
43 e_lock
= boost::move(lock
);
46 upgradable_lock
<Mutex
> u_lock(mut
);
47 //This calls unlock_upgradable_and_lock()
48 scoped_lock
<Mutex
> e_lock(boost::move(u_lock
));
51 upgradable_lock
<Mutex
> u_lock(mut
);
52 //This calls unlock_upgradable_and_lock()
53 scoped_lock
<Mutex
> e_lock(mut2
);
54 scoped_lock
<Mutex
> moved(boost::move(u_lock
));
55 e_lock
= boost::move(moved
);
58 upgradable_lock
<Mutex
> u_lock(mut
);
59 //This calls try_unlock_upgradable_and_lock()
60 scoped_lock
<Mutex
> e_lock(boost::move(u_lock
), try_to_lock
);
63 upgradable_lock
<Mutex
> u_lock(mut
);
64 //This calls try_unlock_upgradable_and_lock()
65 scoped_lock
<Mutex
> e_lock(mut2
);
66 scoped_lock
<Mutex
> moved(boost::move(u_lock
), try_to_lock
);
67 e_lock
= boost::move(moved
);
70 boost::posix_time::ptime t
= test::delay(100);
71 upgradable_lock
<Mutex
> u_lock(mut
);
72 //This calls timed_unlock_upgradable_and_lock()
73 scoped_lock
<Mutex
> e_lock(boost::move(u_lock
), t
);
76 boost::posix_time::ptime t
= test::delay(100);
77 upgradable_lock
<Mutex
> u_lock(mut
);
78 //This calls timed_unlock_upgradable_and_lock()
79 scoped_lock
<Mutex
> e_lock(mut2
);
80 scoped_lock
<Mutex
> moved(boost::move(u_lock
), t
);
81 e_lock
= boost::move(moved
);
84 sharable_lock
<Mutex
> s_lock(mut
);
85 //This calls try_unlock_sharable_and_lock()
86 scoped_lock
<Mutex
> e_lock(boost::move(s_lock
), try_to_lock
);
89 sharable_lock
<Mutex
> s_lock(mut
);
90 //This calls try_unlock_sharable_and_lock()
91 scoped_lock
<Mutex
> e_lock(mut2
);
92 scoped_lock
<Mutex
> moved(boost::move(s_lock
), try_to_lock
);
93 e_lock
= boost::move(moved
);
95 //Conversions to upgradable_lock
97 upgradable_lock
<Mutex
> lock(mut
);
98 upgradable_lock
<Mutex
> u_lock(boost::move(lock
));
102 upgradable_lock
<Mutex
> lock(mut
);
103 upgradable_lock
<Mutex
> u_lock(mut2
);
104 upgradable_lock
<Mutex
> moved(boost::move(lock
));
105 u_lock
= boost::move(moved
);
108 sharable_lock
<Mutex
> s_lock(mut
);
109 //This calls unlock_sharable_and_lock_upgradable()
110 upgradable_lock
<Mutex
> u_lock(boost::move(s_lock
), try_to_lock
);
113 sharable_lock
<Mutex
> s_lock(mut
);
114 //This calls unlock_sharable_and_lock_upgradable()
115 upgradable_lock
<Mutex
> u_lock(mut2
);
116 upgradable_lock
<Mutex
> moved(boost::move(s_lock
), try_to_lock
);
117 u_lock
= boost::move(moved
);
120 scoped_lock
<Mutex
> e_lock(mut
);
121 //This calls unlock_and_lock_upgradable()
122 upgradable_lock
<Mutex
> u_lock(boost::move(e_lock
));
125 scoped_lock
<Mutex
> e_lock(mut
);
126 //This calls unlock_and_lock_upgradable()
127 upgradable_lock
<Mutex
> u_lock(mut2
);
128 upgradable_lock
<Mutex
> moved(boost::move(e_lock
));
129 u_lock
= boost::move(moved
);
131 //Conversions to sharable_lock
133 sharable_lock
<Mutex
> lock(mut
);
134 sharable_lock
<Mutex
> s_lock(boost::move(lock
));
138 sharable_lock
<Mutex
> lock(mut
);
139 sharable_lock
<Mutex
> s_lock(mut2
);
140 sharable_lock
<Mutex
> moved(boost::move(lock
));
141 s_lock
= boost::move(moved
);
144 upgradable_lock
<Mutex
> u_lock(mut
);
145 //This calls unlock_upgradable_and_lock_sharable()
146 sharable_lock
<Mutex
> s_lock(boost::move(u_lock
));
149 upgradable_lock
<Mutex
> u_lock(mut
);
150 //This calls unlock_upgradable_and_lock_sharable()
151 sharable_lock
<Mutex
> s_lock(mut2
);
152 sharable_lock
<Mutex
> moved(boost::move(u_lock
));
153 s_lock
= boost::move(moved
);
156 scoped_lock
<Mutex
> e_lock(mut
);
157 //This calls unlock_and_lock_sharable()
158 sharable_lock
<Mutex
> s_lock(boost::move(e_lock
));
161 scoped_lock
<Mutex
> e_lock(mut
);
162 //This calls unlock_and_lock_sharable()
163 sharable_lock
<Mutex
> s_lock(mut2
);
164 sharable_lock
<Mutex
> moved(boost::move(e_lock
));
165 s_lock
= boost::move(moved
);