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@101
|
14 #ifndef BOOST_CONFIG_HPP
|
Chris@101
|
15 # include <boost/config.hpp>
|
Chris@101
|
16 #endif
|
Chris@101
|
17 #
|
Chris@101
|
18 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@16
|
19 # pragma once
|
Chris@16
|
20 #endif
|
Chris@16
|
21
|
Chris@16
|
22 #include <boost/interprocess/detail/config_begin.hpp>
|
Chris@16
|
23 #include <boost/interprocess/detail/workaround.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 #include <boost/interprocess/sync/posix/semaphore_wrapper.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 namespace boost {
|
Chris@16
|
28 namespace interprocess {
|
Chris@16
|
29
|
Chris@101
|
30 #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
|
Chris@16
|
31 namespace ipcdetail{ class interprocess_tester; }
|
Chris@101
|
32 #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
|
Chris@16
|
33
|
Chris@16
|
34 namespace ipcdetail {
|
Chris@16
|
35
|
Chris@16
|
36 class posix_named_semaphore
|
Chris@16
|
37 {
|
Chris@16
|
38 posix_named_semaphore();
|
Chris@16
|
39 posix_named_semaphore(const posix_named_semaphore&);
|
Chris@16
|
40 posix_named_semaphore &operator= (const posix_named_semaphore &);
|
Chris@16
|
41
|
Chris@16
|
42 public:
|
Chris@16
|
43 posix_named_semaphore
|
Chris@16
|
44 (create_only_t, const char *name, unsigned int initialCount, const permissions &perm = permissions())
|
Chris@16
|
45 { semaphore_open(mp_sem, DoCreate, name, initialCount, perm); }
|
Chris@16
|
46
|
Chris@16
|
47 posix_named_semaphore(open_or_create_t, const char *name, unsigned int initialCount, const permissions &perm = permissions())
|
Chris@16
|
48 { semaphore_open(mp_sem, DoOpenOrCreate, name, initialCount, perm); }
|
Chris@16
|
49
|
Chris@16
|
50 posix_named_semaphore(open_only_t, const char *name)
|
Chris@16
|
51 { semaphore_open(mp_sem, DoOpen, name); }
|
Chris@16
|
52
|
Chris@16
|
53 ~posix_named_semaphore()
|
Chris@16
|
54 {
|
Chris@16
|
55 if(mp_sem != BOOST_INTERPROCESS_POSIX_SEM_FAILED)
|
Chris@16
|
56 semaphore_close(mp_sem);
|
Chris@16
|
57 }
|
Chris@16
|
58
|
Chris@16
|
59 void post()
|
Chris@16
|
60 { semaphore_post(mp_sem); }
|
Chris@16
|
61
|
Chris@16
|
62 void wait()
|
Chris@16
|
63 { semaphore_wait(mp_sem); }
|
Chris@16
|
64
|
Chris@16
|
65 bool try_wait()
|
Chris@16
|
66 { return semaphore_try_wait(mp_sem); }
|
Chris@16
|
67
|
Chris@16
|
68 bool timed_wait(const boost::posix_time::ptime &abs_time)
|
Chris@16
|
69 { return semaphore_timed_wait(mp_sem, abs_time); }
|
Chris@16
|
70
|
Chris@16
|
71 static bool remove(const char *name)
|
Chris@16
|
72 { return semaphore_unlink(name); }
|
Chris@16
|
73
|
Chris@16
|
74 private:
|
Chris@16
|
75 friend class ipcdetail::interprocess_tester;
|
Chris@16
|
76 void dont_close_on_destruction()
|
Chris@16
|
77 { mp_sem = BOOST_INTERPROCESS_POSIX_SEM_FAILED; }
|
Chris@16
|
78
|
Chris@16
|
79 sem_t *mp_sem;
|
Chris@16
|
80 };
|
Chris@16
|
81
|
Chris@16
|
82 } //namespace ipcdetail {
|
Chris@16
|
83 } //namespace interprocess {
|
Chris@16
|
84 } //namespace boost {
|
Chris@16
|
85
|
Chris@16
|
86 #include <boost/interprocess/detail/config_end.hpp>
|
Chris@16
|
87
|
Chris@16
|
88 #endif //#ifndef BOOST_INTERPROCESS_POSIX_NAMED_CONDITION_HPP
|