]> Zhao Yanbai Git Server - minix.git/commitdiff
complete, tick-resolution gettimeofday() implementation
authorBen Gras <ben@minix3.org>
Wed, 6 Jul 2005 07:08:36 +0000 (07:08 +0000)
committerBen Gras <ben@minix3.org>
Wed, 6 Jul 2005 07:08:36 +0000 (07:08 +0000)
include/minix/callnr.h
lib/posix/gettimeofday.c
man/man2/gettimeofday.2 [new file with mode: 0644]
servers/fs/table.c
servers/pm/proto.h
servers/pm/table.c
servers/pm/time.c

index bd75731d79e52928fa320c9b33bbf0c5a9b405e9..e3b10669a96e130b4b04e0bf512f8c39ec05a4dc 100755 (executable)
@@ -1,4 +1,4 @@
-#define NCALLS           90    /* number of system calls allowed */
+#define NCALLS           91    /* number of system calls allowed */
 
 #define EXIT              1 
 #define FORK              2 
@@ -78,3 +78,4 @@
 #define FSYNC             87   /* to FS */
 #define GETPRIORITY       88   /* to PM */
 #define SETPRIORITY       89   /* to PM */
+#define GETTIMEOFDAY      90   /* to PM */
index 6ec5636048c0daef7876e4b5dde158165459b14c..f05ab5c860f5b86d29e55ec3b3cdbcbef9290362 100644 (file)
@@ -3,16 +3,19 @@ gettimeofday.c
 */
 
 #include <sys/time.h>
+#include <lib.h>
 #include <time.h>
 
 int gettimeofday(struct timeval *_RESTRICT tp, void *_RESTRICT tzp)
 {
-       if (time(&tp->tv_sec) == (time_t)-1)
-               return -1;
-       tp->tv_usec= 0;
+  message m;
 
-       /* tzp has to be a nul pointer according to the standard. Otherwise
-        * behavior is undefined. We can just ignore tzp.
-        */
-       return 0;
+  if (_syscall(MM, GETTIMEOFDAY, &m) < 0)
+       return -1;
+
+  tp->tv_sec = m.m2_l1;
+  tp->tv_usec = m.m2_l2;
+
+  return 0;
 }
+
diff --git a/man/man2/gettimeofday.2 b/man/man2/gettimeofday.2
new file mode 100644 (file)
index 0000000..0100fb8
--- /dev/null
@@ -0,0 +1,22 @@
+.TH GETTIMEOFDAY 2 "July 6, 2005"
+.UC 4
+.SH NAME
+gettimeofday \- get date and time
+.SH SYNOPSIS
+.ft B
+.nf
+#include <sys/time.h>
+
+int gettimeofday(struct timeval *tp, struct timezone *tzp)
+.fi
+.ft R
+.SH DESCRIPTION
+.B Gettimeofday
+returns the time in seconds and microseconds since epoch in GMT
+(midnight, january 1st, 1970). The timezone argument tzp is expected
+to be NULL.
+.SH RETURNS
+0 on success, -1 on error. If -1 is returned, errno is set to indicate
+the error.
+.SH "SEE ALSO
+.BR ctime (3).
index cc8bbbf4e5759e8c996699900b9268fe615f55d3..0a2909f4f943c3f2a49ce7d692932a11af7ea41f 100644 (file)
@@ -107,6 +107,7 @@ PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = {
        do_fsync,       /* 87 = fsync */
        no_sys,         /* 88 = getpriority */
        no_sys,         /* 89 = setpriority */
+       no_sys,         /* 90 = gettimeofday */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index 108992b4318e1f1b5b62e2284915b7d0bf48415f..949a018280341a0b84159ad125e93ca706117fb1 100644 (file)
@@ -86,6 +86,7 @@ _PROTOTYPE( void check_pending, (struct mproc *rmp)                   );
 _PROTOTYPE( int do_stime, (void)                                       );
 _PROTOTYPE( int do_time, (void)                                                );
 _PROTOTYPE( int do_times, (void)                                       );
+_PROTOTYPE( int do_gettimeofday, (void)                                        );
 
 /* trace.c */
 _PROTOTYPE( int do_trace, (void)                                       );
index 1768dd41417a94bcfea93c52f5c95963e53952ea..4f0ee23efdb57dcb73f7aa52d96b4c16ef5cbfae 100644 (file)
@@ -106,6 +106,7 @@ _PROTOTYPE (int (*call_vec[NCALLS]), (void) ) = {
        no_sys,         /* 87 = fsync */
        do_getsetpriority,      /* 88 = getpriority */
        do_getsetpriority,      /* 89 = setpriority */
+       do_gettimeofday,        /* 90 = gettimeofday */
 };
 /* This should not fail with "array size is negative": */
 extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];
index 9427de0f968a4767affd15668c478db34144b209..ae35c9dbbe9b1f3e6f2caf93ba7fe16e956231c5 100644 (file)
@@ -84,3 +84,20 @@ PUBLIC int do_times()
   return(OK);
 }
 
+/*===========================================================================*
+ *                             do_gettimeofday                              *
+ *===========================================================================*/
+PUBLIC int do_gettimeofday(void)
+{
+  clock_t uptime;
+  int s;
+
+  if ( (s=sys_getuptime(&uptime)) != OK) 
+       panic(__FILE__,"do_gettimeofday couldn't get uptime", s);
+
+  mp->mp_reply.m2_l1 = boottime + uptime/HZ;
+  mp->mp_reply.m2_l2 = (uptime%HZ)*1000000/HZ;
+
+  return(OK);
+}
+