Source: ../../libxorp/time_slice.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// Copyright (c) 2001-2009 XORP, Inc.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License, Version
// 2.1, June 1999 as published by the Free Software Foundation.
// Redistribution and/or modification of this program under the terms of
// any other version of the GNU Lesser General Public License is not
// permitted.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
// see the GNU Lesser General Public License, Version 2.1, a copy of
// which can be found in the XORP LICENSE.lgpl file.
//
// XORP, Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
// http://xorp.net
// $XORP: xorp/libxorp/time_slice.hh,v 1.14 2009/01/05 18:30:58 jtc Exp $
#ifndef __LIBXORP_TIME_SLICE_HH__
#define __LIBXORP_TIME_SLICE_HH__
//
// Time-slice class declaration.
//
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include "timer.hh"
#include "timeval.hh"
//
// Constants definitions
//
//
// Structures/classes, typedefs and macros
//
/**
* @short A class for computing whether some processing is taking too long.
*
* This class can be used to compute whether some processing is taking
* too long time to complete. It is up to the program that uses
* TimeSlice to check whether the processing is taking too long,
* and suspend processing of that task if necessary.
*
* Example of usage:
<pre>
TimeSlice time_slice(100000, 20); // 100ms, test every 20th iteration
for (size_t i = 0; i < 1000000000; i++) {
if (time_slice.is_expired()) {
// Stop processing.
// Schedule a timer after 0 ms to continue processing.
// If needed, save state to continue from here.
return;
}
// Do something CPU-hungry
}
time_slice.reset(); // Prepare it again for later usage if needed
</pre>
*/
class TimeSlice {
public:
/**
* Constructor for a given time limit and test frequency.
*
* Create a TimeSlice object that will measure time slices
* with given frequency of testing.
* The time slice is measured once in @ref test_iter_frequency
* times when method is_expired() is called.
*
* @param usec_limit the time slice to measure in microseconds.
* @param test_iter_frequency the frequency of measuring the time slice.
*/
TimeSlice(uint32_t usec_limit, size_t test_iter_frequency);
/**
* Reset the TimeSlice object.
*/
void reset();
/**
* Test if the time slice has expired.
*
* If the time slice has expired, automatically prepare this object
* to start measuring again the time slice.
*
* @return true if the time slice has expired, otherwise false.
*/
bool is_expired();
private:
TimeVal _time_slice_limit; // The time slice to measure
const size_t _test_iter_frequency; // The frequency of measuring
TimeVal _time_slice_start; // When the time slice started
size_t _remain_iter; // Remaning iterations to
// check the time
};
//
// Deferred definitions
//
inline bool
TimeSlice::is_expired()
{
if (--_remain_iter)
return (false); // Don't test the time yet
_remain_iter = _test_iter_frequency;
// Test if the time slice has expired
TimeVal now;
TimerList::system_gettimeofday(&now);
if (now - _time_slice_limit < _time_slice_start)
return (false); // The time slice has not expired
// The time slice has expired
_time_slice_start = now;
return (true);
}
//
// Global variables
//
//
// Global functions prototypes
//
#endif // __LIBXORP_TIME_SLICE_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:10:36 2009, using kdoc 2.0a54+XORP.