mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-18 19:41:01 -05:00
Patch from Robert de Bath to substantially simplify timing.c.
The previous platform-dependent ifdefs, switching between a system which tried to cope with spurious callbacks (which I'd observed on Windows) and one which tried to cope with system clock jumps (which can happen on Unix, if you use gettimeofday) have been completely removed, and replaced with a much simpler approach which just copes with system clock jumps by triggering any timers immediately. None of the resulting effects should be catastrophic (the worst thing might be the waste of CPU in a spurious rekey, but as long as the system clock isn't jumping around _all_ the time that's hardly critical) and in any case the Unix port has had a long-standing oddity involving occasional lockups if pterm or PuTTY runs for too long, which hopefully this should replace with a much less bad failure mode. And the code is much simpler, which is not to be sneezed at. [originally from svn r9528]
This commit is contained in:
@ -505,27 +505,8 @@ static int ssh_sftp_do_select(int include_stdin, int no_fds_ok)
|
||||
ret = select(maxfd, &rset, &wset, &xset, ptv);
|
||||
if (ret == 0)
|
||||
now = next;
|
||||
else {
|
||||
long newnow = GETTICKCOUNT();
|
||||
/*
|
||||
* Check to see whether the system clock has
|
||||
* changed massively during the select.
|
||||
*/
|
||||
if (newnow - now < 0 || newnow - now > next - now) {
|
||||
/*
|
||||
* If so, look at the elapsed time in the
|
||||
* select and use it to compute a new
|
||||
* tickcount_offset.
|
||||
*/
|
||||
long othernow = now + tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
||||
/* So we'd like GETTICKCOUNT to have returned othernow,
|
||||
* but instead it return newnow. Hence ... */
|
||||
tickcount_offset += othernow - newnow;
|
||||
now = othernow;
|
||||
} else {
|
||||
now = newnow;
|
||||
}
|
||||
}
|
||||
else
|
||||
now = GETTICKCOUNT();
|
||||
} while (ret < 0 && errno != EINTR);
|
||||
} while (ret == 0);
|
||||
|
||||
|
Reference in New Issue
Block a user