forked from quickshell/quickshell
		
	build: link jemalloc by default to reduce heap fragmentation
The QML engine and the quickshell reloader both cause large amounts of heap fragmentation that stacks up over time, leading to a perceived memory leak. Jemalloc is able to handle the fragmentation much better, leading to lower user facing memory usage.
This commit is contained in:
		
							parent
							
								
									d56c07ceb3
								
							
						
					
					
						commit
						a8506edbb9
					
				
					 3 changed files with 24 additions and 7 deletions
				
			
		| 
						 | 
					@ -9,6 +9,7 @@ option(BUILD_TESTING "Build tests" OFF)
 | 
				
			||||||
option(ASAN "Enable ASAN" OFF)
 | 
					option(ASAN "Enable ASAN" OFF)
 | 
				
			||||||
option(FRAME_POINTERS "Always keep frame pointers" ${ASAN})
 | 
					option(FRAME_POINTERS "Always keep frame pointers" ${ASAN})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					option(USE_JEMALLOC "Use jemalloc over the system malloc implementation" ON)
 | 
				
			||||||
option(NVIDIA_COMPAT "Workarounds for nvidia gpus" OFF)
 | 
					option(NVIDIA_COMPAT "Workarounds for nvidia gpus" OFF)
 | 
				
			||||||
option(SOCKETS "Enable unix socket support" ON)
 | 
					option(SOCKETS "Enable unix socket support" ON)
 | 
				
			||||||
option(WAYLAND "Enable wayland support" ON)
 | 
					option(WAYLAND "Enable wayland support" ON)
 | 
				
			||||||
| 
						 | 
					@ -23,6 +24,7 @@ option(SERVICE_PIPEWIRE "PipeWire service" ON)
 | 
				
			||||||
option(SERVICE_MPRIS "Mpris service" ON)
 | 
					option(SERVICE_MPRIS "Mpris service" ON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message(STATUS "Quickshell configuration")
 | 
					message(STATUS "Quickshell configuration")
 | 
				
			||||||
 | 
					message(STATUS "  Jemalloc: ${USE_JEMALLOC}")
 | 
				
			||||||
message(STATUS "  NVIDIA workarounds: ${NVIDIA_COMPAT}")
 | 
					message(STATUS "  NVIDIA workarounds: ${NVIDIA_COMPAT}")
 | 
				
			||||||
message(STATUS "  Build tests: ${BUILD_TESTING}")
 | 
					message(STATUS "  Build tests: ${BUILD_TESTING}")
 | 
				
			||||||
message(STATUS "  Sockets: ${SOCKETS}")
 | 
					message(STATUS "  Sockets: ${SOCKETS}")
 | 
				
			||||||
| 
						 | 
					@ -137,3 +139,10 @@ if (NVIDIA_COMPAT)
 | 
				
			||||||
endif()
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_subdirectory(src)
 | 
					add_subdirectory(src)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (USE_JEMALLOC)
 | 
				
			||||||
 | 
						find_package(PkgConfig REQUIRED)
 | 
				
			||||||
 | 
						# IMPORTED_TARGET not working for some reason
 | 
				
			||||||
 | 
						pkg_check_modules(JEMALLOC REQUIRED jemalloc)
 | 
				
			||||||
 | 
						target_link_libraries(quickshell PRIVATE ${JEMALLOC_LIBRARIES})
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,10 +63,13 @@ To build quickshell at all, you will need the following packages (names may vary
 | 
				
			||||||
- just
 | 
					- just
 | 
				
			||||||
- cmake
 | 
					- cmake
 | 
				
			||||||
- ninja
 | 
					- ninja
 | 
				
			||||||
 | 
					- pkg-config
 | 
				
			||||||
- Qt6 [ QtBase, QtDeclarative ]
 | 
					- Qt6 [ QtBase, QtDeclarative ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Jemalloc is recommended, in which case you will need:
 | 
				
			||||||
 | 
					- jemalloc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To build with wayland support you will additionally need:
 | 
					To build with wayland support you will additionally need:
 | 
				
			||||||
- pkg-config
 | 
					 | 
				
			||||||
- wayland
 | 
					- wayland
 | 
				
			||||||
- wayland-scanner (may be part of wayland on some distros)
 | 
					- wayland-scanner (may be part of wayland on some distros)
 | 
				
			||||||
- wayland-protocols
 | 
					- wayland-protocols
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								default.nix
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								default.nix
									
										
									
									
									
								
							| 
						 | 
					@ -8,6 +8,7 @@
 | 
				
			||||||
  cmake,
 | 
					  cmake,
 | 
				
			||||||
  ninja,
 | 
					  ninja,
 | 
				
			||||||
  qt6,
 | 
					  qt6,
 | 
				
			||||||
 | 
					  jemalloc,
 | 
				
			||||||
  wayland,
 | 
					  wayland,
 | 
				
			||||||
  wayland-protocols,
 | 
					  wayland-protocols,
 | 
				
			||||||
  xorg,
 | 
					  xorg,
 | 
				
			||||||
| 
						 | 
					@ -29,7 +30,8 @@
 | 
				
			||||||
  enableX11 ? true,
 | 
					  enableX11 ? true,
 | 
				
			||||||
  enablePipewire ? true,
 | 
					  enablePipewire ? true,
 | 
				
			||||||
  nvidiaCompat ? false,
 | 
					  nvidiaCompat ? false,
 | 
				
			||||||
  svgSupport ? true, # you almost always want this
 | 
					  withQtSvg ? true, # svg support
 | 
				
			||||||
 | 
					  withJemalloc ? true, # masks heap fragmentation
 | 
				
			||||||
}: buildStdenv.mkDerivation {
 | 
					}: buildStdenv.mkDerivation {
 | 
				
			||||||
  pname = "quickshell${lib.optionalString debug "-debug"}";
 | 
					  pname = "quickshell${lib.optionalString debug "-debug"}";
 | 
				
			||||||
  version = "0.1.0";
 | 
					  version = "0.1.0";
 | 
				
			||||||
| 
						 | 
					@ -39,8 +41,8 @@
 | 
				
			||||||
    cmake
 | 
					    cmake
 | 
				
			||||||
    ninja
 | 
					    ninja
 | 
				
			||||||
    qt6.wrapQtAppsHook
 | 
					    qt6.wrapQtAppsHook
 | 
				
			||||||
  ] ++ (lib.optionals enableWayland [
 | 
					 | 
				
			||||||
    pkg-config
 | 
					    pkg-config
 | 
				
			||||||
 | 
					  ] ++ (lib.optionals enableWayland [
 | 
				
			||||||
    wayland-protocols
 | 
					    wayland-protocols
 | 
				
			||||||
    wayland-scanner
 | 
					    wayland-scanner
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
| 
						 | 
					@ -49,10 +51,11 @@
 | 
				
			||||||
    qt6.qtbase
 | 
					    qt6.qtbase
 | 
				
			||||||
    qt6.qtdeclarative
 | 
					    qt6.qtdeclarative
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
 | 
					  ++ (lib.optional withJemalloc jemalloc)
 | 
				
			||||||
 | 
					  ++ (lib.optional withQtSvg qt6.qtsvg)
 | 
				
			||||||
  ++ (lib.optionals enableWayland [ qt6.qtwayland wayland ])
 | 
					  ++ (lib.optionals enableWayland [ qt6.qtwayland wayland ])
 | 
				
			||||||
  ++ (lib.optionals enableX11 [ xorg.libxcb ])
 | 
					  ++ (lib.optional enableX11 xorg.libxcb)
 | 
				
			||||||
  ++ (lib.optionals svgSupport [ qt6.qtsvg ])
 | 
					  ++ (lib.optional enablePipewire pipewire);
 | 
				
			||||||
  ++ (lib.optionals enablePipewire [ pipewire ]);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  QTWAYLANDSCANNER = lib.optionalString enableWayland "${qt6.qtwayland}/libexec/qtwaylandscanner";
 | 
					  QTWAYLANDSCANNER = lib.optionalString enableWayland "${qt6.qtwayland}/libexec/qtwaylandscanner";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,7 +70,9 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cmakeFlags = [
 | 
					  cmakeFlags = [
 | 
				
			||||||
    "-DGIT_REVISION=${gitRev}"
 | 
					    "-DGIT_REVISION=${gitRev}"
 | 
				
			||||||
  ] ++ lib.optional (!enableWayland) "-DWAYLAND=OFF"
 | 
					  ]
 | 
				
			||||||
 | 
					  ++ lib.optional (!withJemalloc) "-DUSE_JEMALLOC=OFF"
 | 
				
			||||||
 | 
					  ++ lib.optional (!enableWayland) "-DWAYLAND=OFF"
 | 
				
			||||||
  ++ lib.optional nvidiaCompat "-DNVIDIA_COMPAT=ON"
 | 
					  ++ lib.optional nvidiaCompat "-DNVIDIA_COMPAT=ON"
 | 
				
			||||||
  ++ lib.optional (!enablePipewire) "-DSERVICE_PIPEWIRE=OFF";
 | 
					  ++ lib.optional (!enablePipewire) "-DSERVICE_PIPEWIRE=OFF";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue