mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-06-30 11:02:48 -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:
@ -60,11 +60,6 @@ unsigned long getticks(void); /* based on gettimeofday(2) */
|
||||
#define GETTICKCOUNT getticks
|
||||
#define TICKSPERSEC 1000 /* we choose to use milliseconds */
|
||||
#define CURSORBLINK 450 /* no standard way to set this */
|
||||
/* getticks() works using gettimeofday(), so it's vulnerable to system clock
|
||||
* changes causing chaos. Therefore, we provide a compensation mechanism. */
|
||||
#define TIMING_SYNC
|
||||
#define TIMING_SYNC_ANOW
|
||||
extern long tickcount_offset;
|
||||
|
||||
#define WCHAR wchar_t
|
||||
#define BYTE unsigned char
|
||||
|
@ -13,8 +13,6 @@
|
||||
|
||||
#include "putty.h"
|
||||
|
||||
long tickcount_offset = 0;
|
||||
|
||||
unsigned long getticks(void)
|
||||
{
|
||||
struct timeval tv;
|
||||
@ -24,7 +22,7 @@ unsigned long getticks(void)
|
||||
* because we need a decent number of them to fit into a 32-bit
|
||||
* word so it can be used for keepalives.
|
||||
*/
|
||||
return tv.tv_sec * 1000 + tv.tv_usec / 1000 + tickcount_offset;
|
||||
return tv.tv_sec * TICKSPERSEC + tv.tv_usec / (1000000 / TICKSPERSEC);
|
||||
}
|
||||
|
||||
Filename *filename_from_str(const char *str)
|
||||
|
@ -1027,27 +1027,8 @@ int main(int argc, char **argv)
|
||||
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);
|
||||
|
||||
if (ret < 0) {
|
||||
|
@ -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