/*****************************************************************************/ // Copyright 2006-2008 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in // accordance with the terms of the Adobe license agreement accompanying it. /*****************************************************************************/ /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_abort_sniffer.cpp#1 $ */ /* $DateTime: 2012/05/30 13:28:51 $ */ /* $Change: 832332 $ */ /* $Author: tknoll $ */ /*****************************************************************************/ #include "dng_abort_sniffer.h" #include "dng_mutex.h" /*****************************************************************************/ #if qDNGThreadSafe /*****************************************************************************/ class dng_priority_manager { private: dng_mutex fMutex; dng_condition fCondition; uint32 fCounter [dng_priority_count]; public: dng_priority_manager (); void Increment (dng_priority priority); void Decrement (dng_priority priority); void Wait (dng_priority priority); private: dng_priority MinPriority () { // Assumes mutex is locked. for (uint32 level = dng_priority_maximum; level > dng_priority_minimum; level--) { if (fCounter [level]) { return (dng_priority) level; } } return dng_priority_minimum; } }; /*****************************************************************************/ dng_priority_manager::dng_priority_manager () : fMutex ("dng_priority_manager::fMutex") , fCondition () { for (uint32 level = dng_priority_minimum; level <= dng_priority_maximum; level++) { fCounter [level] = 0; } } /*****************************************************************************/ void dng_priority_manager::Increment (dng_priority priority) { dng_lock_mutex lock (&fMutex); fCounter [priority] += 1; } /*****************************************************************************/ void dng_priority_manager::Decrement (dng_priority priority) { dng_lock_mutex lock (&fMutex); dng_priority oldMin = MinPriority (); fCounter [priority] -= 1; dng_priority newMin = MinPriority (); if (newMin < oldMin) { fCondition.Broadcast (); } } /*****************************************************************************/ void dng_priority_manager::Wait (dng_priority priority) { if (priority < dng_priority_maximum) { dng_lock_mutex lock (&fMutex); while (priority < MinPriority ()) { fCondition.Wait (fMutex); } } } /*****************************************************************************/ static dng_priority_manager gPriorityManager; /*****************************************************************************/ #endif /*****************************************************************************/ dng_set_minimum_priority::dng_set_minimum_priority (dng_priority priority) : fPriority (priority) { #if qDNGThreadSafe gPriorityManager.Increment (fPriority); #endif } /*****************************************************************************/ dng_set_minimum_priority::~dng_set_minimum_priority () { #if qDNGThreadSafe gPriorityManager.Decrement (fPriority); #endif } /*****************************************************************************/ dng_abort_sniffer::dng_abort_sniffer () : fPriority (dng_priority_maximum) { } /*****************************************************************************/ dng_abort_sniffer::~dng_abort_sniffer () { } /*****************************************************************************/ void dng_abort_sniffer::SniffForAbort (dng_abort_sniffer *sniffer) { if (sniffer) { #if qDNGThreadSafe gPriorityManager.Wait (sniffer->Priority ()); #endif sniffer->Sniff (); } } /*****************************************************************************/ void dng_abort_sniffer::StartTask (const char * /* name */, real64 /* fract */) { } /*****************************************************************************/ void dng_abort_sniffer::EndTask () { } /*****************************************************************************/ void dng_abort_sniffer::UpdateProgress (real64 /* fract */) { } /*****************************************************************************/