From e5405e5dbfe2a53b6d83640dcbaaf81e17e5d495 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 5 May 2022 00:52:16 +0100 Subject: [PATCH] Add guards for `glibc` specific allocators `glibc` exposes some specific allocators that other libc implementations do not. To avoid having to rely of a configure step (which would complicate considerably our build process), add some macro guards to only define and override these allocator functions and APIs if `glibc` is detected on the system. Signed-off-by: Pablo Galindo --- src/memray/_memray/hooks.cpp | 4 +++ src/memray/_memray/hooks.h | 51 ++++++++++++++++++++--------- src/memray/_memray/tracking_api.cpp | 21 ++---------- src/memray/_memray/tracking_api.h | 17 ++++++++++ 4 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/memray/_memray/hooks.cpp b/src/memray/_memray/hooks.cpp index 916e67de66..0959a4cc4f 100644 --- a/src/memray/_memray/hooks.cpp +++ b/src/memray/_memray/hooks.cpp @@ -106,6 +106,7 @@ mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) noexc return ptr; } +#if defined(__GLIBC__) void* mmap64(void* addr, size_t length, int prot, int flags, int fd, off64_t offset) noexcept { @@ -114,6 +115,7 @@ mmap64(void* addr, size_t length, int prot, int flags, int fd, off64_t offset) n tracking_api::Tracker::trackAllocation(ptr, length, hooks::Allocator::MMAP); return ptr; } +#endif int munmap(void* addr, size_t length) noexcept @@ -210,6 +212,7 @@ valloc(size_t size) noexcept return ret; } +#if defined(__GLIBC__) void* pvalloc(size_t size) noexcept { @@ -221,6 +224,7 @@ pvalloc(size_t size) noexcept } return ret; } +#endif void* dlopen(const char* filename, int flag) noexcept diff --git a/src/memray/_memray/hooks.h b/src/memray/_memray/hooks.h index a55aaffe65..2eee9b40f9 100644 --- a/src/memray/_memray/hooks.h +++ b/src/memray/_memray/hooks.h @@ -16,22 +16,39 @@ #include "logging.h" -#define MEMRAY_HOOKED_FUNCTIONS \ - FOR_EACH_HOOKED_FUNCTION(malloc) \ - FOR_EACH_HOOKED_FUNCTION(free) \ - FOR_EACH_HOOKED_FUNCTION(calloc) \ - FOR_EACH_HOOKED_FUNCTION(realloc) \ - FOR_EACH_HOOKED_FUNCTION(posix_memalign) \ - FOR_EACH_HOOKED_FUNCTION(memalign) \ - FOR_EACH_HOOKED_FUNCTION(valloc) \ - FOR_EACH_HOOKED_FUNCTION(pvalloc) \ - FOR_EACH_HOOKED_FUNCTION(dlopen) \ - FOR_EACH_HOOKED_FUNCTION(dlclose) \ - FOR_EACH_HOOKED_FUNCTION(mmap) \ - FOR_EACH_HOOKED_FUNCTION(mmap64) \ - FOR_EACH_HOOKED_FUNCTION(munmap) \ - FOR_EACH_HOOKED_FUNCTION(prctl) \ - FOR_EACH_HOOKED_FUNCTION(PyGILState_Ensure) +#if defined(__GLIBC__) +# define MEMRAY_HOOKED_FUNCTIONS \ + FOR_EACH_HOOKED_FUNCTION(malloc) \ + FOR_EACH_HOOKED_FUNCTION(free) \ + FOR_EACH_HOOKED_FUNCTION(calloc) \ + FOR_EACH_HOOKED_FUNCTION(realloc) \ + FOR_EACH_HOOKED_FUNCTION(posix_memalign) \ + FOR_EACH_HOOKED_FUNCTION(memalign) \ + FOR_EACH_HOOKED_FUNCTION(valloc) \ + FOR_EACH_HOOKED_FUNCTION(pvalloc) \ + FOR_EACH_HOOKED_FUNCTION(dlopen) \ + FOR_EACH_HOOKED_FUNCTION(dlclose) \ + FOR_EACH_HOOKED_FUNCTION(mmap) \ + FOR_EACH_HOOKED_FUNCTION(mmap64) \ + FOR_EACH_HOOKED_FUNCTION(munmap) \ + FOR_EACH_HOOKED_FUNCTION(prctl) \ + FOR_EACH_HOOKED_FUNCTION(PyGILState_Ensure) +#else +# define MEMRAY_HOOKED_FUNCTIONS \ + FOR_EACH_HOOKED_FUNCTION(malloc) \ + FOR_EACH_HOOKED_FUNCTION(free) \ + FOR_EACH_HOOKED_FUNCTION(calloc) \ + FOR_EACH_HOOKED_FUNCTION(realloc) \ + FOR_EACH_HOOKED_FUNCTION(posix_memalign) \ + FOR_EACH_HOOKED_FUNCTION(memalign) \ + FOR_EACH_HOOKED_FUNCTION(valloc) \ + FOR_EACH_HOOKED_FUNCTION(dlopen) \ + FOR_EACH_HOOKED_FUNCTION(dlclose) \ + FOR_EACH_HOOKED_FUNCTION(mmap) \ + FOR_EACH_HOOKED_FUNCTION(munmap) \ + FOR_EACH_HOOKED_FUNCTION(prctl) \ + FOR_EACH_HOOKED_FUNCTION(PyGILState_Ensure) +#endif namespace memray::hooks { @@ -154,8 +171,10 @@ dlclose(void* handle) noexcept; void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) noexcept; +#if defined(__GLIBC__) void* mmap64(void* addr, size_t length, int prot, int flags, int fd, off64_t offset) noexcept; +#endif int munmap(void* addr, size_t length) noexcept; diff --git a/src/memray/_memray/tracking_api.cpp b/src/memray/_memray/tracking_api.cpp index 3de2235cdc..1fbfaaa0d3 100644 --- a/src/memray/_memray/tracking_api.cpp +++ b/src/memray/_memray/tracking_api.cpp @@ -19,25 +19,6 @@ using namespace std::chrono_literals; namespace { -struct RecursionGuard -{ - RecursionGuard() - : wasLocked(isActive) - { - isActive = true; - } - - ~RecursionGuard() - { - isActive = wasLocked; - } - - const bool wasLocked; - MEMRAY_FAST_TLS static thread_local bool isActive; -}; - -MEMRAY_FAST_TLS thread_local bool RecursionGuard::isActive = false; - std::string get_executable() { @@ -64,6 +45,8 @@ std::atomic g_tracker_generation; namespace memray::tracking_api { +MEMRAY_FAST_TLS thread_local bool RecursionGuard::isActive = false; + static inline thread_id_t thread_id() { diff --git a/src/memray/_memray/tracking_api.h b/src/memray/_memray/tracking_api.h index 8118b438d3..61f53a3211 100644 --- a/src/memray/_memray/tracking_api.h +++ b/src/memray/_memray/tracking_api.h @@ -31,6 +31,23 @@ namespace memray::tracking_api { +struct RecursionGuard +{ + RecursionGuard() + : wasLocked(isActive) + { + isActive = true; + } + + ~RecursionGuard() + { + isActive = wasLocked; + } + + const bool wasLocked; + MEMRAY_FAST_TLS static thread_local bool isActive; +}; + // Trace function interface /**