core: Support time functions.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 20 Oct 2018 12:18:04 +0000 (14:18 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 20 Oct 2018 12:18:04 +0000 (14:18 +0200)
* lib/linux/clock_gettime.c: New file, move from gnu.c.
* lib/linux/gettimeofday.c: New file, move from tcc.c.
* lib/linux/time.c: New file, move from tcc.c.
* lib/linux/libc.c: Include them.
* lib/linux/gnu.c (clock_gettime): Remove.
* lib/linux/tcc.c (time, gettimeofday): Remove.
* include/time.h (CLOCK_PROCESS_CPUTIME_ID): New define.
* src/posix.c (init_time, current_time, gettimeofday_,
seconds_and_nanoseconds_to_long, get_internal_run_time): New function.
* src/mes.c (scm_symbol_internal_time_units_per_second): New symbol.
(main): Call init_time.

include/time.h
lib/linux/clock_gettime.c [new file with mode: 0644]
lib/linux/gettimeofday.c [new file with mode: 0644]
lib/linux/gnu.c
lib/linux/libc.c
lib/linux/tcc.c
lib/linux/time.c [new file with mode: 0644]
scaffold/mini-mes.c
src/mes.c
src/posix.c

index 366eba334c61c9262e6012bee339199845f32d85..e60a49a4ea8b2b0d5324ed7bda462585cdfbbd05 100644 (file)
@@ -54,6 +54,7 @@ struct timespec
 
 #endif // __MES_STRUCT_TIMESPEC
 
+#define CLOCK_PROCESS_CPUTIME_ID 2
 int clock_gettime (clockid_t clk_id, struct timespec *tp);
 struct tm *localtime (time_t const *timep);
 struct tm *gmtime (time_t const *time);
diff --git a/lib/linux/clock_gettime.c b/lib/linux/clock_gettime.c
new file mode 100644 (file)
index 0000000..a23572e
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <time.h>
+
+int
+clock_gettime (clockid_t clk_id, struct timespec *tp)
+{
+  return _sys_call2 (SYS_clock_gettime, (long)clk_id, (long)tp);
+}
diff --git a/lib/linux/gettimeofday.c b/lib/linux/gettimeofday.c
new file mode 100644 (file)
index 0000000..0e42785
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <time.h>
+
+int
+gettimeofday (struct timeval *tv, struct timezone *tz)
+{
+  return _sys_call2 (SYS_gettimeofday, (long)tv, (long)tz);
+}
index ecc2c3dedb0bebce91dc3dfeda42ff9252da115a..7fc5a8be6d623b70ec54995c867cd3c1b6129c3b 100644 (file)
@@ -173,9 +173,3 @@ chdir (char const *file_name)
 {
   return _sys_call1 (SYS_chdir, (long)file_name);
 }
-
-int
-clock_gettime (clockid_t clk_id, struct timespec *tp)
-{
-  return _sys_call2 (SYS_clock_gettime, (long)clk_id, (long)tp);
-}
index 8231a778e180cd855c4b30ba3af85f1644fde846..011d20d677d168f6344e6ecd039892628ec4e96b 100644 (file)
@@ -149,3 +149,7 @@ fsync (int filedes)
 {
   return _sys_call1 (SYS_fsync, (int)filedes);
 }
+
+#include "linux/clock_gettime.c"
+#include "linux/gettimeofday.c"
+#include "linux/time.c"
index f912db8a6bf5f09f6187c0d269af9f7611f3c13f..57bdde58f91ec5847ad0ef91f3bad583824ebe81 100644 (file)
@@ -60,15 +60,3 @@ getcwd (char *buffer, size_t size)
 {
   return _sys_call2 (SYS_getcwd, (long)buffer, (long)size);
 }
-
-time_t
-time (time_t *result)
-{
-  return _sys_call1 (SYS_time, (long)result);
-}
-
-int
-gettimeofday (struct timeval *tv, struct timezone *tz)
-{
-  return _sys_call2 (SYS_gettimeofday, (long)tv, (long)tz);
-}
diff --git a/lib/linux/time.c b/lib/linux/time.c
new file mode 100644 (file)
index 0000000..863a13c
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <time.h>
+
+time_t
+time (time_t *result)
+{
+  return _sys_call1 (SYS_time, (long)result);
+}
index 961b705137898ea80ed140582d4069192b9b4e02..0391b556b0edb440e0543ffb1222efdd4878522d 100644 (file)
@@ -205,6 +205,7 @@ struct scm scm_type_variable = {TSYMBOL, "<cell:variable>",0};
 struct scm scm_type_vector = {TSYMBOL, "<cell:vector>",0};
 struct scm scm_type_broken_heart = {TSYMBOL, "<cell:broken-heart>",0};
 
+struct scm scm_symbol_internal_time_units_per_second = {TSYMBOL, "internal-time-units-per-second",0};
 struct scm scm_symbol_compiler = {TSYMBOL, "%compiler",0};
 struct scm scm_symbol_arch = {TSYMBOL, "%arch",0};
 
index 71cd8afb7cfeef798a4dbd5398578100bcc0437e..44d3fa8c0e5a12121f04516e86430c0a8ab084f7 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -26,7 +26,7 @@
 
 //#define MES_MINI 1
 #if POSIX
-long ARENA_SIZE = 100000000;
+long ARENA_SIZE = 100000000; // 2.3GiB
 #else
 long ARENA_SIZE = 300000; // 32b: 3MiB, 64b: 6 MiB
 #endif
@@ -271,6 +271,7 @@ struct scm scm_type_variable = {TSYMBOL, "<cell:variable>",0};
 struct scm scm_type_vector = {TSYMBOL, "<cell:vector>",0};
 struct scm scm_type_broken_heart = {TSYMBOL, "<cell:broken-heart>",0};
 
+struct scm scm_symbol_internal_time_units_per_second = {TSYMBOL, "internal-time-units-per-second",0};
 struct scm scm_symbol_compiler = {TSYMBOL, "%compiler",0};
 struct scm scm_symbol_arch = {TSYMBOL, "%arch",0};
 
@@ -2546,6 +2547,7 @@ main (int argc, char *argv[])
 
   SCM a = mes_environment (argc, argv);
   a = mes_builtins (a);
+  a = init_time (a);
   m0 = make_initial_module (a);
   g_macros = make_hash_table_ (0);
 
index f6c34484c78d7244089ae5900974caa469c0f053..acd77e485e65be2bc17af49de9a8fdb1870dd924 100644 (file)
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <sys/stat.h>
-#include <sys/wait.h>
 #include <fcntl.h>
 #include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <time.h>
 #include <unistd.h>
 
 int readchar ();
@@ -303,3 +305,50 @@ waitpid_ (SCM pid, SCM options)
   int child = waitpid (VALUE (pid), &status, VALUE (options));
   return cons (MAKE_NUMBER (child), MAKE_NUMBER (status));
 }
+
+#if __x86_64__
+/* Nanoseconds on 64-bit systems with POSIX timers.  */
+#define TIME_UNITS_PER_SECOND 1000000000
+#else
+/* Milliseconds for everyone else.  */
+#define TIME_UNITS_PER_SECOND 1000
+#endif
+
+struct timespec g_start_time;
+SCM
+init_time (SCM a) ///((internal))
+{
+  clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &g_start_time);
+  a = acons (cell_symbol_internal_time_units_per_second, MAKE_NUMBER (TIME_UNITS_PER_SECOND), a);
+}
+
+SCM
+current_time ()
+{
+  return MAKE_NUMBER (time (0));
+}
+
+SCM
+gettimeofday_ () ///((name . "gettimeofday"))
+{
+  struct timeval time;
+  gettimeofday (&time, 0);
+  return cons (MAKE_NUMBER (time.tv_sec), MAKE_NUMBER (time.tv_usec));
+}
+
+long
+seconds_and_nanoseconds_to_long (long s, long ns)
+{
+  return s * TIME_UNITS_PER_SECOND
+    + ns / (1000000000 / TIME_UNITS_PER_SECOND);
+}
+
+SCM
+get_internal_run_time ()
+{
+  struct timespec ts;
+  clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &ts);
+  long time = seconds_and_nanoseconds_to_long (ts.tv_sec - g_start_time.tv_sec,
+                                               ts.tv_nsec - g_start_time.tv_nsec);
+  return MAKE_NUMBER (time);
+}