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