changeset 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 0ea2848d7771
children 7c9fd032c788
files prosody prosodyctl teal-src/prosody/util/time.d.tl util-src/time.c
diffstat 4 files changed, 26 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/prosody	Fri Jan 30 14:44:04 2026 +0100
+++ b/prosody	Fri Jan 30 14:08:53 2026 +0100
@@ -85,7 +85,7 @@
 		prosody.events.fire_event("very-bad-error", {error = err, traceback = traceback});
 	end
 
-	local sleep = require"socket".sleep;
+	local sleep = require "prosody.util.time".sleep;
 	local server = require "prosody.net.server";
 
 	while select(2, xpcall(server.loop, catch_uncaught_error)) ~= "quitting" do
--- a/prosodyctl	Fri Jan 30 14:44:04 2026 +0100
+++ b/prosodyctl	Fri Jan 30 14:08:53 2026 +0100
@@ -65,13 +65,13 @@
 local configmanager = require "prosody.core.configmanager";
 local modulemanager = require "prosody.core.modulemanager"
 local prosodyctl = require "prosody.util.prosodyctl"
-local socket = require "socket"
 local dependencies = require "prosody.util.dependencies";
 local lfs = dependencies.softreq "lfs";
 
 -----------------------
 
 local parse_args = require "prosody.util.argparse".parse;
+local sleep = require "prosody.util.time".sleep;
 local human_io = require "prosody.util.human.io";
 
 local show_message, show_warning = prosodyctl.show_message, prosodyctl.show_warning;
@@ -265,7 +265,7 @@
 					show_message("Prosody is still not running. Please give it some time or check your log files for errors.");
 					return 2;
 				end
-				socket.sleep(0.5);
+				sleep(0.5);
 				i = i + 1;
 			end
 			show_message("Started");
@@ -346,7 +346,7 @@
 				show_message("Prosody is still running. Please give it some time or check your log files for errors.");
 				return 2;
 			end
-			socket.sleep(0.5);
+			sleep(0.5);
 			i = i + 1;
 		end
 		show_message("Stopped");
@@ -456,6 +456,7 @@
 		-- These diverge from the module._VERSION convention
 		readline = "Version";
 	}
+	local socket = dependencies.softreq"socket";
 	local lunbound = dependencies.softreq"lunbound";
 	local lxp = dependencies.softreq"lxp";
 	local hashes = dependencies.softreq"prosody.util.hashes";
--- a/teal-src/prosody/util/time.d.tl	Fri Jan 30 14:44:04 2026 +0100
+++ b/teal-src/prosody/util/time.d.tl	Fri Jan 30 14:08:53 2026 +0100
@@ -2,5 +2,6 @@
 local record lib
 	now : function () : number
 	monotonic : function () : number
+	sleep : function (number)
 end
 return lib
--- 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;
 }