40 #include "boost/thread.hpp"    46 #define STATIC_TLS_KW __declspec(thread)    48 #elif defined(__APPLE__)    51 #define STATIC_TLS_KW __thread    57 #define MAX_ALLOC_INFO 1000    76 pthread_key_t g_tls_key;
    77 bool g_tls_key_initialized = 
false;
    79 AllocInfo g_thread_alloc_info[MAX_ALLOC_INFO];
    80 ros::atomic_bool g_alloc_info_used[MAX_ALLOC_INFO];
    82 void tlsDestructor(
void* mem)
    85   uint32_t index = info - g_thread_alloc_info;
    87   g_alloc_info_used[index].store(
false);
    94     int ret = pthread_key_create(&g_tls_key, tlsDestructor);
    97     for (
size_t i = 0; i < MAX_ALLOC_INFO; ++i)
    99       g_alloc_info_used[i].store(
false);
   102     g_tls_key_initialized = 
true;
   107     g_tls_key_initialized = 
false;
   109     pthread_key_delete(g_tls_key);
   112 MallocTLSInit g_malloc_tls_init;
   116   if (!g_tls_key_initialized)
   121   void* info = pthread_getspecific(g_tls_key);
   124     for (
size_t i = 0; i < MAX_ALLOC_INFO; ++i)
   126       if (g_alloc_info_used[i].exchange(
true) == 
false)
   128         info = g_thread_alloc_info + i;
   129         pthread_setspecific(g_tls_key, info);
   135   return reinterpret_cast<AllocInfo*
>(info);
   138 #endif // !HAS_TLS_KW   156   AllocInfo* tls = detail::allocateAllocInfo();
   176   AllocInfo* info = detail::allocateAllocInfo();
   189   AllocInfo* info = detail::allocateAllocInfo();
   202 typedef void* (*MallocType)(
size_t size);
   203 typedef void* (*CallocType)(
size_t nmemb, 
size_t size);
   204 typedef void* (*ReallocType)(
void *ptr, 
size_t size);
   205 typedef void* (*MemalignType)(
size_t boundary, 
size_t size);
   210 #define UPDATE_ALLOC_INFO(result, size, type) \   213     rosrt::detail::g_total_memory_allocated += size; \   216   ++rosrt::detail::g_##type; \   217   ++rosrt::detail::g_total_ops; \   219   if (rosrt::detail::g_break_on_alloc_or_free) \   221     std::cerr << "Issuing break due to break_on_alloc_or_free being set" << std::endl; \   225 #define UPDATE_ALLOC_INFO(result, size, type) \   226   rosrt::AllocInfo* tls = rosrt::detail::allocateAllocInfo(); \   231       tls->total_memory_allocated += size; \   237     if (tls->break_on_alloc_or_free) \   239       std::cerr << "Issuing break due to break_on_alloc_or_free being set" << std::endl; \   249   void* result = original_function(size);
   265   void* result = original_function(ptr, size);
   281   void* result = original_function(boundary, size);
   295   static FreeType original_function = 
reinterpret_cast<FreeType>(dlsym(RTLD_NEXT, 
"free"));
   297   original_function(ptr);
   318   if (original_function == 0)
   321       original_function = 
reinterpret_cast<CallocType>(dlsym(RTLD_NEXT, 
"calloc"));
   324   void* result = original_function(nmemb, size);
   333   return calloc(nmemb, size);
   339   int result = original_function(ptr, alignment, size);
 void setThreadBreakOnAllocOrFree(bool b)
void(* FreeType)(void *ptr)
AllocInfo getThreadAllocInfo()
void __libc_free(void *ptr)
void * malloc(size_t size)
STATIC_TLS_KW bool g_break_on_alloc_or_free
STATIC_TLS_KW uint64_t g_total_memory_allocated
int posix_memalign(void **ptr, size_t alignment, size_t size)
STATIC_TLS_KW uint64_t g_mallocs
STATIC_TLS_KW uint64_t g_memaligns
STATIC_TLS_KW uint64_t g_reallocs
void * __libc_realloc(void *ptr, size_t size)
void *(* MemalignType)(size_t boundary, size_t size)
void * __libc_malloc(size_t size)
static void * nullCalloc(size_t nmemb, size_t size)
#define ROS_ASSERT_MSG(cond,...)
STATIC_TLS_KW uint64_t g_total_ops
void * realloc(void *ptr, size_t size)
void * calloc(size_t nmemb, size_t size)
STATIC_TLS_KW uint64_t g_callocs
void resetThreadAllocInfo()
void *(* ReallocType)(void *ptr, size_t size)
void *(* MallocType)(size_t size)
uint64_t total_memory_allocated
void * __libc_memalign(size_t boundary, size_t size)
void *(* CallocType)(size_t nmemb, size_t size)
#define UPDATE_ALLOC_INFO(result, size, type)
int(* PosixMemalignType)(void **memptr, size_t alignment, size_t size)
STATIC_TLS_KW uint64_t g_frees
void * memalign(size_t boundary, size_t size)
bool break_on_alloc_or_free
void * __libc_calloc(size_t nmemb, size_t size)