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