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 
26 class 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 
MinPriority()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 
dng_priority_manager()74 dng_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 
Increment(dng_priority priority)94 void 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 
Decrement(dng_priority priority)105 void 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 
Wait(dng_priority priority)127 void 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 
148 static dng_priority_manager gPriorityManager;
149 
150 /*****************************************************************************/
151 
152 #endif
153 
154 /*****************************************************************************/
155 
dng_set_minimum_priority(dng_priority priority)156 dng_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 
~dng_set_minimum_priority()172 dng_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 
dng_abort_sniffer()185 dng_abort_sniffer::dng_abort_sniffer ()
186 
187 	:	fPriority (dng_priority_maximum)
188 
189 	{
190 
191 	}
192 
193 /*****************************************************************************/
194 
~dng_abort_sniffer()195 dng_abort_sniffer::~dng_abort_sniffer ()
196 	{
197 
198 	}
199 
200 /*****************************************************************************/
201 
SniffForAbort(dng_abort_sniffer * sniffer)202 void 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 
StartTask(const char *,real64)222 void dng_abort_sniffer::StartTask (const char * /* name */,
223 								   real64 /* fract */)
224 	{
225 
226 	}
227 
228 /*****************************************************************************/
229 
EndTask()230 void dng_abort_sniffer::EndTask ()
231 	{
232 
233 	}
234 
235 /*****************************************************************************/
236 
UpdateProgress(real64)237 void dng_abort_sniffer::UpdateProgress (real64 /* fract */)
238 	{
239 
240 	}
241 
242 /*****************************************************************************/
243