File

util/gc.lua @ 13546:1a915c2e0fa4 0.12

mod_bookmarks: Suppress error publishing empty legacy bookmarks w/ no PEP node It appears that when: 1) The user has no bookmarks 2 node in PEP 2) The client publishes an empty bookmark set to a legacy bookmarks location 3) mod_bookmarks will attempt to purge items from the non-existent node and log an error about the failure (item-not-found). This new code will suppress an item-not-found error from the purge operation in the empty-bookmarks case, and adds a log message for any other error (this is helpful because the existing log message confusingly says it was an error *publishing* to the node, which isn't always accurate).
author Matthew Wild <mwild1@gmail.com>
date Fri, 08 Nov 2024 10:24:42 +0000
parent 11431:4874b54af344
child 12975:d10957394a3c
line wrap: on
line source

local set = require "util.set";

local known_options = {
	incremental = set.new { "mode", "threshold", "speed", "step_size" };
	generational = set.new { "mode", "minor_threshold", "major_threshold" };
};

if _VERSION ~= "Lua 5.4" then
	known_options.generational = nil;
	known_options.incremental:remove("step_size");
end

local function configure(user, defaults)
	local mode = user.mode or defaults.mode or "incremental";
	if not known_options[mode] then
		return nil, "GC mode not supported on ".._VERSION..": "..mode;
	end

	for k, v in pairs(user) do
		if not known_options[mode]:contains(k) then
			return nil, "Unknown GC parameter: "..k;
		elseif k ~= "mode" and type(v) ~= "number" then
			return nil, "parameter '"..k.."' should be a number";
		end
	end

	if mode == "incremental" then
		if _VERSION == "Lua 5.4" then
			collectgarbage(mode,
				user.threshold or defaults.threshold,
				user.speed or defaults.speed,
				user.step_size or defaults.step_size
			);
		else
			collectgarbage("setpause", user.threshold or defaults.threshold);
			collectgarbage("setstepmul", user.speed or defaults.speed);
		end
	elseif mode == "generational" then
		collectgarbage(mode,
			user.minor_threshold or defaults.minor_threshold,
			user.major_threshold or defaults.major_threshold
		);
	end
	return true;
end

return {
	configure = configure;
};