From ba33907da89c5fb1e3e72415b56486fec157a940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Gon=C3=A7alves?= Date: Fri, 6 Jun 2025 09:33:23 -0300 Subject: [PATCH 1/4] Changes the memory allocator to use jemalloc to address memory leak issues. --- debian/control | 1 + meson.build | 4 +++- src/meson.build | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index b250e40d1..ca5727213 100644 --- a/debian/control +++ b/debian/control @@ -88,6 +88,7 @@ Depends: gsettings-desktop-schemas, gvfs (>= 1.3.2), libglib2.0-data, + libjemalloc2, libnemo-extension1 (= ${binary:Version}), nemo-data (= ${source:Version}), shared-mime-info (>= 0.50), diff --git a/meson.build b/meson.build index 5eee1ed34..c66dda205 100644 --- a/meson.build +++ b/meson.build @@ -82,6 +82,7 @@ cinnamon= dependency('cinnamon-desktop', version: '>=4.8.0') gail = dependency('gail-3.0') x11 = dependency('x11') xapp = dependency('xapp', version: '>=2.0.0') +jemalloc = dependency('jemalloc', required: true) # Facultative dependencies @@ -171,7 +172,8 @@ nemo_definitions = [ '-DNEMO_DATADIR="@0@"'.format(nemoDataPath), '-DNEMO_EXTENSIONDIR="@0@"'.format(nemoExtensionPath), '-DLIBEXECDIR="@0@"'.format(libExecPath), - '-DG_LOG_DOMAIN="Nemo"' + '-DG_LOG_DOMAIN="Nemo"', + '-DUSE_JEMALLOC' ] po_subdir = join_paths(meson.project_source_root(), 'po') diff --git a/src/meson.build b/src/meson.build index 6f6cd55d6..3648b23e5 100644 --- a/src/meson.build +++ b/src/meson.build @@ -103,7 +103,7 @@ if enableEmptyView endif nemo_deps = [ cinnamon, gail, glib, gtk, math, - egg, nemo_extension, nemo_private, xapp ] + egg, nemo_extension, nemo_private, xapp, jemalloc ] if exempi_enabled nemo_deps += exempi @@ -118,6 +118,7 @@ nemo = executable('nemo', include_directories: [ rootInclude ], c_args: nemo_definitions, dependencies: nemo_deps, + link_args: ['-Wl,--no-as-needed', '-ljemalloc', '-Wl,--as-needed'], install: true ) @@ -126,6 +127,7 @@ nemoDesktop = executable('nemo-desktop', include_directories: [ rootInclude], c_args: nemo_definitions, dependencies: nemo_deps, + link_args: ['-Wl,--no-as-needed', '-ljemalloc', '-Wl,--as-needed'], install: true ) From 7eaf1a8276f8c74c81db749eda37f603c6010565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Gon=C3=A7alves?= Date: Fri, 6 Jun 2025 19:11:45 -0300 Subject: [PATCH 2/4] Add libjemalloc2-dev as Build-Depends --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index ca5727213..f37294bee 100644 --- a/debian/control +++ b/debian/control @@ -21,6 +21,7 @@ Build-Depends: libgsf-1-dev, libgtk-3-dev (>= 3.10), libgtk-3-doc, + libjemalloc2-dev, libjson-glib-dev (>= 1.6), libpango1.0-dev, libx11-dev, From df47648469448ba41342ad90ffdb6b92a1f4fd19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Gon=C3=A7alves?= Date: Thu, 12 Jun 2025 10:27:54 -0300 Subject: [PATCH 3/4] Turn jemalloc optional --- meson.build | 15 +++++++++++++-- meson_options.txt | 2 ++ src/meson.build | 25 ++++++++++++++++++++++--- src/nemo-main.c | 14 ++++++++++++++ 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/meson.build b/meson.build index c66dda205..cdc5b4e29 100644 --- a/meson.build +++ b/meson.build @@ -82,7 +82,15 @@ cinnamon= dependency('cinnamon-desktop', version: '>=4.8.0') gail = dependency('gail-3.0') x11 = dependency('x11') xapp = dependency('xapp', version: '>=2.0.0') -jemalloc = dependency('jemalloc', required: true) + +jemalloc_opt = get_option('jemalloc') +if jemalloc_opt + jemalloc = dependency('jemalloc', required: false) + use_jemalloc = jemalloc.found() +else + jemalloc = dependency('', required: false) + use_jemalloc = false +endif # Facultative dependencies @@ -173,8 +181,10 @@ nemo_definitions = [ '-DNEMO_EXTENSIONDIR="@0@"'.format(nemoExtensionPath), '-DLIBEXECDIR="@0@"'.format(libExecPath), '-DG_LOG_DOMAIN="Nemo"', - '-DUSE_JEMALLOC' ] +if use_jemalloc + nemo_definitions += '-DUSE_JEMALLOC' +endif po_subdir = join_paths(meson.project_source_root(), 'po') @@ -203,6 +213,7 @@ message('\n'.join(['', ' exempi support: @0@'.format(exempi_enabled), ' Tracker support: @0@'.format(tracker_enabled), ' Wayland support: @0@'.format(cc.has_header('gdk/gdkwayland.h', dependencies: gtk)), +' Jemalloc support: @0@'.format(use_jemalloc), '', ' nemo-extension documentation: @0@'.format(gtkdoc_enabled), ' nemo-extension introspection: @0@'.format(true), diff --git a/meson_options.txt b/meson_options.txt index 68814d64d..d2d7fbe91 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -12,3 +12,5 @@ option('empty_view', type : 'boolean', value : false, description: 'Enable empty view') option('tracker',type : 'combo', choices : ['true', 'false', 'auto'], value : 'false', description: 'Tracker support') +option('jemalloc', type : 'boolean', value : false, + description: 'Use jemalloc memory allocator if available') diff --git a/src/meson.build b/src/meson.build index 3648b23e5..253ce615e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -103,7 +103,10 @@ if enableEmptyView endif nemo_deps = [ cinnamon, gail, glib, gtk, math, - egg, nemo_extension, nemo_private, xapp, jemalloc ] + egg, nemo_extension, nemo_private, xapp ] +if use_jemalloc + nemo_deps += jemalloc +endif if exempi_enabled nemo_deps += exempi @@ -113,29 +116,45 @@ if libexif_enabled nemo_deps += libexif endif + +nemo_link_args = [] +if use_jemalloc + nemo_link_args += ['-Wl,--no-as-needed', '-ljemalloc', '-Wl,--as-needed'] +endif nemo = executable('nemo', nemoCommon_sources + nemoWindow_sources, include_directories: [ rootInclude ], c_args: nemo_definitions, dependencies: nemo_deps, - link_args: ['-Wl,--no-as-needed', '-ljemalloc', '-Wl,--as-needed'], + link_args: nemo_link_args, install: true ) + +nemoDesktop_link_args = [] +if use_jemalloc + nemoDesktop_link_args += ['-Wl,--no-as-needed', '-ljemalloc', '-Wl,--as-needed'] +endif nemoDesktop = executable('nemo-desktop', nemoCommon_sources + nemoDesktop_sources, include_directories: [ rootInclude], c_args: nemo_definitions, dependencies: nemo_deps, - link_args: ['-Wl,--no-as-needed', '-ljemalloc', '-Wl,--as-needed'], + link_args: nemoDesktop_link_args, install: true ) + +nemo_autorun_software_link_args = [] +if use_jemalloc + nemo_autorun_software_link_args += ['-Wl,--no-as-needed', '-ljemalloc', '-Wl,--as-needed'] +endif nemo_autorun_software = executable('nemo-autorun-software', [ 'nemo-autorun-software.c' ], include_directories: [ rootInclude, ], c_args: nemo_definitions, dependencies: nemo_deps, + link_args: nemo_autorun_software_link_args, install: true ) diff --git a/src/nemo-main.c b/src/nemo-main.c index 39291eab9..9129ec089 100644 --- a/src/nemo-main.c +++ b/src/nemo-main.c @@ -53,6 +53,20 @@ #include #endif +#ifdef USE_JEMALLOC + static void + nemo_jemalloc_configure(void) __attribute__((constructor)); + + static void + nemo_jemalloc_configure(void) + { + if (getenv("MALLOC_CONF") != NULL) + return; + const char *conf = "narenas:1,metadata_thp:auto,percpu_arena:phycpu"; + setenv("MALLOC_CONF", conf, 0); + } +#endif + int main (int argc, char *argv[]) { From 6ec1952762ee6a44c71581f0096d25b70eb05607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Gon=C3=A7alves?= Date: Thu, 12 Jun 2025 10:36:27 -0300 Subject: [PATCH 4/4] Now jemalloc is automatically activated by default if found on the system and at compilation time you can force it to be activated or not. --- meson.build | 5 ++++- meson_options.txt | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index cdc5b4e29..4c4d042e8 100644 --- a/meson.build +++ b/meson.build @@ -84,7 +84,10 @@ x11 = dependency('x11') xapp = dependency('xapp', version: '>=2.0.0') jemalloc_opt = get_option('jemalloc') -if jemalloc_opt +if jemalloc_opt == 'true' + jemalloc = dependency('jemalloc', required: true) + use_jemalloc = true +elif jemalloc_opt == 'auto' jemalloc = dependency('jemalloc', required: false) use_jemalloc = jemalloc.found() else diff --git a/meson_options.txt b/meson_options.txt index d2d7fbe91..84fd7e41f 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -12,5 +12,5 @@ option('empty_view', type : 'boolean', value : false, description: 'Enable empty view') option('tracker',type : 'combo', choices : ['true', 'false', 'auto'], value : 'false', description: 'Tracker support') -option('jemalloc', type : 'boolean', value : false, - description: 'Use jemalloc memory allocator if available') +option('jemalloc', type : 'combo', choices : ['true', 'false', 'auto'], value : 'auto', + description: 'Use jemalloc memory allocator if available (auto = enable if found)')