aboutsummaryrefslogtreecommitdiffstats
path: root/test/data
diff options
context:
space:
mode:
authorPhilipp Stephani2019-04-18 17:42:45 +0200
committerPhilipp Stephani2019-04-24 11:33:52 +0200
commitbffceab6339fb4042588b893ef754c6264379e75 (patch)
tree03747b5cb5275a24418aa9fb421977eb6c0ee063 /test/data
parent5ae407aad4f2564fae7ddce077eb01aa8efa37fb (diff)
downloademacs-bffceab6339fb4042588b893ef754c6264379e75.tar.gz
emacs-bffceab6339fb4042588b893ef754c6264379e75.zip
Add conversions to and from struct timespec to module interface.
Time values are a fundamental data type, and such conversions are hard to implement within modules because of the various forms of time values in Emacs Lisp. Adding dedicated conversion functions can significantly simplify module code dealing with times. This approach uses nanosecond precision. While Emacs in theory has support for higher-precision time values, in practice most languages and standards, such as POSIX, C, Java, and Go, have settled on nanosecond-precision integers to represent time. * src/emacs-module.h.in: Add header for struct timespec. * src/module-env-27.h: Add module functions for time conversion. * src/emacs-module.c (module_extract_time, module_make_time): New functions. (initialize_environment): Use them. * test/data/emacs-module/mod-test.c (Fmod_test_add_nanosecond): New test function. (emacs_module_init): Define it. * test/src/emacs-module-tests.el (mod-test-add-nanosecond/valid) (mod-test-add-nanosecond/nil, mod-test-add-nanosecond/invalid): New unit tests. * doc/lispref/internals.texi (Module Values): Document time conversion functions.
Diffstat (limited to 'test/data')
-rw-r--r--test/data/emacs-module/mod-test.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/test/data/emacs-module/mod-test.c b/test/data/emacs-module/mod-test.c
index a39e41afee6..dbdbfecfe6a 100644
--- a/test/data/emacs-module/mod-test.c
+++ b/test/data/emacs-module/mod-test.c
@@ -366,6 +366,18 @@ Fmod_test_sleep_until (emacs_env *env, ptrdiff_t nargs, emacs_value *args,
366 return env->intern (env, "finished"); 366 return env->intern (env, "finished");
367} 367}
368 368
369static emacs_value
370Fmod_test_add_nanosecond (emacs_env *env, ptrdiff_t nargs, emacs_value *args,
371 void *data)
372{
373 assert (nargs == 1);
374 struct timespec time = env->extract_time (env, args[0]);
375 assert (time.tv_nsec >= 0);
376 assert (time.tv_nsec < 2000000000); /* possible leap second */
377 time.tv_nsec++;
378 return env->make_time (env, time);
379}
380
369/* Lisp utilities for easier readability (simple wrappers). */ 381/* Lisp utilities for easier readability (simple wrappers). */
370 382
371/* Provide FEATURE to Emacs. */ 383/* Provide FEATURE to Emacs. */
@@ -434,6 +446,7 @@ emacs_module_init (struct emacs_runtime *ert)
434 DEFUN ("mod-test-invalid-finalizer", Fmod_test_invalid_finalizer, 0, 0, 446 DEFUN ("mod-test-invalid-finalizer", Fmod_test_invalid_finalizer, 0, 0,
435 NULL, NULL); 447 NULL, NULL);
436 DEFUN ("mod-test-sleep-until", Fmod_test_sleep_until, 2, 2, NULL, NULL); 448 DEFUN ("mod-test-sleep-until", Fmod_test_sleep_until, 2, 2, NULL, NULL);
449 DEFUN ("mod-test-add-nanosecond", Fmod_test_add_nanosecond, 1, 1, NULL, NULL);
437 450
438#undef DEFUN 451#undef DEFUN
439 452