151c0b2f7Stbbdev /*
2*2110128eSsarathnandu Copyright (c) 2005-2023 Intel Corporation
351c0b2f7Stbbdev
451c0b2f7Stbbdev Licensed under the Apache License, Version 2.0 (the "License");
551c0b2f7Stbbdev you may not use this file except in compliance with the License.
651c0b2f7Stbbdev You may obtain a copy of the License at
751c0b2f7Stbbdev
851c0b2f7Stbbdev http://www.apache.org/licenses/LICENSE-2.0
951c0b2f7Stbbdev
1051c0b2f7Stbbdev Unless required by applicable law or agreed to in writing, software
1151c0b2f7Stbbdev distributed under the License is distributed on an "AS IS" BASIS,
1251c0b2f7Stbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c0b2f7Stbbdev See the License for the specific language governing permissions and
1451c0b2f7Stbbdev limitations under the License.
1551c0b2f7Stbbdev */
1651c0b2f7Stbbdev
1751c0b2f7Stbbdev #ifndef _TBB_malloc_Customize_H_
1851c0b2f7Stbbdev #define _TBB_malloc_Customize_H_
1951c0b2f7Stbbdev
2051c0b2f7Stbbdev // customizing MALLOC_ASSERT macro
2151c0b2f7Stbbdev #define MALLOC_ASSERT(assertion, message) __TBB_ASSERT(assertion, message)
2251c0b2f7Stbbdev #define MALLOC_ASSERT_EX(assertion, message) __TBB_ASSERT_EX(assertion, message)
2351c0b2f7Stbbdev
2451c0b2f7Stbbdev #ifndef MALLOC_DEBUG
2551c0b2f7Stbbdev #define MALLOC_DEBUG TBB_USE_DEBUG
2651c0b2f7Stbbdev #endif
2751c0b2f7Stbbdev
2849e08aacStbbdev #include "oneapi/tbb/detail/_utils.h"
2949e08aacStbbdev #include "oneapi/tbb/detail/_assert.h"
3051c0b2f7Stbbdev
3151c0b2f7Stbbdev #include "Synchronize.h"
3251c0b2f7Stbbdev
3351c0b2f7Stbbdev #if __TBB_USE_ITT_NOTIFY
3451c0b2f7Stbbdev #include "../tbb/itt_notify.h"
3551c0b2f7Stbbdev #define MALLOC_ITT_SYNC_PREPARE(pointer) ITT_NOTIFY(sync_prepare, (pointer))
3651c0b2f7Stbbdev #define MALLOC_ITT_SYNC_ACQUIRED(pointer) ITT_NOTIFY(sync_acquired, (pointer))
3751c0b2f7Stbbdev #define MALLOC_ITT_SYNC_RELEASING(pointer) ITT_NOTIFY(sync_releasing, (pointer))
3851c0b2f7Stbbdev #define MALLOC_ITT_SYNC_CANCEL(pointer) ITT_NOTIFY(sync_cancel, (pointer))
3951c0b2f7Stbbdev #define MALLOC_ITT_FINI_ITTLIB() ITT_FINI_ITTLIB()
400e6d4699SAnuya Welling #define MALLOC_ITT_RELEASE_RESOURCES() ITT_RELEASE_RESOURCES()
4151c0b2f7Stbbdev #else
4251c0b2f7Stbbdev #define MALLOC_ITT_SYNC_PREPARE(pointer) ((void)0)
4351c0b2f7Stbbdev #define MALLOC_ITT_SYNC_ACQUIRED(pointer) ((void)0)
4451c0b2f7Stbbdev #define MALLOC_ITT_SYNC_RELEASING(pointer) ((void)0)
4551c0b2f7Stbbdev #define MALLOC_ITT_SYNC_CANCEL(pointer) ((void)0)
4651c0b2f7Stbbdev #define MALLOC_ITT_FINI_ITTLIB() ((void)0)
470e6d4699SAnuya Welling #define MALLOC_ITT_RELEASE_RESOURCES() ((void)0)
4851c0b2f7Stbbdev #endif
4951c0b2f7Stbbdev
BitScanRev(uintptr_t x)5051c0b2f7Stbbdev inline intptr_t BitScanRev(uintptr_t x) {
51*2110128eSsarathnandu return x == 0 ? -1 : static_cast<intptr_t>(tbb::detail::log2(x));
5251c0b2f7Stbbdev }
5351c0b2f7Stbbdev
5451c0b2f7Stbbdev template<typename T>
isAligned(T * arg,uintptr_t alignment)5551c0b2f7Stbbdev static inline bool isAligned(T* arg, uintptr_t alignment) {
5651c0b2f7Stbbdev return tbb::detail::is_aligned(arg,alignment);
5751c0b2f7Stbbdev }
5851c0b2f7Stbbdev
isPowerOfTwo(uintptr_t arg)5951c0b2f7Stbbdev static inline bool isPowerOfTwo(uintptr_t arg) {
6051c0b2f7Stbbdev return tbb::detail::is_power_of_two(arg);
6151c0b2f7Stbbdev }
isPowerOfTwoAtLeast(uintptr_t arg,uintptr_t power2)6251c0b2f7Stbbdev static inline bool isPowerOfTwoAtLeast(uintptr_t arg, uintptr_t power2) {
6351c0b2f7Stbbdev return arg && tbb::detail::is_power_of_two_at_least(arg,power2);
6451c0b2f7Stbbdev }
6551c0b2f7Stbbdev
do_yield()66c09c4163SIlya Isaev inline void do_yield() {
67c09c4163SIlya Isaev tbb::detail::yield();
68c09c4163SIlya Isaev }
69c09c4163SIlya Isaev
7051c0b2f7Stbbdev #define USE_DEFAULT_MEMORY_MAPPING 1
7151c0b2f7Stbbdev
7251c0b2f7Stbbdev // To support malloc replacement
7351c0b2f7Stbbdev #include "../tbbmalloc_proxy/proxy.h"
7451c0b2f7Stbbdev
7551c0b2f7Stbbdev #if MALLOC_UNIXLIKE_OVERLOAD_ENABLED
7651c0b2f7Stbbdev #define malloc_proxy __TBB_malloc_proxy
7751c0b2f7Stbbdev extern "C" void * __TBB_malloc_proxy(size_t) __attribute__ ((weak));
7851c0b2f7Stbbdev #elif MALLOC_ZONE_OVERLOAD_ENABLED
7951c0b2f7Stbbdev // as there is no significant overhead, always suppose that proxy can be present
8051c0b2f7Stbbdev const bool malloc_proxy = true;
8151c0b2f7Stbbdev #else
8251c0b2f7Stbbdev const bool malloc_proxy = false;
8351c0b2f7Stbbdev #endif
8451c0b2f7Stbbdev
8551c0b2f7Stbbdev namespace rml {
8651c0b2f7Stbbdev namespace internal {
8751c0b2f7Stbbdev void init_tbbmalloc();
8851c0b2f7Stbbdev } } // namespaces
8951c0b2f7Stbbdev
9051c0b2f7Stbbdev #define MALLOC_EXTRA_INITIALIZATION rml::internal::init_tbbmalloc()
9151c0b2f7Stbbdev
9251c0b2f7Stbbdev // Need these to work regardless of tools support.
9351c0b2f7Stbbdev namespace tbb {
9451c0b2f7Stbbdev namespace detail {
9551c0b2f7Stbbdev namespace d1 {
9651c0b2f7Stbbdev
9751c0b2f7Stbbdev enum notify_type {prepare=0, cancel, acquired, releasing};
9851c0b2f7Stbbdev
9951c0b2f7Stbbdev #if TBB_USE_PROFILING_TOOLS
call_itt_notify(notify_type t,void * ptr)10051c0b2f7Stbbdev inline void call_itt_notify(notify_type t, void *ptr) {
10151c0b2f7Stbbdev // unreferenced formal parameter warning
10251c0b2f7Stbbdev detail::suppress_unused_warning(ptr);
10351c0b2f7Stbbdev switch ( t ) {
10451c0b2f7Stbbdev case prepare:
10551c0b2f7Stbbdev MALLOC_ITT_SYNC_PREPARE( ptr );
10651c0b2f7Stbbdev break;
10751c0b2f7Stbbdev case cancel:
10851c0b2f7Stbbdev MALLOC_ITT_SYNC_CANCEL( ptr );
10951c0b2f7Stbbdev break;
11051c0b2f7Stbbdev case acquired:
11151c0b2f7Stbbdev MALLOC_ITT_SYNC_ACQUIRED( ptr );
11251c0b2f7Stbbdev break;
11351c0b2f7Stbbdev case releasing:
11451c0b2f7Stbbdev MALLOC_ITT_SYNC_RELEASING( ptr );
11551c0b2f7Stbbdev break;
11651c0b2f7Stbbdev }
11751c0b2f7Stbbdev }
11851c0b2f7Stbbdev #else
call_itt_notify(notify_type,void *)11951c0b2f7Stbbdev inline void call_itt_notify(notify_type /*t*/, void * /*ptr*/) {}
12051c0b2f7Stbbdev #endif // TBB_USE_PROFILING_TOOLS
12151c0b2f7Stbbdev
12251c0b2f7Stbbdev } // namespace d1
12351c0b2f7Stbbdev } // namespace detail
12451c0b2f7Stbbdev } // namespace tbb
12551c0b2f7Stbbdev
12649e08aacStbbdev #include "oneapi/tbb/detail/_aggregator.h"
12751c0b2f7Stbbdev
12851c0b2f7Stbbdev template <typename OperationType>
12951c0b2f7Stbbdev struct MallocAggregator {
13051c0b2f7Stbbdev typedef tbb::detail::d1::aggregator_generic<OperationType> type;
13151c0b2f7Stbbdev };
13251c0b2f7Stbbdev
13351c0b2f7Stbbdev //! aggregated_operation base class
13451c0b2f7Stbbdev template <typename Derived>
13551c0b2f7Stbbdev struct MallocAggregatedOperation {
13651c0b2f7Stbbdev typedef tbb::detail::d1::aggregated_operation<Derived> type;
13751c0b2f7Stbbdev };
13851c0b2f7Stbbdev
13951c0b2f7Stbbdev #endif /* _TBB_malloc_Customize_H_ */
140