historical/toontown-classic.git/panda/include/trueClock.h
2024-01-16 11:20:27 -06:00

108 lines
3.1 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file trueClock.h
* @author drose
* @date 2000-07-04
*/
#ifndef TRUECLOCK_H
#define TRUECLOCK_H
#include "pandabase.h"
#include "typedef.h"
#include "pdeque.h"
#include "mutexImpl.h"
#include "config_express.h"
/**
* An interface to whatever real-time clock we might have available in the
* current environment. There is only one TrueClock in existence, and it
* constructs itself.
*
* The TrueClock returns elapsed real time in seconds since some undefined
* epoch. Since it is not defined at what time precisely the clock indicates
* zero, this value can only be meaningfully used to measure elapsed time, by
* sampling it at two different times and subtracting.
*/
class EXPCL_PANDA_EXPRESS TrueClock {
PUBLISHED:
// get_long_time() returns the most accurate timer we have over a long
// interval. It may not be very precise for measuring short intervals, but
// it should not drift substantially over the long haul.
double get_long_time();
MAKE_PROPERTY(long_time, get_long_time);
// get_short_time() returns the most precise timer we have over a short
// interval. It may tend to drift over the long haul, but it should have
// lots of digits to measure short intervals very precisely.
INLINE double get_short_time();
MAKE_PROPERTY(short_time, get_short_time);
// get_short_raw_time() is like get_short_time(), but does not apply any
// corrections (e.g. paranoid-clock) to the result returned by the OS.
double get_short_raw_time();
MAKE_PROPERTY(short_raw_time, get_short_raw_time);
INLINE int get_error_count() const;
MAKE_PROPERTY(error_count, get_error_count);
INLINE static TrueClock *get_global_ptr();
bool set_cpu_affinity(uint32_t mask) const;
protected:
TrueClock();
INLINE ~TrueClock();
int _error_count;
static TrueClock *_global_ptr;
#ifdef WIN32
double correct_time(double time);
void set_time_scale(double time, double new_time_scale);
bool _has_high_res;
int64_t _init_count;
double _frequency, _recip_frequency;
int _init_tc;
uint64_t _init_tod;
// The rest of the data structures in this block are strictly for
// implementing paranoid_clock: they are designed to allow us to cross-check
// the high-resolution clock against the time-of-day clock, and smoothly
// correct for deviations.
class Timestamp {
public:
Timestamp(double time, double tod) : _time(time), _tod(tod) { }
double _time;
double _tod;
};
typedef pdeque<Timestamp> Timestamps;
Timestamps _timestamps;
double _time_scale;
double _time_offset;
double _tod_offset;
int _num_jump_errors;
bool _time_scale_changed;
double _last_reported_time_scale;
double _report_time_scale_time;
enum ChaseClock {
CC_slow_down,
CC_keep_even,
CC_speed_up,
};
ChaseClock _chase_clock;
MutexImpl _lock;
#endif // WIN32
};
#include "trueClock.I"
#endif