Grovel timeval and timespec struct definitions rather than hard-coding.
authorJoshua Elsasser <joshua@elsasser.org>
Sun, 12 May 2013 15:36:11 +0000 (08:36 -0700)
committerJoshua Elsasser <joshua@elsasser.org>
Thu, 20 Jun 2013 03:12:38 +0000 (20:12 -0700)
src/code/unix.lisp
tools-for-build/grovel-headers.c

index b7a30c8..0856069 100644 (file)
@@ -203,33 +203,6 @@ corresponds to NAME, or NIL if there is none."
             (values #!-win32 fd #!+win32 (sb!win32::duplicate-and-unwrap-fd fd)
                     (octets-to-string template-buffer)))))))
 \f
-;;;; timebits.h
-
-;; 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
-\f
 ;;;; resourcebits.h
 
 (defconstant rusage_self 0) ; the calling process
@@ -937,23 +910,6 @@ avoiding atexit(3) hooks, etc. Otherwise exit(2) is called."
 \f
 ;;;; time.h
 
-;; 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
-
 ;; used by other time functions
 (define-alien-type nil
     (struct tm
index 9a3e74d..315c6cd 100644 (file)
@@ -39,6 +39,7 @@
   #include <sys/wait.h>
   #include <sys/ioctl.h>
   #include <sys/termios.h>
+  #include <sys/time.h>
   #include <langinfo.h>
   #include <dlfcn.h>
 #endif
@@ -48,6 +49,7 @@
 #include <unistd.h>
 #include <signal.h>
 #include <errno.h>
+#include <time.h>
 
 #ifdef LISP_FEATURE_HPUX
 #include <sys/bsdtty.h> /* for TIOCGPGRP */
 #define DEFTYPE(lispname,cname) { cname foo; \
     printf("(define-alien-type " lispname " (%s %d))\n", (((foo=-1)<0) ? "sb!alien:signed" : "unsigned"), (8 * (sizeof foo))); }
 
+#define DEFSTRUCT(lispname,cname,body) { cname bar; \
+    printf("(define-alien-type nil\n  (struct %s", #lispname); \
+    body; \
+    printf("))\n"); }
+#define DEFSLOT(lispname,cname) \
+    printf("\n          (%s (%s %d))", \
+           #lispname, \
+           (((bar.cname=-1)<0) ? "sb!alien:signed" : "unsigned"), \
+           (8 * (sizeof bar.cname)))
+
 void
 defconstant(char* lisp_name, unsigned long unix_number)
 {
@@ -501,6 +513,15 @@ main(int argc, char *argv[])
 #endif // !WIN32
     printf("\n");
 
+    printf(";;; structures\n");
+    DEFSTRUCT(timeval, struct timeval,
+        DEFSLOT(tv-sec, tv_sec);
+        DEFSLOT(tv-usec, tv_usec));
+    DEFSTRUCT(timespec, struct timespec,
+        DEFSLOT(tv-sec, tv_sec);
+        DEFSLOT(tv-nsec, tv_nsec));
+    printf("\n");
+
 #ifdef LISP_FEATURE_BSD
     printf(";;; sysctl(3) names\n");
     printf("(in-package \"SB!IMPL\")\n");