You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
5.8 KiB
245 lines
5.8 KiB
4 months ago
|
/*****************************************************************************/
|
||
|
// 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.h#2 $ */
|
||
|
/* $DateTime: 2012/07/11 10:36:56 $ */
|
||
|
/* $Change: 838485 $ */
|
||
|
/* $Author: tknoll $ */
|
||
|
|
||
|
/** \file
|
||
|
* Classes supporting user cancellation and progress tracking.
|
||
|
*/
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
#ifndef __dng_abort_sniffer__
|
||
|
#define __dng_abort_sniffer__
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
#include "dng_flags.h"
|
||
|
#include "dng_types.h"
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
/// \brief Thread priority level.
|
||
|
|
||
|
enum dng_priority
|
||
|
{
|
||
|
|
||
|
dng_priority_low,
|
||
|
dng_priority_medium,
|
||
|
dng_priority_high,
|
||
|
|
||
|
dng_priority_count,
|
||
|
|
||
|
dng_priority_minimum = dng_priority_low,
|
||
|
dng_priority_maximum = dng_priority_high
|
||
|
|
||
|
};
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
/// \brief Convenience class for setting thread priority level to minimum.
|
||
|
|
||
|
class dng_set_minimum_priority
|
||
|
{
|
||
|
|
||
|
private:
|
||
|
|
||
|
dng_priority fPriority;
|
||
|
|
||
|
public:
|
||
|
|
||
|
dng_set_minimum_priority (dng_priority priority);
|
||
|
|
||
|
~dng_set_minimum_priority ();
|
||
|
|
||
|
};
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
/** \brief Class for signaling user cancellation and receiving progress updates.
|
||
|
*
|
||
|
* DNG SDK clients should derive a host application specific implementation
|
||
|
* from this class.
|
||
|
*/
|
||
|
|
||
|
class dng_abort_sniffer
|
||
|
{
|
||
|
|
||
|
friend class dng_sniffer_task;
|
||
|
|
||
|
private:
|
||
|
|
||
|
dng_priority fPriority;
|
||
|
|
||
|
public:
|
||
|
|
||
|
dng_abort_sniffer ();
|
||
|
|
||
|
virtual ~dng_abort_sniffer ();
|
||
|
|
||
|
/// Getter for priority level.
|
||
|
|
||
|
dng_priority Priority () const
|
||
|
{
|
||
|
return fPriority;
|
||
|
}
|
||
|
|
||
|
/// Setter for priority level.
|
||
|
|
||
|
void SetPriority (dng_priority priority)
|
||
|
{
|
||
|
fPriority = priority;
|
||
|
}
|
||
|
|
||
|
/// Check for pending user cancellation or other abort. ThrowUserCanceled
|
||
|
/// will be called if one is pending. This static method is provided as a
|
||
|
/// convenience for quickly testing for an abort and throwing an exception
|
||
|
/// if one is pending.
|
||
|
/// \param sniffer The dng_sniffer to test for a pending abort. Can be NULL,
|
||
|
/// in which case there an abort is never signalled.
|
||
|
|
||
|
static void SniffForAbort (dng_abort_sniffer *sniffer);
|
||
|
|
||
|
// A way to call Sniff while bypassing the priority wait.
|
||
|
|
||
|
void SniffNoPriorityWait ()
|
||
|
{
|
||
|
Sniff ();
|
||
|
}
|
||
|
|
||
|
// Specifies whether or not the sniffer may be called by multiple threads
|
||
|
// in parallel. Default result is false. Subclass must override to return
|
||
|
// true.
|
||
|
|
||
|
virtual bool ThreadSafe () const
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
|
||
|
/// Should be implemented by derived classes to check for an user
|
||
|
/// cancellation.
|
||
|
|
||
|
virtual void Sniff () = 0;
|
||
|
|
||
|
/// Signals the start of a named task withn processing in the DNG SDK.
|
||
|
/// Tasks may be nested.
|
||
|
/// \param name of the task
|
||
|
/// \param fract Percentage of total processing this task is expected to
|
||
|
/// take. From 0.0 to 1.0 .
|
||
|
|
||
|
virtual void StartTask (const char *name,
|
||
|
real64 fract);
|
||
|
|
||
|
/// Signals the end of the innermost task that has been started.
|
||
|
|
||
|
virtual void EndTask ();
|
||
|
|
||
|
/// Signals progress made on current task.
|
||
|
/// \param fract percentage of processing completed on current task.
|
||
|
/// From 0.0 to 1.0 .
|
||
|
|
||
|
virtual void UpdateProgress (real64 fract);
|
||
|
|
||
|
};
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
/// \brief Class to establish scope of a named subtask in DNG processing.
|
||
|
///
|
||
|
/// Instances of this class are intended to be stack allocated.
|
||
|
|
||
|
class dng_sniffer_task
|
||
|
{
|
||
|
|
||
|
private:
|
||
|
|
||
|
dng_abort_sniffer *fSniffer;
|
||
|
|
||
|
public:
|
||
|
|
||
|
/// Inform a sniffer of a subtask in DNG processing.
|
||
|
/// \param sniffer The sniffer associated with the host on which this
|
||
|
/// processing is occurring.
|
||
|
/// \param name The name of this subtask as a NUL terminated string.
|
||
|
/// \param fract Percentage of total processing this task is expected
|
||
|
/// to take, from 0.0 to 1.0 .
|
||
|
|
||
|
dng_sniffer_task (dng_abort_sniffer *sniffer,
|
||
|
const char *name = NULL,
|
||
|
real64 fract = 0.0)
|
||
|
|
||
|
: fSniffer (sniffer)
|
||
|
|
||
|
{
|
||
|
if (fSniffer)
|
||
|
fSniffer->StartTask (name, fract);
|
||
|
}
|
||
|
|
||
|
~dng_sniffer_task ()
|
||
|
{
|
||
|
if (fSniffer)
|
||
|
fSniffer->EndTask ();
|
||
|
}
|
||
|
|
||
|
/// Check for pending user cancellation or other abort. ThrowUserCanceled
|
||
|
/// will be called if one is pending.
|
||
|
|
||
|
void Sniff ()
|
||
|
{
|
||
|
dng_abort_sniffer::SniffForAbort (fSniffer);
|
||
|
}
|
||
|
|
||
|
/// Update progress on this subtask.
|
||
|
/// \param fract Percentage of processing completed on current task,
|
||
|
/// from 0.0 to 1.0 .
|
||
|
|
||
|
void UpdateProgress (real64 fract)
|
||
|
{
|
||
|
if (fSniffer)
|
||
|
fSniffer->UpdateProgress (fract);
|
||
|
}
|
||
|
|
||
|
/// Update progress on this subtask.
|
||
|
/// \param done Amount of task completed in arbitrary integer units.
|
||
|
/// \param total Total size of task in same arbitrary integer units as done.
|
||
|
|
||
|
void UpdateProgress (uint32 done,
|
||
|
uint32 total)
|
||
|
{
|
||
|
UpdateProgress ((real64) done /
|
||
|
(real64) total);
|
||
|
}
|
||
|
|
||
|
/// Signal task completed for progress purposes.
|
||
|
|
||
|
void Finish ()
|
||
|
{
|
||
|
UpdateProgress (1.0);
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
|
||
|
// Hidden copy constructor and assignment operator.
|
||
|
|
||
|
dng_sniffer_task (const dng_sniffer_task &task);
|
||
|
|
||
|
dng_sniffer_task & operator= (const dng_sniffer_task &task);
|
||
|
|
||
|
};
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/*****************************************************************************/
|