diff options
-rw-r--r-- | CMakeLists.txt | 23 | ||||
-rw-r--r-- | cmake/FindJeMalloc.cmake | 48 | ||||
-rw-r--r-- | config/config.h.in | 1 | ||||
-rw-r--r-- | src/nvim/CMakeLists.txt | 16 | ||||
-rw-r--r-- | src/nvim/memory.c | 22 | ||||
-rw-r--r-- | third-party/CMakeLists.txt | 7 | ||||
-rw-r--r-- | third-party/cmake/BuildJeMalloc.cmake | 19 |
7 files changed, 116 insertions, 20 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 4219c69b62..3ab7062019 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -202,6 +202,29 @@ option(LIBVTERM_USE_STATIC "Use static libvterm" ON) find_package(LibVterm REQUIRED) include_directories(SYSTEM ${LIBVTERM_INCLUDE_DIRS}) +option(SANITIZE "Enable Clang sanitizers for nvim binary" OFF) +if(SANITIZE AND NOT CMAKE_C_COMPILER_ID MATCHES "Clang") + message(WARNING "SANITIZE is only supported for Clang ... disabling") + set(SANITIZE OFF) +endif() + +if(SANITIZE) + option(USE_JEMALLOC "Use jemalloc" OFF) +else() + option(USE_JEMALLOC "Use jemalloc" ON) +endif() + +if(USE_JEMALLOC) + option(JEMALLOC_USE_STATIC "Use static jemalloc" ON) + find_package(JeMalloc) + if(JEMALLOC_FOUND) + message(STATUS "Using jemalloc instead of libc allocator") + include_directories(SYSTEM ${JEMALLOC_INCLUDE_DIRS}) + else() + set(USE_JEMALLOC OFF) + endif() +endif() + find_package(LibIntl) if(LibIntl_FOUND) include_directories(SYSTEM ${LibIntl_INCLUDE_DIRS}) diff --git a/cmake/FindJeMalloc.cmake b/cmake/FindJeMalloc.cmake new file mode 100644 index 0000000000..fd20a456fb --- /dev/null +++ b/cmake/FindJeMalloc.cmake @@ -0,0 +1,48 @@ +# - Try to find jemalloc +# Once done this will define +# JEMALLOC_FOUND - System has jemalloc +# JEMALLOC_INCLUDE_DIRS - The jemalloc include directories +# JEMALLOC_LIBRARIES - The libraries needed to use jemalloc + +find_package(PkgConfig) +if(NOT JEMALLOC_USE_BUNDLED) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(PC_JEMALLOC QUIET jemalloc) + endif() +else() + set(PC_JEMALLOC_INCLUDEDIR) + set(PC_JEMALLOC_INCLUDE_DIRS) + set(PC_JEMALLOC_LIBDIR) + set(PC_JEMALLOC_LIBRARY_DIRS) + set(LIMIT_SEARCH NO_DEFAULT_PATH) +endif() + +set(JEMALLOC_DEFINITIONS ${PC_JEMALLOC_CFLAGS_OTHER}) + +find_path(JEMALLOC_INCLUDE_DIR jemalloc/jemalloc.h + PATHS ${PC_JEMALLOC_INCLUDEDIR} ${PC_JEMALLOC_INCLUDE_DIRS} + ${LIMIT_SEARCH}) + +# If we're asked to use static linkage, add libjemalloc.a as a preferred library name. +if(JEMALLOC_USE_STATIC) + list(APPEND JEMALLOC_NAMES + "${CMAKE_STATIC_LIBRARY_PREFIX}jemalloc${CMAKE_STATIC_LIBRARY_SUFFIX}") +endif() + +list(APPEND JEMALLOC_NAMES jemalloc) + +find_library(JEMALLOC_LIBRARY NAMES ${JEMALLOC_NAMES} + HINTS ${PC_JEMALLOC_LIBDIR} ${PC_JEMALLOC_LIBRARY_DIRS} + ${LIMIT_SEARCH}) + +set(JEMALLOC_LIBRARIES ${JEMALLOC_LIBRARY}) +set(JEMALLOC_INCLUDE_DIRS ${JEMALLOC_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set JEMALLOC_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(JeMalloc DEFAULT_MSG + JEMALLOC_LIBRARY JEMALLOC_INCLUDE_DIR) + +mark_as_advanced(JEMALLOC_INCLUDE_DIR JEMALLOC_LIBRARY) diff --git a/config/config.h.in b/config/config.h.in index 382b5c653d..04db12fbe3 100644 --- a/config/config.h.in +++ b/config/config.h.in @@ -65,5 +65,6 @@ #define FEAT_BROWSE #define FEAT_CSCOPE #define FEAT_MOUSE +#cmakedefine USE_JEMALLOC #endif // AUTO_CONFIG_H diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 09b709b6ce..dc44c9135d 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -1,11 +1,5 @@ include(CheckLibraryExists) -option(SANITIZE "Enable Clang sanitizers for nvim binary" OFF) -if(SANITIZE AND NOT CMAKE_C_COMPILER_ID MATCHES "Clang") - message(WARNING "SANITIZE is only supported for Clang ... disabling") - set(SANITIZE OFF) -endif() - set(GENERATED_DIR ${PROJECT_BINARY_DIR}/src/nvim/auto) set(DISPATCH_GENERATOR ${PROJECT_SOURCE_DIR}/scripts/msgpack-gen.lua) file(GLOB API_HEADERS api/*.h) @@ -176,9 +170,16 @@ list(APPEND NVIM_LINK_LIBRARIES ${CMAKE_THREAD_LIBS_INIT} ) +set(NVIM_EXEC_LINK_LIBRARIES ${NVIM_LINK_LIBRARIES}) + +if(USE_JEMALLOC) + # dont use jemalloc in the unit test library + list(APPEND NVIM_EXEC_LINK_LIBRARIES ${JEMALLOC_LIBRARIES}) +endif() + add_executable(nvim ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} ${NEOVIM_HEADERS}) -target_link_libraries(nvim ${NVIM_LINK_LIBRARIES}) +target_link_libraries(nvim ${NVIM_EXEC_LINK_LIBRARIES}) install_helper(TARGETS nvim) if(SANITIZE) @@ -199,5 +200,6 @@ set_property(TARGET libnvim APPEND_STRING PROPERTY COMPILE_FLAGS " -DMAKE_LIB ") add_library(nvim-test MODULE EXCLUDE_FROM_ALL ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} ${NEOVIM_HEADERS}) target_link_libraries(nvim-test ${NVIM_LINK_LIBRARIES}) +set_target_properties(nvim-test PROPERTIES COMPILE_FLAGS -DUNIT_TESTING) add_subdirectory(po) diff --git a/src/nvim/memory.c b/src/nvim/memory.c index 35409aef49..2d4259a238 100644 --- a/src/nvim/memory.c +++ b/src/nvim/memory.c @@ -18,6 +18,14 @@ # include "memory.c.generated.h" #endif +#if defined(USE_JEMALLOC) && !defined(UNIT_TESTING) +#include "jemalloc/jemalloc.h" +#define malloc(size) je_malloc(size) +#define calloc(count, size) je_calloc(count, size) +#define realloc(ptr, size) je_realloc(ptr, size) +#define free(ptr) je_free(ptr) +#endif + /// Try to free memory. Used when trying to recover from out of memory errors. /// @see {xmalloc} static void try_to_free_memory(void) @@ -368,19 +376,7 @@ size_t xstrlcpy(char *restrict dst, const char *restrict src, size_t size) char *xstrdup(const char *str) FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_RET { - char *ret = strdup(str); - - if (!ret) { - try_to_free_memory(); - ret = strdup(str); - if (!ret) { - mch_errmsg(e_outofmem); - mch_errmsg("\n"); - preserve_exit(); - } - } - - return ret; + return xmemdupz(str, strlen(str)); } /// A version of memchr that starts the search at `src + len`. diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 60a53ace8f..fde367bc72 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -13,6 +13,7 @@ set(DEPS_DOWNLOAD_DIR "${DEPS_BUILD_DIR}/downloads") option(USE_BUNDLED "Use bundled dependencies." ON) +option(USE_BUNDLED_JEMALLOC "Use the bundled jemalloc." ${USE_BUNDLED}) option(USE_BUNDLED_UNIBILIUM "Use the bundled unibilium." ${USE_BUNDLED}) option(USE_BUNDLED_LIBTERMKEY "Use the bundled libtermkey." ${USE_BUNDLED}) option(USE_BUNDLED_LIBVTERM "Use the bundled libvterm." ${USE_BUNDLED}) @@ -73,6 +74,8 @@ set(LIBTERMKEY_SHA256 21846369081e6c9a0b615f4b3889c4cb809321c5ccc6e6c1640eb138f1 set(LIBVTERM_URL https://github.com/neovim/libvterm/archive/1b745d29d45623aa8d22a7b9288c7b0e331c7088.tar.gz) set(LIBVTERM_SHA256 3fc75908256c0d158d6c2a32d39f34e86bfd26364f5404b7d9c03bb70cdc3611) +set(JEMALLOC_URL https://github.com/jemalloc/jemalloc/archive/3.6.0.tar.gz) +set(JEMALLOC_SHA256 68175f729423305dc8573cb093025a8db525e1956583c7c5924416a9abaaacb6) if(USE_BUNDLED_UNIBILIUM) include(BuildUnibilium) @@ -102,6 +105,10 @@ if(USE_BUNDLED_LUAROCKS) include(BuildLuarocks) endif() +if(USE_BUNDLED_JEMALLOC) + include(BuildJeMalloc) +endif() + add_custom_target(third-party ALL COMMAND ${CMAKE_COMMAND} -E touch .third-party DEPENDS ${THIRD_PARTY_DEPS}) diff --git a/third-party/cmake/BuildJeMalloc.cmake b/third-party/cmake/BuildJeMalloc.cmake new file mode 100644 index 0000000000..ceb7de41e9 --- /dev/null +++ b/third-party/cmake/BuildJeMalloc.cmake @@ -0,0 +1,19 @@ +ExternalProject_Add(jemalloc + PREFIX ${DEPS_BUILD_DIR} + URL ${JEMALLOC_URL} + DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/jemalloc + DOWNLOAD_COMMAND ${CMAKE_COMMAND} + -DPREFIX=${DEPS_BUILD_DIR} + -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/jemalloc + -DURL=${JEMALLOC_URL} + -DEXPECTED_SHA256=${JEMALLOC_SHA256} + -DTARGET=jemalloc + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND sh ${DEPS_BUILD_DIR}/src/jemalloc/autogen.sh && + ${DEPS_BUILD_DIR}/src/jemalloc/configure --with-jemalloc-prefix=je_ + --enable-cc-silence CC=${DEPS_C_COMPILER} --prefix=${DEPS_INSTALL_DIR} + BUILD_COMMAND "" + INSTALL_COMMAND ${MAKE_PRG} install_include install_lib) + +list(APPEND THIRD_PARTY_DEPS jemalloc) |