blob: c26c5a958c0e3cdbffa1bfa638dbf17aa2fda706 [file] [log] [blame]
/*
* Copyright (C) 2021 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "WebKitMemoryPressureSettings.h"
#include <wtf/MemoryPressureHandler.h>
/**
* SECTION: WebKitMemoryPressureSettings
* @Short_description: A boxed type representing the settings for the MemoryPressureHandler
* @Title: WebKitMemoryPressureSettings
* @See_also: #WebKitWebContext, #WebKitWebsiteDataManager
*
* #WebKitMemoryPressureSettings is a boxed type that can be used to provide some custom settings
* to control how the memory pressure situations are handled by the different processes.
*
* The memory pressure system implemented inside the different process will try to keep the memory usage
* under the defined memory limit. In order to do that, it will check the used memory with a user defined
* frequency and decide whether it should try to release memory. The thresholds passed will define how urgent
* is to release that memory.
*
* Take into account that badly defined parameters can greatly reduce the performance of the engine. For
* example, setting memory limit too low with a fast poll interval can cause the process to constantly
* be trying to release memory.
*
* A #WebKitMemoryPressureSettings can be passed to a #WebKitWebContext constructor, and the settings will
* be applied to all the web processes created by that context.
*
* A #WebKitMemoryPressureSettings can be passed to webkit_website_data_manager_set_memory_pressure_settings(),
* and the settings will be applied to all the network processes created after that call by any instance of
* #WebKitWebsiteDataManager.
*
* Since: 2.34
*/
struct _WebKitMemoryPressureSettings {
MemoryPressureHandler::Configuration configuration;
};
G_DEFINE_BOXED_TYPE(WebKitMemoryPressureSettings, webkit_memory_pressure_settings, webkit_memory_pressure_settings_copy, webkit_memory_pressure_settings_free);
/**
* webkit_memory_pressure_settings_new:
*
* Create a new #WebKitMemoryPressureSettings with the default values.
*
* Returns: (transfer full): A new #WebKitMemoryPressureSettings instance filled with the default values.
*
* Since: 2.34
*/
WebKitMemoryPressureSettings* webkit_memory_pressure_settings_new()
{
WebKitMemoryPressureSettings* memoryPressureSettings = static_cast<WebKitMemoryPressureSettings*>(fastMalloc(sizeof(WebKitMemoryPressureSettings)));
new (memoryPressureSettings) WebKitMemoryPressureSettings;
return memoryPressureSettings;
}
/**
* webkit_memory_pressure_settings_copy:
* @settings: a #WebKitMemoryPressureSettings
*
* Make a copy of @settings.
*
* Returns: (transfer full): A copy of of the passed #WebKitMemoryPressureSettings.
*
* Since: 2.34
*/
WebKitMemoryPressureSettings* webkit_memory_pressure_settings_copy(WebKitMemoryPressureSettings* settings)
{
g_return_val_if_fail(settings, nullptr);
WebKitMemoryPressureSettings* copy = static_cast<WebKitMemoryPressureSettings*>(fastZeroedMalloc(sizeof(WebKitMemoryPressureSettings)));
copy->configuration = settings->configuration;
return copy;
}
/**
* webkit_memory_pressure_settings_free:
* @settings: a #WebKitMemoryPressureSettings
*
* Free the #WebKitMemoryPressureSettings.
*
* Since: 2.34
*/
void webkit_memory_pressure_settings_free(WebKitMemoryPressureSettings* settings)
{
g_return_if_fail(settings);
fastFree(settings);
}
/**
* webkit_memory_pressure_settings_set_memory_limit:
* @settings: a #WebKitMemoryPressureSettings
* @memory_limit: amount of memory (in MB) that the process is allowed to use.
*
* Sets @memory_limit the memory limit value to @settings.
*
* The default value is the system's RAM size with a maximum of 3GB.
*
* Since: 2.34
*/
void webkit_memory_pressure_settings_set_memory_limit(WebKitMemoryPressureSettings* settings, guint memoryLimit)
{
g_return_if_fail(settings);
g_return_if_fail(memoryLimit);
settings->configuration.baseThreshold = memoryLimit * MB;
}
/**
* webkit_memory_pressure_settings_get_memory_limit:
* @settings: a #WebKitMemoryPressureSettings
*
* Returns: the value in MB of the memory limit inside @settings.
*
* Since: 2.34
*/
guint webkit_memory_pressure_settings_get_memory_limit(WebKitMemoryPressureSettings* settings)
{
g_return_val_if_fail(settings, 0);
return settings->configuration.baseThreshold / MB;
}
/**
* webkit_memory_pressure_settings_set_conservative_threshold:
* @settings: a #WebKitMemoryPressureSettings
* @value: fraction of the memory limit where the conservative policy starts working.
*
* Sets @value as the fraction of the defined memory limit where the conservative
* policy starts working. This policy will try to reduce the memory footprint by
* releasing non critical memory.
*
* The threshold must be bigger than 0 and smaller than 1, and it must be smaller
* than the strict threshold defined in @settings. The default value is 0.33.
*
* Since: 2.34
*/
void webkit_memory_pressure_settings_set_conservative_threshold(WebKitMemoryPressureSettings* settings, gdouble value)
{
g_return_if_fail(settings);
g_return_if_fail(value > 0 && value < 1);
g_return_if_fail(value < settings->configuration.strictThresholdFraction);
settings->configuration.conservativeThresholdFraction = value;
}
/**
* webkit_memory_pressure_settings_get_conservative_threshold:
* @settings: a #WebKitMemoryPressureSettings
*
* Returns: the value of the the conservative threshold inside @settings.
*
* Since: 2.34
*/
gdouble webkit_memory_pressure_settings_get_conservative_threshold(WebKitMemoryPressureSettings* settings)
{
g_return_val_if_fail(settings, 0);
return settings->configuration.conservativeThresholdFraction;
}
/**
* webkit_memory_pressure_settings_set_strict_threshold:
* @settings: a #WebKitMemoryPressureSettings
* @value: fraction of the memory limit where the strict policy starts working.
*
* Sets @value as the fraction of the defined memory limit where the strict
* policy starts working. This policy will try to reduce the memory footprint by
* releasing critical memory.
*
* The threshold must be bigger than 0 and smaller than 1. Also, it must be bigger
* than the conservative threshold defined in @settings, and smaller than the kill
* threshold if the latter is not 0. The default value is 0.5.
*
* Since: 2.34
*/
void webkit_memory_pressure_settings_set_strict_threshold(WebKitMemoryPressureSettings* settings, gdouble value)
{
g_return_if_fail(settings);
g_return_if_fail(value > 0 && value < 1);
g_return_if_fail(value > settings->configuration.conservativeThresholdFraction);
g_return_if_fail(!settings->configuration.killThresholdFraction || value < settings->configuration.killThresholdFraction);
settings->configuration.strictThresholdFraction = value;
}
/**
* webkit_memory_pressure_settings_get_strict_threshold:
* @settings: a #WebKitMemoryPressureSettings
*
* Returns: the value of the the strict threshold inside @settings.
*
* Since: 2.34
*/
gdouble webkit_memory_pressure_settings_get_strict_threshold(WebKitMemoryPressureSettings* settings)
{
g_return_val_if_fail(settings, 0);
return settings->configuration.strictThresholdFraction;
}
/**
* webkit_memory_pressure_settings_set_kill_threshold:
* @settings: a #WebKitMemoryPressureSettings
* @value: fraction of the memory limit where the process will be killed because
* of excessive memory usage.
*
* Sets @value as the fraction of the defined memory limit where the process will be
* killed.
*
* The threshold must be a value bigger or equal to 0. A value of 0 means that the process
* is never killed. If the threshold is not 0, then it must be bigger than the strict threshold
* defined in @settings. The threshold can also have values bigger than 1. The default value is 0.
*
* Since: 2.34
*/
void webkit_memory_pressure_settings_set_kill_threshold(WebKitMemoryPressureSettings* settings, gdouble value)
{
g_return_if_fail(settings);
g_return_if_fail(value >= 0);
g_return_if_fail(!value || value > settings->configuration.strictThresholdFraction);
settings->configuration.killThresholdFraction = value ? std::make_optional(value) : std::nullopt;
}
/**
* webkit_memory_pressure_settings_get_kill_threshold:
* @settings: a #WebKitMemoryPressureSettings
*
* Returns: the value of the the kill threshold inside @settings.
*
* Since: 2.34
*/
gdouble webkit_memory_pressure_settings_get_kill_threshold(WebKitMemoryPressureSettings* settings)
{
g_return_val_if_fail(settings, 0);
return settings->configuration.killThresholdFraction.value_or(0);
}
/**
* webkit_memory_pressure_settings_set_poll_interval:
* @settings: a #WebKitMemoryPressureSettings
* @value: period (in seconds) between memory usage measurements.
*
* Sets @value as the poll interval used by @settings.
*
* The poll interval value must be bigger than 0. The default value is 30 seconds.
*
* Since: 2.34
*/
void webkit_memory_pressure_settings_set_poll_interval(WebKitMemoryPressureSettings* settings, gdouble value)
{
g_return_if_fail(settings);
g_return_if_fail(value > 0);
settings->configuration.pollInterval = Seconds(value);
}
/**
* webkit_memory_pressure_settings_get_poll_interval:
* @settings: a #WebKitMemoryPressureSettings
*
* Returns: the value in seconds of the the poll interval inside @settings.
*
* Since: 2.34
*/
gdouble webkit_memory_pressure_settings_get_poll_interval(WebKitMemoryPressureSettings* settings)
{
g_return_val_if_fail(settings, 0);
return settings->configuration.pollInterval.seconds();
}
const MemoryPressureHandler::Configuration& webkitMemoryPressureSettingsGetMemoryPressureHandlerConfiguration(WebKitMemoryPressureSettings* settings)
{
return settings->configuration;
}