1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
// -*- C++ -*-
//==========================================================================
/**
* @file Condition_Thread_Mutex.h
*
* $Id$
*
* Moved from Synch.h.
*
* @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
*/
//==========================================================================
#ifndef ACE_CONDITION_THREAD_MUTEX_H
#define ACE_CONDITION_THREAD_MUTEX_H
#include /**/ "ace/pre.h"
#include /**/ "ace/ACE_export.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#if !defined (ACE_HAS_THREADS)
# include "ace/Null_Condition.h"
#else /* ACE_HAS_THREADS */
// ACE platform supports some form of threading.
#include "ace/Thread_Mutex.h"
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
class ACE_Time_Value;
class ACE_Export ACE_Condition_Attributes
{
public:
/// Constructor
ACE_Condition_Attributes (int type = ACE_DEFAULT_SYNCH_TYPE);
/// Destructor
~ACE_Condition_Attributes (void);
private:
friend class ACE_Condition_Thread_Mutex;
/// The attributes
ACE_condattr_t attributes_;
private:
// = Prevent assignment and initialization.
void operator= (const ACE_Condition_Attributes &);
ACE_Condition_Attributes (const ACE_Condition_Attributes &);
};
/**
* @class ACE_Condition_Thread_Mutex
*
* @brief ACE_Condition variable wrapper written using ACE_Mutexes This
* allows threads to block until shared data changes state.
* A condition variable enables threads to atomically block and
* test the condition under the protection of a mutual exclu-
* sion lock (mutex) until the condition is satisfied. That is,
* the mutex must have been held by the thread before calling
* wait or signal on the condition. If the condition is false,
* a thread blocks on a condition variable and atomically
* releases the mutex that is waiting for the condition to
* change. If another thread changes the condition, it may wake
* up waiting threads by signaling the associated condition
* variable. The waiting threads, upon awakening, reacquire the
* mutex and re-evaluate the condition.
*
* This should be an instantiation of ACE_Condition but problems
* with compilers precludes this...
*/
class ACE_Export ACE_Condition_Thread_Mutex
{
public:
/// Initialize the condition variable.
ACE_Condition_Thread_Mutex (ACE_Thread_Mutex &m,
const ACE_TCHAR *name = 0,
void *arg = 0);
/// Initialize the condition variable.
ACE_Condition_Thread_Mutex (ACE_Thread_Mutex &m,
ACE_Condition_Attributes &attributes,
const ACE_TCHAR *name = 0,
void *arg = 0);
/// Implicitly destroy the condition variable.
~ACE_Condition_Thread_Mutex (void);
/**
* Explicitly destroy the condition variable. Note that only one
* thread should call this method since it doesn't protect against
* race conditions.
*/
int remove (void);
/**
* Block on condition, or until absolute time-of-day has passed. If
* abstime == 0 use "blocking" <wait> semantics. Else, if @a abstime
* != 0 and the call times out before the condition is signaled
* <wait> returns -1 and sets errno to ETIME.
*/
int wait (const ACE_Time_Value *abstime);
/// Block on condition.
int wait (void);
/**
* Block on condition or until absolute time-of-day has passed. If
* abstime == 0 use "blocking" wait() semantics on the <mutex>
* passed as a parameter (this is useful if you need to store the
* <Condition> in shared memory). Else, if @a abstime != 0 and the
* call times out before the condition is signaled <wait> returns -1
* and sets errno to ETIME.
*/
int wait (ACE_Thread_Mutex &mutex, const ACE_Time_Value *abstime = 0);
/// Signal one waiting thread.
int signal (void);
/// Signal *all* waiting threads.
int broadcast (void);
/// Returns a reference to the underlying mutex;
ACE_Thread_Mutex &mutex (void);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
/// Condition variable.
ACE_cond_t cond_;
/// Reference to mutex lock.
ACE_Thread_Mutex &mutex_;
/// Keeps track of whether <remove> has been called yet to avoid
/// multiple <remove> calls, e.g., explicitly and implicitly in the
/// destructor. This flag isn't protected by a lock, so make sure
/// that you don't have multiple threads simultaneously calling
/// <remove> on the same object, which is a bad idea anyway...
bool removed_;
private:
// = Prevent assignment and initialization.
void operator= (const ACE_Condition_Thread_Mutex &);
ACE_Condition_Thread_Mutex (const ACE_Condition_Thread_Mutex &);
};
ACE_END_VERSIONED_NAMESPACE_DECL
#if defined (__ACE_INLINE__)
#include "ace/Condition_Thread_Mutex.inl"
#endif /* __ACE_INLINE__ */
#endif /* !ACE_HAS_THREADS */
#include /**/ "ace/post.h"
#endif /* ACE_CONDITION_THREAD_MUTEX_H */
|