1/*****************************************************************************/
2// Copyright 2006-2008 Adobe Systems Incorporated
3// All Rights Reserved.
4//
5// NOTICE: Adobe permits you to use, modify, and distribute this file in
6// accordance with the terms of the Adobe license agreement accompanying it.
7/*****************************************************************************/
8
9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_mutex.h#2 $ */
10/* $DateTime: 2012/09/05 12:31:51 $ */
11/* $Change: 847652 $ */
12/* $Author: tknoll $ */
13
14/******************************************************************************/
15
16#ifndef __dng_mutex__
17#define __dng_mutex__
18
19/******************************************************************************/
20
21#include "dng_flags.h"
22
23/******************************************************************************/
24
25#include "dng_types.h"
26
27#if qDNGThreadSafe
28
29#include "dng_pthread.h"
30
31#endif
32
33/******************************************************************************/
34
35class dng_mutex
36 {
37
38 public:
39
40 enum
41 {
42 kDNGMutexLevelLeaf = 0x70000000u
43 };
44
45 dng_mutex (const char *mutexName,
46 uint32 mutexLevel = kDNGMutexLevelLeaf);
47
48 virtual ~dng_mutex ();
49
50 void Lock ();
51
52 void Unlock ();
53
54 const char *MutexName () const;
55
56 protected:
57
58 #if qDNGThreadSafe
59
60 pthread_mutex_t fPthreadMutex;
61
62 const uint32 fMutexLevel;
63
64 uint32 fRecursiveLockCount;
65
66 dng_mutex *fPrevHeldMutex;
67
68 const char * const fMutexName;
69
70 friend class dng_condition;
71
72 #endif
73
74 private:
75
76 // Hidden copy constructor and assignment operator.
77
78 dng_mutex (const dng_mutex &mutex);
79
80 dng_mutex & operator= (const dng_mutex &mutex);
81
82 };
83
84/*****************************************************************************/
85
86class dng_lock_mutex
87 {
88
89 private:
90
91 dng_mutex *fMutex;
92
93 public:
94
95 dng_lock_mutex (dng_mutex *mutex);
96
97 ~dng_lock_mutex ();
98
99 private:
100
101 // Hidden copy constructor and assignment operator.
102
103 dng_lock_mutex (const dng_lock_mutex &lock);
104
105 dng_lock_mutex & operator= (const dng_lock_mutex &lock);
106
107 };
108
109/*****************************************************************************/
110
111class dng_unlock_mutex
112 {
113
114 private:
115
116 dng_mutex *fMutex;
117
118 public:
119
120 dng_unlock_mutex (dng_mutex *mutex);
121
122 ~dng_unlock_mutex ();
123
124 private:
125
126 // Hidden copy constructor and assignment operator.
127
128 dng_unlock_mutex (const dng_unlock_mutex &unlock);
129
130 dng_unlock_mutex & operator= (const dng_unlock_mutex &unlock);
131
132 };
133
134/*****************************************************************************/
135
136#if qDNGThreadSafe
137
138/*****************************************************************************/
139
140class dng_condition
141 {
142
143 public:
144
145 dng_condition ();
146
147 ~dng_condition ();
148
149 bool Wait (dng_mutex &mutex, double timeoutSecs = -1.0);
150
151 void Signal ();
152
153 void Broadcast ();
154
155 protected:
156
157 pthread_cond_t fPthreadCondition;
158
159 private:
160
161 // Hidden copy constructor and assignment operator.
162
163 dng_condition (const dng_condition &condition);
164
165 dng_condition & operator= (const dng_condition &condition);
166
167 };
168
169/*****************************************************************************/
170
171#endif // qDNGThreadSafe
172
173/*****************************************************************************/
174
175#endif
176
177/*****************************************************************************/
178