31 #if __TBB_WEAK_SYMBOLS_PRESENT 33 #pragma weak scalable_malloc 34 #pragma weak scalable_free 35 #pragma weak scalable_aligned_malloc 36 #pragma weak scalable_aligned_free 91 #define DEBUG_SUFFIX "_debug" 98 #define MALLOCLIB_NAME "tbbmalloc" DEBUG_SUFFIX ".dll" 100 #define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".dylib" 101 #elif __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __sun || _AIX || __ANDROID__ 102 #define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX ".so" 103 #elif __linux__ // Note that order of these #elif's is important! 104 #define MALLOCLIB_NAME "libtbbmalloc" DEBUG_SUFFIX __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION) 126 #if !__TBB_RML_STATIC 147 (*FreeHandler)( ptr );
161 (*padded_free_handler)( ptr );
171 #if _MSC_VER && !defined(__INTEL_COMPILER) 173 #pragma warning( disable: 4146 4706 ) 181 size_t bytes = n*element_size;
183 if (bytes<n || bytes+nfs_cache_line_size<bytes) {
188 if (bytes==0) bytes = 1;
190 void* result = (*padded_allocate_handler)( bytes, nfs_cache_line_size );
194 __TBB_ASSERT(
is_aligned(result, nfs_cache_line_size),
"The address returned isn't aligned to cache line size" );
199 (*padded_free_handler)(
p );
203 unsigned char* result = NULL;
204 unsigned char* base = (
unsigned char*)std::malloc(alignment+bytes);
207 result = (
unsigned char*)((uintptr_t)(base+alignment)&-alignment);
209 ((uintptr_t*)result)[-1] = uintptr_t(base);
216 __TBB_ASSERT( (uintptr_t)
p>=0x4096,
"attempt to free block not obtained from cache_aligned_allocator" );
218 unsigned char* base = ((
unsigned char**)
p)[-1];
225 void* result = (*MallocHandler) (n);
240 void* void_ptr = (*MallocHandler)(1);
241 (*FreeHandler)(void_ptr);
246 "Both shim pointers must refer to routines from the same package (either TBB or CRT)" );
static void dummy_padded_free(void *ptr)
Dummy routine used for first indirect call via padded_free_handler.
static void *(* MallocHandler)(size_t size)
Handler for memory allocation.
void *__TBB_EXPORTED_FUNC NFS_Allocate(size_t n_element, size_t element_size, void *hint)
Allocate memory on cache/sector line boundary.
static const dynamic_link_descriptor MallocLinkTable[]
Table describing how to link the handlers.
Association between a handler name and location of pointer to it.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
static void * DummyMalloc(size_t size)
Dummy routine used for first indirect call via MallocHandler.
void __TBB_EXPORTED_FUNC deallocate_via_handler_v3(void *p)
Deallocates memory using FreeHandler.
void *__TBB_EXPORTED_FUNC scalable_aligned_malloc(size_t size, size_t alignment)
bool is_aligned(T *pointer, uintptr_t alignment)
A function to check if passed in pointer is aligned on a specific border.
static void DummyFree(void *ptr)
Dummy routine used for first indirect call via FreeHandler.
void atomic_do_once(const F &initializer, atomic< do_once_state > &state)
One-time initialization function.
void const char const char int ITT_FORMAT __itt_group_sync p
#define __TBB_EXPORTED_FUNC
static void padded_free(void *p)
static void(* padded_free_handler)(void *p)
Handler for padded memory deallocation.
void initialize_handler_pointers()
Initialize the allocation/free handler pointers.
void __TBB_EXPORTED_FUNC NFS_Free(void *)
Free memory allocated by NFS_Allocate.
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
static void(* FreeHandler)(void *pointer)
Handler for memory deallocation.
static tbb::atomic< do_once_state > initialization_state
static void * dummy_padded_allocate(size_t bytes, size_t alignment)
Dummy routine used for first indirect call via padded_allocate_handler.
void __TBB_EXPORTED_FUNC scalable_free(void *ptr)
OPEN_INTERNAL_NAMESPACE bool dynamic_link(const char *, const dynamic_link_descriptor *, size_t, dynamic_link_handle *handle, int)
void *__TBB_EXPORTED_FUNC scalable_malloc(size_t size)
void initialize_cache_aligned_allocator()
Defined in cache_aligned_allocator.cpp.
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
static void * padded_allocate(size_t bytes, size_t alignment)
bool is_power_of_two(integer_type arg)
A function to check if passed integer is a power of 2.
#define DLD(s, h)
The helper to construct dynamic_link_descriptor structure.
void throw_exception(exception_id eid)
Versionless convenience wrapper for throw_exception_v4()
bool __TBB_EXPORTED_FUNC is_malloc_used_v3()
Returns true if standard malloc/free are used to work with memory.
size_t __TBB_EXPORTED_FUNC NFS_GetLineSize()
Cache/sector line size.
static void *(* padded_allocate_handler)(size_t bytes, size_t alignment)
Handler for padded memory allocation.
void __TBB_EXPORTED_FUNC scalable_aligned_free(void *ptr)
void PrintExtraVersionInfo(const char *category, const char *format,...)
Prints arbitrary extra TBB version information on stderr.
static size_t NFS_LineSize
void *__TBB_EXPORTED_FUNC allocate_via_handler_v3(size_t n)
Allocates memory using MallocHandler.