aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2015-04-12 11:40:08 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2015-04-13 08:22:59 -0300
commit8a1a9b9558d6f3e28cc97254c1bacfbc823d05e2 (patch)
tree89ef647267ef31794eeb2f297886e6bde97dcf10 /src
parent34c48aaf123ffd8aec31b79f0b4d16d9a63fe59b (diff)
downloadrneovim-8a1a9b9558d6f3e28cc97254c1bacfbc823d05e2.tar.gz
rneovim-8a1a9b9558d6f3e28cc97254c1bacfbc823d05e2.tar.bz2
rneovim-8a1a9b9558d6f3e28cc97254c1bacfbc823d05e2.zip
deps: Add jemalloc as an optional dependency
Jemalloc will be used if the cmake option `USE_JEMALLOC` is enabled(which is the default). To avoid trouble with clang's ASAN, it is disabled by default if the `SANITIZE` option is enabled. Since jemalloc has thread cache for small objects, it fills the gap created by removing klib memory pools. The `xstrdup` funciton(memory.c) had to be reimplemented on top of `xmalloc` to make it work with a custom allocator.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/CMakeLists.txt16
-rw-r--r--src/nvim/memory.c22
2 files changed, 18 insertions, 20 deletions
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`.