diff util-src/time.c @ 14080:973609bad40a

util.time: Import sleep from luasocket We might not want to use the full LuaSocket for such a tiny function which will never change. This drops win32 support but that should be fine.
author Link Mauve <linkmauve@linkmauve.fr>
date Fri, 30 Jan 2026 14:08:53 +0100
parents a187600ec7d6
children
line wrap: on
line diff
--- a/util-src/time.c	Fri Jan 30 14:44:04 2026 +0100
+++ b/util-src/time.c	Fri Jan 30 14:08:53 2026 +0100
@@ -4,6 +4,7 @@
 
 #include <time.h>
 #include <lua.h>
+#include <lauxlib.h>
 
 static lua_Number tv2number(struct timespec *tv) {
 	return tv->tv_sec + tv->tv_nsec * 1e-9;
@@ -23,6 +24,23 @@
 	return 1;
 }
 
+/* This function has been imported from luasocket */
+static int lc_sleep(lua_State *L) {
+	double n = luaL_checknumber(L, 1);
+	struct timespec t, r;
+	if (n < 0.0) n = 0.0;
+	if (n > INT_MAX) n = INT_MAX;
+	t.tv_sec = (int) n;
+	n -= t.tv_sec;
+	t.tv_nsec = (int) (n * 1000000000);
+	if (t.tv_nsec >= 1000000000) t.tv_nsec = 999999999;
+	while (nanosleep(&t, &r) != 0) {
+		t.tv_sec = r.tv_sec;
+		t.tv_nsec = r.tv_nsec;
+	}
+	return 0;
+}
+
 int luaopen_prosody_util_time(lua_State *L) {
 	lua_createtable(L, 0, 2);
 	{
@@ -30,6 +48,8 @@
 		lua_setfield(L, -2, "now");
 		lua_pushcfunction(L, lc_time_monotonic);
 		lua_setfield(L, -2, "monotonic");
+		lua_pushcfunction(L, lc_sleep);
+		lua_setfield(L, -2, "sleep");
 	}
 	return 1;
 }