Fix T54287: memory not freed after rendering on Linux.
With new jemalloc versions memory allocated by threads that then become inactive is not longer automatically freed. Instead we have to enable a background thread to do it. Some testing is needed to find out of this is sufficient, because the background thread only runs periodically.
This commit is contained in:
@@ -53,6 +53,15 @@ FIND_LIBRARY(JEMALLOC_LIBRARY
|
||||
lib64 lib
|
||||
)
|
||||
|
||||
if(JEMALLOC_INCLUDE_DIR)
|
||||
SET(_version_regex "^#define[ \t]+JEMALLOC_VERSION[ \t]+\"([^\"]+)\".*")
|
||||
file(STRINGS "${JEMALLOC_INCLUDE_DIR}/jemalloc.h"
|
||||
JEMALLOC_VERSION REGEX "${_version_regex}")
|
||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||
JEMALLOC_VERSION "${JEMALLOC_VERSION}")
|
||||
unset(_version_regex)
|
||||
endif()
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set JEMALLOC_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
|
||||
@@ -53,6 +53,11 @@ if(WIN32 AND NOT UNIX)
|
||||
)
|
||||
endif()
|
||||
|
||||
# Jemalloc 5.0.0+ needs extra configuration.
|
||||
if(WITH_MEM_JEMALLOC AND ("${JEMALLOC_VERSION}" VERSION_GREATER_EQUAL "5.0.0"))
|
||||
add_definitions(-DWITH_JEMALLOC_CONF)
|
||||
endif()
|
||||
|
||||
blender_add_lib(bf_intern_guardedalloc "${SRC}" "${INC}" "${INC_SYS}")
|
||||
|
||||
# Override C++ alloc, optional.
|
||||
|
||||
@@ -37,6 +37,13 @@
|
||||
|
||||
#include "mallocn_intern.h"
|
||||
|
||||
#ifdef WITH_JEMALLOC_CONF
|
||||
/* If jemalloc is used, it reads this global variable and enables background
|
||||
* threads to purge dirty pages. Otherwise we release memory too slowly or not
|
||||
* at all if the thread that did the allocation stays inactive. */
|
||||
const char *malloc_conf = "background_thread:true,dirty_decay_ms:4000";
|
||||
#endif
|
||||
|
||||
size_t (*MEM_allocN_len)(const void *vmemh) = MEM_lockfree_allocN_len;
|
||||
void (*MEM_freeN)(void *vmemh) = MEM_lockfree_freeN;
|
||||
void *(*MEM_dupallocN)(const void *vmemh) = MEM_lockfree_dupallocN;
|
||||
|
||||
Reference in New Issue
Block a user