From 8880ce63d6c1c02c08f1ae4e8023ac99a7533810 Mon Sep 17 00:00:00 2001 From: Kenny Daniel Date: Mon, 13 Apr 2026 00:17:32 -0700 Subject: src/indicator-ng.c: Fix GtkCssProvider memory leak in indicator_ng_set_label indicator_ng_set_label() created a new GtkCssProvider and added it to the label's GtkStyleContext on every call, without removing old ones. gtk_style_context_add_provider() accumulates providers, so each call leaked a provider (~1 KB). Since ayatana-indicator-datetime sends action-state-changed once per second to update the clock label, this leaked ~86,400 providers/day, causing mate-indicator-applet-complete to accumulate ~1.4 GB RSS over 7 days. Fix by storing a single GtkCssProvider in the IndicatorNg struct and reusing it. The provider is created on first use and cleaned up in dispose. Test results (100,000 iterations of set_label): Before fix: +99,692 KB RSS growth After fix: +0 KB RSS growth --- tests/CMakeLists.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'tests/CMakeLists.txt') diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a461dab..3f0ef94 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -195,6 +195,26 @@ add_custom_command( ) add_test("test-desktop-shortcuts-tester" "test-desktop-shortcuts-tester") +# test-css-provider-leak +add_test_executable_by_name(test-css-provider-leak) + +# test-css-provider-leak-tester +add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/test-css-provider-leak-tester" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/test-css-provider-leak" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + VERBATIM + COMMAND + echo "#!/bin/sh" > "${CMAKE_CURRENT_BINARY_DIR}/test-css-provider-leak-tester" + COMMAND + echo ". ${CMAKE_CURRENT_SOURCE_DIR}/run-xvfb.sh" >> "${CMAKE_CURRENT_BINARY_DIR}/test-css-provider-leak-tester" + COMMAND + echo "gtester -k --verbose -o=${CMAKE_CURRENT_BINARY_DIR}/loader-check-results.xml ${CMAKE_CURRENT_BINARY_DIR}/test-css-provider-leak" >> "${CMAKE_CURRENT_BINARY_DIR}/test-css-provider-leak-tester" + COMMAND + chmod +x "${CMAKE_CURRENT_BINARY_DIR}/test-css-provider-leak-tester" +) +add_test("test-css-provider-leak-tester" "test-css-provider-leak-tester") + if (FLAVOUR_GTK3 AND ENABLE_IDO) # test-indicator-ng add_test_executable_by_name(test-indicator-ng) @@ -267,6 +287,7 @@ set (ALL_TESTERS "service-version-tester" "service-version-multiwatch-tester" "test-desktop-shortcuts-tester" + "test-css-provider-leak-tester" "loader-tester" ) -- cgit v1.2.3