📄 delayqueue.hh
字号:
/**********This library is free software; you can redistribute it and/or modify it underthe terms of the GNU Lesser General Public License as published by theFree Software Foundation; either version 2.1 of the License, or (at youroption) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)This library is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License formore details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation, Inc.,59 Temple Place, Suite 330, Boston, MA 02111-1307 USA**********/ // Copyright (c) 1996-2000, Live Networks, Inc. All rights reserved// Delay queue// C++ header#ifndef _DELAY_QUEUE_HH#define _DELAY_QUEUE_HH#ifndef _NET_COMMON_H#include "NetCommon.h"#endif#ifdef TIME_BASEtypedef TIME_BASE time_base_seconds;#elsetypedef long time_base_seconds;#endif///// A "Timeval" can be either an absolute time, or a time interval /////class Timeval {public: time_base_seconds seconds() const { return fTv.tv_sec; } time_base_seconds seconds() { return fTv.tv_sec; } time_base_seconds useconds() const { return fTv.tv_usec; } time_base_seconds useconds() { return fTv.tv_usec; } int operator>=(Timeval const& arg2) const; int operator<=(Timeval const& arg2) const { return arg2 >= *this; } int operator<(Timeval const& arg2) const { return !(*this >= arg2); } int operator>(Timeval const& arg2) const { return arg2 < *this; } int operator==(Timeval const& arg2) const { return *this >= arg2 && arg2 >= *this; } int operator!=(Timeval const& arg2) const { return !(*this == arg2); } void operator+=(class DelayInterval const& arg2); void operator-=(class DelayInterval const& arg2); // returns ZERO iff arg2 >= arg1 protected: Timeval(time_base_seconds seconds, time_base_seconds useconds) { fTv.tv_sec = seconds; fTv.tv_usec = useconds; } private: time_base_seconds& secs() { return (time_base_seconds&)fTv.tv_sec; } time_base_seconds& usecs() { return (time_base_seconds&)fTv.tv_usec; } struct timeval fTv;};#ifndef maxinline Timeval max(Timeval const& arg1, Timeval const& arg2) { return arg1 >= arg2 ? arg1 : arg2;}#endif#ifndef mininline Timeval min(Timeval const& arg1, Timeval const& arg2) { return arg1 <= arg2 ? arg1 : arg2;}#endifclass DelayInterval operator-(Timeval const& arg1, Timeval const& arg2);// returns ZERO iff arg2 >= arg1///// DelayInterval /////class DelayInterval: public Timeval {public: DelayInterval(time_base_seconds seconds, time_base_seconds useconds) : Timeval(seconds, useconds) {}};DelayInterval operator*(short arg1, DelayInterval const& arg2);extern DelayInterval const ZERO;extern DelayInterval const SECOND;DelayInterval const MINUTE = 60*SECOND;DelayInterval const HOUR = 60*MINUTE;DelayInterval const DAY = 24*HOUR;///// EventTime /////class EventTime: public Timeval {public: EventTime(unsigned secondsSinceEpoch = 0, unsigned usecondsSinceEpoch = 0) // We use the Unix standard epoch: January 1, 1970 : Timeval(secondsSinceEpoch, usecondsSinceEpoch) {}};EventTime TimeNow();DelayInterval TimeRemainingUntil(EventTime const& futureEvent);// Returns ZERO if "futureEvent" has already occurred.extern EventTime const THE_END_OF_TIME;///// DelayQueueEntry /////class DelayQueueEntry {public: virtual ~DelayQueueEntry(); long token() { return fToken; }protected: // abstract base class DelayQueueEntry(DelayInterval delay); virtual void handleTimeout(); private: friend class DelayQueue; DelayQueueEntry* fNext; DelayQueueEntry* fPrev; DelayInterval fDeltaTimeRemaining; long fToken; static long tokenCounter;};///// DelayQueue /////class DelayQueue: public DelayQueueEntry {public: DelayQueue(); virtual ~DelayQueue(); void addEntry(DelayQueueEntry* newEntry); // returns a token for the entry void updateEntry(DelayQueueEntry* entry, DelayInterval newDelay); void updateEntry(long tokenToFind, DelayInterval newDelay); void removeEntry(DelayQueueEntry* entry); // but doesn't delete it DelayQueueEntry* removeEntry(long tokenToFind); // but doesn't delete it DelayInterval const& timeToNextAlarm(); void handleAlarm();private: DelayQueueEntry* head() { return fNext; } DelayQueueEntry* findEntryByToken(long token); void synchronize(); // bring the 'time remaining' fields up-to-date EventTime fLastSyncTime;};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -