Chris@16
|
1 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 //
|
Chris@16
|
3 // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
|
Chris@16
|
4 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 //
|
Chris@16
|
7 // See http://www.boost.org/libs/interprocess for documentation.
|
Chris@16
|
8 //
|
Chris@16
|
9 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_INTERPROCESS_POSIX_NAMED_CONDITION_HPP
|
Chris@16
|
12 #define BOOST_INTERPROCESS_POSIX_NAMED_CONDITION_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #if (defined _MSC_VER) && (_MSC_VER >= 1200)
|
Chris@16
|
15 # pragma once
|
Chris@16
|
16 #endif
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/interprocess/detail/config_begin.hpp>
|
Chris@16
|
19 #include <boost/interprocess/detail/workaround.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 #include <boost/interprocess/sync/posix/semaphore_wrapper.hpp>
|
Chris@16
|
22
|
Chris@16
|
23 namespace boost {
|
Chris@16
|
24 namespace interprocess {
|
Chris@16
|
25
|
Chris@16
|
26 /// @cond
|
Chris@16
|
27 namespace ipcdetail{ class interprocess_tester; }
|
Chris@16
|
28 /// @endcond
|
Chris@16
|
29
|
Chris@16
|
30 namespace ipcdetail {
|
Chris@16
|
31
|
Chris@16
|
32 class posix_named_semaphore
|
Chris@16
|
33 {
|
Chris@16
|
34 posix_named_semaphore();
|
Chris@16
|
35 posix_named_semaphore(const posix_named_semaphore&);
|
Chris@16
|
36 posix_named_semaphore &operator= (const posix_named_semaphore &);
|
Chris@16
|
37
|
Chris@16
|
38 public:
|
Chris@16
|
39 posix_named_semaphore
|
Chris@16
|
40 (create_only_t, const char *name, unsigned int initialCount, const permissions &perm = permissions())
|
Chris@16
|
41 { semaphore_open(mp_sem, DoCreate, name, initialCount, perm); }
|
Chris@16
|
42
|
Chris@16
|
43 posix_named_semaphore(open_or_create_t, const char *name, unsigned int initialCount, const permissions &perm = permissions())
|
Chris@16
|
44 { semaphore_open(mp_sem, DoOpenOrCreate, name, initialCount, perm); }
|
Chris@16
|
45
|
Chris@16
|
46 posix_named_semaphore(open_only_t, const char *name)
|
Chris@16
|
47 { semaphore_open(mp_sem, DoOpen, name); }
|
Chris@16
|
48
|
Chris@16
|
49 ~posix_named_semaphore()
|
Chris@16
|
50 {
|
Chris@16
|
51 if(mp_sem != BOOST_INTERPROCESS_POSIX_SEM_FAILED)
|
Chris@16
|
52 semaphore_close(mp_sem);
|
Chris@16
|
53 }
|
Chris@16
|
54
|
Chris@16
|
55 void post()
|
Chris@16
|
56 { semaphore_post(mp_sem); }
|
Chris@16
|
57
|
Chris@16
|
58 void wait()
|
Chris@16
|
59 { semaphore_wait(mp_sem); }
|
Chris@16
|
60
|
Chris@16
|
61 bool try_wait()
|
Chris@16
|
62 { return semaphore_try_wait(mp_sem); }
|
Chris@16
|
63
|
Chris@16
|
64 bool timed_wait(const boost::posix_time::ptime &abs_time)
|
Chris@16
|
65 { return semaphore_timed_wait(mp_sem, abs_time); }
|
Chris@16
|
66
|
Chris@16
|
67 static bool remove(const char *name)
|
Chris@16
|
68 { return semaphore_unlink(name); }
|
Chris@16
|
69
|
Chris@16
|
70 private:
|
Chris@16
|
71 friend class ipcdetail::interprocess_tester;
|
Chris@16
|
72 void dont_close_on_destruction()
|
Chris@16
|
73 { mp_sem = BOOST_INTERPROCESS_POSIX_SEM_FAILED; }
|
Chris@16
|
74
|
Chris@16
|
75 sem_t *mp_sem;
|
Chris@16
|
76 };
|
Chris@16
|
77
|
Chris@16
|
78 } //namespace ipcdetail {
|
Chris@16
|
79 } //namespace interprocess {
|
Chris@16
|
80 } //namespace boost {
|
Chris@16
|
81
|
Chris@16
|
82 #include <boost/interprocess/detail/config_end.hpp>
|
Chris@16
|
83
|
Chris@16
|
84 #endif //#ifndef BOOST_INTERPROCESS_POSIX_NAMED_CONDITION_HPP
|