# HG changeset patch
# User Kim Alvefur <zash@zash.se>
# Date 1674395147 -3600
# Node ID 891edd1ebde6cea8951a86248010a7d5ed191c77
# Parent  3dfb87814d655e05f35f208f6854767978a81863
util.startup: Close state on exit to ensure GC finalizers are called

Ensures a last round of garbage collection and that finalizers are
called. Fixes things like proper closing of SQLite3 state.

There are more calls to os.exit() but most of them exit with an error or
in a case where a final GC sweep might not matter as much.

It would be nice if this was the default.

Calling util.statup.exit() everywhere may be sensible, but would be more
involved, requiring imports everywhere.

diff -r 3dfb87814d65 -r 891edd1ebde6 prosodyctl
--- a/prosodyctl	Sun Jan 22 14:42:07 2023 +0100
+++ b/prosodyctl	Sun Jan 22 14:45:47 2023 +0100
@@ -663,11 +663,11 @@
 		local ok, ret = modulemanager.call_module_method(module, "command", arg);
 		if ok then
 			if type(ret) == "number" then
-				os.exit(ret);
+				os.exit(ret, true);
 			elseif type(ret) == "string" then
 				show_message(ret);
 			end
-			os.exit(0); -- :)
+			os.exit(0, true); -- :)
 		else
 			show_message("Failed to execute command: "..error_messages[ret]);
 			os.exit(1); -- :(
@@ -745,10 +745,10 @@
 		end
 
 
-		os.exit(0);
+		os.exit(0, true);
 	end
 
-	os.exit(commands[command](arg));
+	os.exit(commands[command](arg), true);
 end, watchers);
 
 command_runner:run(true);
diff -r 3dfb87814d65 -r 891edd1ebde6 util/startup.lua
--- a/util/startup.lua	Sun Jan 22 14:42:07 2023 +0100
+++ b/util/startup.lua	Sun Jan 22 14:45:47 2023 +0100
@@ -648,7 +648,7 @@
 end
 
 function startup.exit()
-	os.exit(prosody.shutdown_code);
+	os.exit(prosody.shutdown_code, true);
 end
 
 -- prosodyctl only