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:
Brecht Van Lommel
2018-10-03 11:10:08 +02:00
parent bf37c93533
commit d2da3af073
3 changed files with 21 additions and 0 deletions

View File

@@ -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)

View File

@@ -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.

View File

@@ -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;