From: Tobias C. R. <tc...@fr...> - 2010-04-16 21:32:21
|
<rj...@fd...> writes: > Tom Ivar Helbekkmo wrote: >>rj...@fd... writes: >> >>> NetBSD-current now has 64 bit time_t which causes the problem you >>> are seeing. >> >>Does anyone have any thoughts about how complicated it will be to handle >>this? I've started looking at it, but my quick and dirty experimental >>modifications to src/code/unix.lisp just made things worse. :) I'll >>study the code more closely, but pointers and ideas will be appreciated. > > This seems to help: > > Index: unix.lisp > =================================================================== > RCS file: /cvsroot/sbcl/sbcl/src/code/unix.lisp,v > retrieving revision 1.105 > diff -u -r1.105 unix.lisp > --- unix.lisp 19 Nov 2009 15:38:50 -0000 1.105 > +++ unix.lisp 16 Apr 2010 20:28:29 -0000 > @@ -808,7 +808,7 @@ > (tm-zone c-string))) ; Timezone abbreviation. > > (define-alien-routine get-timezone sb!alien:void > - (when sb!alien:long :in) > + (when time-t :in) > (seconds-west sb!alien:int :out) > (daylight-savings-p sb!alien:boolean :out)) By chance, I've just had to look at the alien definition of TIMESPEC which is as follows: ;; the POSIX.4 structure for a time value. This is like a "struct ;; timeval" but has nanoseconds instead of microseconds. #!-(or openbsd netbsd) (define-alien-type nil (struct timespec (tv-sec long) ; seconds (tv-nsec long))) ; nanoseconds ;; Just as with struct timeval, 64-bit OpenBSD has problems with the ;; above definition. tv_sec is declared as time_t instead of long, ;; and time_t is a typedef for int. #!+(or openbsd netbsd) (define-alien-type nil (struct timespec (tv-sec time-t) ; seconds (tv-nsec long))) ; nanoseconds I do not understand why it's `long' in the first definition. My Linux Manpages refer to The structure timespec is used to specify intervals of time with nanosecond precision. It is defined as follows: struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; so shouldn't the second definition work ubiquitously? I'm particularly puzzled because output/stuff-groveled-from-headers.lisp contains (define-alien-type time-t (sb!alien:signed 32)) which, if I'm not blatantly mistaken, is an `int' on Linux x86-32. And even more puzzling is that timedval is defined as follows: ;; A time value that is accurate to the nearest ;; microsecond but also has a range of years. ;; CLH: Note that tv-usec used to be a time-t, but that this seems ;; problematic on Darwin x86-64 (and wrong). Trying suseconds-t. #!-(or win32 openbsd netbsd) (define-alien-type nil (struct timeval (tv-sec time-t) ; seconds (tv-usec suseconds-t))) ; and microseconds ;; The above definition doesn't work on 64-bit OpenBSD platforms. ;; Both tv_sec and tv_usec are declared as long instead of time_t, and ;; time_t is a typedef for int. #!+(or openbsd netbsd) (define-alien-type nil (struct timeval (tv-sec long) ; seconds (tv-usec long))) ; and microseconds #!+win32 (define-alien-type nil (struct timeval (tv-sec time-t) ; seconds (tv-usec long))) ; and microseconds Which, now, is just the other way around comparing to the `timespec' definition above. I'm confused. Can anyone shed light on this issue? -T. |