Initial commit
This commit is contained in:
110
common/rfb/Timer.h
Normal file
110
common/rfb/Timer.h
Normal file
@@ -0,0 +1,110 @@
|
||||
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
|
||||
* Copyright 2018 Pierre Ossman for Cendio AB
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This software 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. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this software; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
* USA.
|
||||
*/
|
||||
|
||||
#ifndef __RFB_TIMER_H__
|
||||
#define __RFB_TIMER_H__
|
||||
|
||||
#include <list>
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
namespace rfb {
|
||||
|
||||
/* Timer
|
||||
|
||||
Cross-platform timeout handling. The caller creates instances of Timer and passes a
|
||||
Callback implementation to each. The Callback will then be called with a pointer to
|
||||
the Timer instance that timed-out when the timeout occurs.
|
||||
|
||||
The static methods of Timer are used by the main loop of the application both to
|
||||
dispatch elapsed Timer callbacks and to determine how long to wait in select() for
|
||||
the next timeout to occur.
|
||||
|
||||
*/
|
||||
|
||||
struct Timer {
|
||||
|
||||
struct Callback {
|
||||
// handleTimeout
|
||||
// Passed a pointer to the Timer that has timed out. If the handler returns true
|
||||
// then the Timer is reset and left running, causing another timeout after the
|
||||
// appropriate interval.
|
||||
// If the handler returns false then the Timer is cancelled.
|
||||
virtual bool handleTimeout(Timer* t) = 0;
|
||||
|
||||
virtual ~Callback() {}
|
||||
};
|
||||
|
||||
// checkTimeouts()
|
||||
// Dispatches any elapsed Timers, and returns the number of milliseconds until the
|
||||
// next Timer will timeout.
|
||||
static int checkTimeouts();
|
||||
|
||||
// getNextTimeout()
|
||||
// Returns the number of milliseconds until the next timeout, without dispatching
|
||||
// any elapsed Timers.
|
||||
static int getNextTimeout();
|
||||
|
||||
// Create a Timer with the specified callback handler
|
||||
Timer(Callback* cb_) {cb = cb_;}
|
||||
~Timer() {stop();}
|
||||
|
||||
// startTimer
|
||||
// Starts the timer, causing a timeout after the specified number of milliseconds.
|
||||
// If the timer is already active then it will be implicitly cancelled and re-started.
|
||||
void start(int timeoutMs_);
|
||||
|
||||
// stopTimer
|
||||
// Cancels the timer.
|
||||
void stop();
|
||||
|
||||
// isStarted
|
||||
// Determines whether the timer is started.
|
||||
bool isStarted();
|
||||
|
||||
// getTimeoutMs
|
||||
// Determines the previously used timeout value, if any.
|
||||
// Usually used with isStarted() to get the _current_ timeout.
|
||||
int getTimeoutMs();
|
||||
|
||||
// getRemainingMs
|
||||
// Determines how many milliseconds are left before the Timer
|
||||
// will timeout. Only valid for an active timer.
|
||||
int getRemainingMs();
|
||||
|
||||
// isBefore
|
||||
// Determine whether the Timer will timeout before the specified time.
|
||||
bool isBefore(timeval other);
|
||||
|
||||
protected:
|
||||
timeval dueTime;
|
||||
int timeoutMs;
|
||||
Callback* cb;
|
||||
|
||||
static void insertTimer(Timer* t);
|
||||
// The list of currently active Timers, ordered by time left until timeout.
|
||||
static std::list<Timer*> pending;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user