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_abort_sniffer.cpp#1 $ */
10/* $DateTime: 2012/05/30 13:28:51 $ */
11/* $Change: 832332 $ */
12/* $Author: tknoll $ */
13
14/*****************************************************************************/
15
16#include "dng_abort_sniffer.h"
17
18#include "dng_mutex.h"
19
20/*****************************************************************************/
21
22#if qDNGThreadSafe
23
24/*****************************************************************************/
25
26class dng_priority_manager
27 {
28
29 private:
30
31 dng_mutex fMutex;
32
33 dng_condition fCondition;
34
35 uint32 fCounter [dng_priority_count];
36
37 public:
38
39 dng_priority_manager ();
40
41 void Increment (dng_priority priority);
42
43 void Decrement (dng_priority priority);
44
45 void Wait (dng_priority priority);
46
47 private:
48
49 dng_priority MinPriority ()
50 {
51
52 // Assumes mutex is locked.
53
54 for (uint32 level = dng_priority_maximum;
55 level > dng_priority_minimum;
56 level--)
57 {
58
59 if (fCounter [level])
60 {
61 return (dng_priority) level;
62 }
63
64 }
65
66 return dng_priority_minimum;
67
68 }
69
70 };
71
72/*****************************************************************************/
73
74dng_priority_manager::dng_priority_manager ()
75
76 : fMutex ("dng_priority_manager::fMutex")
77 , fCondition ()
78
79 {
80
81 for (uint32 level = dng_priority_minimum;
82 level <= dng_priority_maximum;
83 level++)
84 {
85
86 fCounter [level] = 0;
87
88 }
89
90 }
91
92/*****************************************************************************/
93
94void dng_priority_manager::Increment (dng_priority priority)
95 {
96
97 dng_lock_mutex lock (&fMutex);
98
99 fCounter [priority] += 1;
100
101 }
102
103/*****************************************************************************/
104
105void dng_priority_manager::Decrement (dng_priority priority)
106 {
107
108 dng_lock_mutex lock (&fMutex);
109
110 dng_priority oldMin = MinPriority ();
111
112 fCounter [priority] -= 1;
113
114 dng_priority newMin = MinPriority ();
115
116 if (newMin < oldMin)
117 {
118
119 fCondition.Broadcast ();
120
121 }
122
123 }
124
125/*****************************************************************************/
126
127void dng_priority_manager::Wait (dng_priority priority)
128 {
129
130 if (priority < dng_priority_maximum)
131 {
132
133 dng_lock_mutex lock (&fMutex);
134
135 while (priority < MinPriority ())
136 {
137
138 fCondition.Wait (fMutex);
139
140 }
141
142 }
143
144 }
145
146/*****************************************************************************/
147
148static dng_priority_manager gPriorityManager;
149
150/*****************************************************************************/
151
152#endif
153
154/*****************************************************************************/
155
156dng_set_minimum_priority::dng_set_minimum_priority (dng_priority priority)
157
158 : fPriority (priority)
159
160 {
161
162 #if qDNGThreadSafe
163
164 gPriorityManager.Increment (fPriority);
165
166 #endif
167
168 }
169
170/*****************************************************************************/
171
172dng_set_minimum_priority::~dng_set_minimum_priority ()
173 {
174
175 #if qDNGThreadSafe
176
177 gPriorityManager.Decrement (fPriority);
178
179 #endif
180
181 }
182
183/*****************************************************************************/
184
185dng_abort_sniffer::dng_abort_sniffer ()
186
187 : fPriority (dng_priority_maximum)
188
189 {
190
191 }
192
193/*****************************************************************************/
194
195dng_abort_sniffer::~dng_abort_sniffer ()
196 {
197
198 }
199
200/*****************************************************************************/
201
202void dng_abort_sniffer::SniffForAbort (dng_abort_sniffer *sniffer)
203 {
204
205 if (sniffer)
206 {
207
208 #if qDNGThreadSafe
209
210 gPriorityManager.Wait (sniffer->Priority ());
211
212 #endif
213
214 sniffer->Sniff ();
215
216 }
217
218 }
219
220/*****************************************************************************/
221
222void dng_abort_sniffer::StartTask (const char * /* name */,
223 real64 /* fract */)
224 {
225
226 }
227
228/*****************************************************************************/
229
230void dng_abort_sniffer::EndTask ()
231 {
232
233 }
234
235/*****************************************************************************/
236
237void dng_abort_sniffer::UpdateProgress (real64 /* fract */)
238 {
239
240 }
241
242/*****************************************************************************/
243