diff -r 6ff3f2b33a0f -r 1c5216cd013e UnixOperatingSystem.st --- a/UnixOperatingSystem.st Thu Sep 23 20:24:37 2004 +0200 +++ b/UnixOperatingSystem.st Thu Sep 23 21:26:39 2004 +0200 @@ -10,6 +10,8 @@ hereby transferred. " +'From Smalltalk/X, Version:5.2.4 on 22-09-2004 at 20:27:22' ! + "{ Package: 'stx:libbasic' }" AbstractOperatingSystem subclass:#UnixOperatingSystem @@ -8093,31 +8095,35 @@ on those, the returned value may be rounded towards some internal clock resolution value." - |seconds millis micros error| + |seconds micros error| %{ -#if defined(HAS_GETTIMEOFDAY) - long __seconds = 0; - long __millis = 0; - long __micros = 0; - +#if defined(_POSIX_MONOTONIC_CLOCK) + unsigned long __seconds = 0; + unsigned long __micros = 0; + struct timespec ts; + + if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) + error = @symbol(bad); + + seconds = __MKUINT(ts.tv_sec); + micros = __MKUINT(ts.tv_nsec / 1000); + +#elif defined(HAS_GETTIMEOFDAY) struct timeval tb; gettimeofday(&tb, NULL /* &tzb */); - __seconds = tb.tv_sec; - __micros = tb.tv_usec; - if (__micros >= (1000*1000)) { + if (tb.tv_usec >= (1000*1000)) { error = @symbol(bad); } - seconds = __MKINT(__seconds); - millis = __MKINT(__millis); - micros = __MKINT(__micros); + seconds = __MKUINT(tb.tv_sec); + micros = __MKUINT(tb.tv_usec); #endif %}. seconds notNil ifTrue:[ - ^ (((seconds * 1000) + millis) * 1000) + micros + ^ (seconds * 1000000) + micros ]. error isNil ifTrue:[ ^ self getMillisecondTime * 1000 @@ -8150,11 +8156,20 @@ long t = 0; + +#if defined(_POSIX_MONOTONIC_CLOCK) + struct timespec ts; + + if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) + goto err; + + t = ts.tv_sec*1000 + ts.tv_nsec/1000000; + +#elif defined(_SC_CLK_TCK) /* - * We prefer times here, since it is immune to clock changes! + * We prefer times here, since it is monotonic and immune to clock changes + * but: it has less precision! */ - -#if defined(_SC_CLK_TCK) # include static int millisecondsPerTick; @@ -8168,6 +8183,9 @@ if (ticksPerSecond > 1000) goto err; millisecondsPerTick = 1000 / ticksPerSecond; +/* +printf("milliSecondsPerTick: %d\n", millisecondsPerTick); +*/ } ticks = times(&tb); @@ -12231,7 +12249,7 @@ !UnixOperatingSystem class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/UnixOperatingSystem.st,v 1.215 2004-09-21 17:52:44 stefan Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/UnixOperatingSystem.st,v 1.216 2004-09-23 19:26:39 stefan Exp $' ! ! UnixOperatingSystem initialize!