From 1f826e38b9572fcd37b10caf0f8b53f2d64e34d4 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Wed, 19 Feb 2025 18:13:24 +0100 Subject: [PATCH] improv: call malloc_trim after view and update calls --- src/app/cosmic.rs | 25 ++++++++++++++++++++----- src/malloc.rs | 8 ++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/app/cosmic.rs b/src/app/cosmic.rs index fd876cfd3a4..42a1644518a 100644 --- a/src/app/cosmic.rs +++ b/src/app/cosmic.rs @@ -117,13 +117,18 @@ where &mut self, message: super::Message, ) -> iced::Task> { - match message { + let message = match message { super::Message::App(message) => self.app.update(message), super::Message::Cosmic(message) => self.cosmic_update(message), super::Message::None => iced::Task::none(), #[cfg(feature = "single-instance")] super::Message::DbusActivation(message) => self.app.dbus_activation(message), - } + }; + + #[cfg(target_env = "gnu")] + crate::malloc::trim(0); + + message } #[cfg(not(feature = "multi-window"))] @@ -291,16 +296,26 @@ where return self.app.view_window(id).map(super::Message::App); } - if self.app.core().window.use_template { + let view = if self.app.core().window.use_template { self.app.view_main() } else { self.app.view().map(super::Message::App) - } + }; + + #[cfg(target_env = "gnu")] + crate::malloc::trim(0); + + view } #[cfg(not(feature = "multi-window"))] pub fn view(&self) -> Element> { - self.app.view_main() + let view = self.app.view_main(); + + #[cfg(target_env = "gnu")] + crate::malloc::trim(0); + + view } } diff --git a/src/malloc.rs b/src/malloc.rs index 001f9a166c3..e980ea6fbbc 100644 --- a/src/malloc.rs +++ b/src/malloc.rs @@ -3,9 +3,17 @@ use std::os::raw::c_int; const M_MMAP_THRESHOLD: c_int = -3; extern "C" { + fn malloc_trim(pad: usize); + fn mallopt(param: c_int, value: c_int) -> c_int; } +pub fn trim(pad: usize) { + unsafe { + malloc_trim(pad); + } +} + /// Prevents glibc from hoarding memory via memory fragmentation. pub fn limit_mmap_threshold(threshold: i32) { unsafe {