1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-06-30 11:02:48 -05:00

Two related changes to timing code:

First, make absolute times unsigned.  This means that it's safe to 
depend on their overflow behaviour (which is undefined for signed 
integers).  This requires a little extra care in handling comparisons, 
but I think I've correctly adjusted them all.

Second, functions registered with schedule_timer() are guaranteed to be 
called with precisely the time that was returned by schedule_timer().  
Thus, it's only necessary to check these values for equality rather than 
doing risky range checks, so do that.

The timing code still does lots that's undefined, unnecessary, or just
wrong, but this is a good start.

[originally from svn r9667]
This commit is contained in:
Ben Harris
2012-09-18 21:42:48 +00:00
parent 41ad182710
commit d5836982e2
16 changed files with 88 additions and 61 deletions

View File

@ -1400,13 +1400,18 @@ void notify_remote_exit(void *frontend)
static gint timer_trigger(gpointer data)
{
long now = GPOINTER_TO_LONG(data);
long next;
unsigned long now = GPOINTER_TO_LONG(data);
unsigned long next, then;
long ticks;
if (run_timers(now, &next)) {
ticks = next - GETTICKCOUNT();
timer_id = gtk_timeout_add(ticks > 0 ? ticks : 1, timer_trigger,
then = now;
now = GETTICKCOUNT();
if (now - then > next - then)
ticks = 0;
else
ticks = next - now;
timer_id = gtk_timeout_add(ticks, timer_trigger,
LONG_TO_GPOINTER(next));
}
@ -1417,7 +1422,7 @@ static gint timer_trigger(gpointer data)
return FALSE;
}
void timer_change_notify(long next)
void timer_change_notify(unsigned long next)
{
long ticks;

View File

@ -70,7 +70,7 @@ void notify_remote_exit(void *frontend)
{
}
void timer_change_notify(long next)
void timer_change_notify(unsigned long next)
{
}

View File

@ -593,7 +593,7 @@ int main(int argc, char **argv)
int errors;
int use_subsystem = 0;
int got_host = FALSE;
long now;
unsigned long now;
struct winsize size;
fdlist = NULL;
@ -1016,12 +1016,17 @@ int main(int argc, char **argv)
}
do {
long next, ticks;
unsigned long next, then;
long ticks;
struct timeval tv, *ptv;
if (run_timers(now, &next)) {
ticks = next - GETTICKCOUNT();
if (ticks < 0) ticks = 0; /* just in case */
then = now;
now = GETTICKCOUNT();
if (now - then > next - then)
ticks = 0;
else
ticks = next - now;
tv.tv_sec = ticks / 1000;
tv.tv_usec = ticks % 1000 * 1000;
ptv = &tv;

View File

@ -443,7 +443,7 @@ static int ssh_sftp_do_select(int include_stdin, int no_fds_ok)
fd_set rset, wset, xset;
int i, fdcount, fdsize, *fdlist;
int fd, fdstate, rwx, ret, maxfd;
long now = GETTICKCOUNT();
unsigned long now = GETTICKCOUNT();
fdlist = NULL;
fdcount = fdsize = 0;
@ -489,13 +489,17 @@ static int ssh_sftp_do_select(int include_stdin, int no_fds_ok)
FD_SET_MAX(0, maxfd, rset);
do {
long next, ticks;
unsigned long next, then;
long ticks;
struct timeval tv, *ptv;
if (run_timers(now, &next)) {
ticks = next - GETTICKCOUNT();
if (ticks <= 0)
ticks = 1; /* just in case */
then = now;
now = GETTICKCOUNT();
if (now - then > next - then)
ticks = 0;
else
ticks = next - now;
tv.tv_sec = ticks / 1000;
tv.tv_usec = ticks % 1000 * 1000;
ptv = &tv;