18#ifndef __TBB_harness_defs_H
19#define __TBB_harness_defs_H
21#include "tbb/tbb_config.h"
26#if __TBB_TEST_PIC && !__PIC__
27#define __TBB_TEST_SKIP_PIC_MODE 1
29#define __TBB_TEST_SKIP_PIC_MODE 0
33#define __TBB_TEST_SKIP_GCC_BUILTINS_MODE ( __TBB_TEST_BUILTINS && (!__TBB_GCC_BUILTIN_ATOMICS_PRESENT || __INTEL_COMPILER) )
35#define __TBB_TEST_SKIP_ICC_BUILTINS_MODE ( __TBB_TEST_BUILTINS && !__TBB_ICC_BUILTIN_ATOMICS_PRESENT )
37#ifndef TBB_USE_GCC_BUILTINS
39#define TBB_USE_GCC_BUILTINS ( __TBB_TEST_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT && !__INTEL_COMPILER )
42#ifndef TBB_USE_ICC_BUILTINS
44#define TBB_USE_ICC_BUILTINS ( __TBB_TEST_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT )
47#if (_WIN32 && !__TBB_WIN8UI_SUPPORT) || (__linux__ && !__ANDROID__ && !__bg__) || __FreeBSD_version >= 701000
48#define __TBB_TEST_SKIP_AFFINITY 0
50#define __TBB_TEST_SKIP_AFFINITY 1
54#define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200 && \
55 ( _MSC_VER >= 1600 || __TBB_GLIBCXX_VERSION >= 40400 || ( _LIBCPP_VERSION && __cplusplus >= 201103L ) ) )
56#define __TBB_RANGE_BASED_FOR_PRESENT ( __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1300 )
57#define __TBB_SCOPED_ENUM_PRESENT ( __INTEL_CXX11_MODE__ && __INTEL_COMPILER > 1100 )
59#define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( __cplusplus >= 201103L && (__TBB_GLIBCXX_VERSION >= 40400 || _LIBCPP_VERSION) )
60#define __TBB_RANGE_BASED_FOR_PRESENT ( __has_feature(__cxx_range_for) )
61#define __TBB_SCOPED_ENUM_PRESENT ( __has_feature(cxx_strong_enums) )
63#define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400 )
64#define __TBB_RANGE_BASED_FOR_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40500 )
65#define __TBB_SCOPED_ENUM_PRESENT ( __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400 )
66#define __TBB_GCC_WARNING_IGNORED_ATTRIBUTES_PRESENT (__TBB_GCC_VERSION >= 60100)
68#define __TBB_CPP11_REFERENCE_WRAPPER_PRESENT ( _MSC_VER >= 1600 )
69#define __TBB_RANGE_BASED_FOR_PRESENT ( _MSC_VER >= 1700 )
70#define __TBB_SCOPED_ENUM_PRESENT ( _MSC_VER >= 1700 )
73#define __TBB_CPP14_GENERIC_LAMBDAS_PRESENT (__cpp_generic_lambdas >= 201304 )
75#define __TBB_TEST_SKIP_LAMBDA (__TBB_ICC_13_0_CPP11_STDLIB_SUPPORT_BROKEN || !__TBB_CPP11_LAMBDAS_PRESENT)
77#if __GNUC__ && __ANDROID__
79#define __TBB_THREAD_LOCAL_VARIABLES_PRESENT 0
81#define __TBB_THREAD_LOCAL_VARIABLES_PRESENT 1
85#define __TBB_ICC_BUILTIN_ATOMICS_POINTER_ALIASING_BROKEN (TBB_USE_ICC_BUILTINS && __INTEL_COMPILER < 1400 && __INTEL_COMPILER > 1200)
88#define __TBB_CPP11_EXCEPTION_IN_STATIC_TEST_BROKEN (__ANDROID__ && __SIZEOF_POINTER__==4 && __clang__)
92#define __TBB_CPP11_INIT_LIST_TEST_BROKEN (_MSC_VER <= 1800 && _MSC_VER && !__INTEL_COMPILER) || (__ANDROID__ && __TBB_x86_32 && __clang__)
94#define __TBB_CPP11_INIT_LIST_TEMP_OBJS_LIFETIME_BROKEN (_MSC_FULL_VER < 180030501 && _MSC_VER && !__INTEL_COMPILER)
97#define __TBB_CPP11_STD_PLACEHOLDERS_LINKAGE_BROKEN ((__INTEL_COMPILER == 1300 || __INTEL_COMPILER == 1310) && __GXX_EXPERIMENTAL_CXX0X__ && __GLIBCXX__ && __TBB_GLIBCXX_VERSION < 40500)
100#define __TBB_ICC_SCOPED_ENUM_WITH_UNDERLYING_TYPE_NEGATIVE_VALUE_BROKEN ( _MSC_VER && !__TBB_DEBUG && __INTEL_COMPILER && __INTEL_COMPILER <= 1500 )
102#define __TBB_ICC_SCOPED_ENUM_WITH_UNDERLYING_TYPE_ATOMIC_LOAD_BROKEN ( TBB_USE_ICC_BUILTINS && !__TBB_DEBUG && __INTEL_COMPILER && __INTEL_COMPILER <= 1500 )
105#define __TBB_CONSTEXPR_MEMBER_FUNCTION_BROKEN (__INTEL_COMPILER == 1500)
107#define __TBB_STATIC_CONSTEXPR_INIT_BROKEN (_MSC_VER >= 1900 && _MSC_VER <= 1914 && !__INTEL_COMPILER && _DEBUG)
109#if __GNUC__ && __ANDROID__
110#define __TBB_EXCEPTION_TYPE_INFO_BROKEN ( __TBB_GCC_VERSION < 40600 )
112#define __TBB_EXCEPTION_TYPE_INFO_BROKEN ( _MSC_VER < 1400 )
114#define __TBB_EXCEPTION_TYPE_INFO_BROKEN 0
118#define __TBB_FUNC_PTR_AS_TEMPL_PARAM_BROKEN ( ((__linux__ || __APPLE__) && __INTEL_COMPILER && __INTEL_COMPILER < 1100) || __SUNPRO_CC )
120#define __TBB_UNQUALIFIED_CALL_OF_DTOR_BROKEN (__GNUC__==3 && __GNUC_MINOR__<=3)
122#define __TBB_CAS_8_CODEGEN_BROKEN (__TBB_x86_32 && __PIC__ && __TBB_GCC_VERSION == 40102 && !__INTEL_COMPILER)
124#define __TBB_THROW_FROM_DTOR_BROKEN (__clang__ && __apple_build_version__ && __apple_build_version__ < 5000279)
127#define __TBB_STD_UNCAUGHT_EXCEPTION_BROKEN (__TBB_GLIBCXX_VERSION == 40407)
129#if __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN
130#define _EXCEPTION_PTR_H
131#define _GLIBCXX_NESTED_EXCEPTION_H
135#define __TBB_COMPLICATED_ADL_BROKEN ( __GNUC__ && __TBB_GCC_VERSION < 40400 )
138#if __INTEL_COMPILER && __INTEL_COMPILER < 1700
139#define __TBB_TUPLE_COMPARISON_COMPILATION_BROKEN (__TBB_GLIBCXX_VERSION >= 40800 || __MIC__)
143#if __INTEL_COMPILER && __INTEL_COMPILER < 1600 || __INTEL_COMPILER == 1600 && __INTEL_COMPILER_UPDATE <= 1
144#define __TBB_REFERENCE_WRAPPER_COMPILATION_BROKEN (__TBB_GLIBCXX_VERSION >= 40800 && __TBB_GLIBCXX_VERSION <= 50101 || __MIC__)
148#define __TBB_NOTHROW_MOVE_MEMBERS_IMPLICIT_GENERATION_BROKEN \
149 (__INTEL_COMPILER>=1600 && __INTEL_COMPILER<=1900 || __INTEL_COMPILER==1500 && __INTEL_COMPILER_UPDATE>3)
152#define __TBB_IS_COPY_CONSTRUCTIBLE_BROKEN ( _MSC_VER && (_MSC_VER <= 1700 || _MSC_VER <= 1800 && !__INTEL_COMPILER) )
155#if __GNUC__ && !__INTEL_COMPILER && !__clang__
156#define __TBB_GCC_OVERLOADED_TEMPLATE_FUNCTION_ADDRESS_BROKEN \
157 (__TBB_GCC_VERSION>=40700 && __TBB_GCC_VERSION<40704 || __TBB_GCC_VERSION>=40800 && __TBB_GCC_VERSION<40803 )
163#define __TBB_SCOPED_ALLOCATOR_BROKEN (__TBB_GCC_VERSION <= 50100 || (__APPLE__ && __TBB_CLANG_VERSION < 90000) || \
164 (__FreeBSD__ && __TBB_CLANG_VERSION <= 60000) || \
165 (__ANDROID__ && (_WIN32 || _WIN64)) || \
166 (_MSC_VER && _MSC_VER == 1912 && __INTEL_COMPILER == 1700))
175#ifndef MAX_TUPLE_TEST_SIZE
177#define MAX_TUPLE_TEST_SIZE 3
179#define MAX_TUPLE_TEST_SIZE 5
184#if MAX_TUPLE_TEST_SIZE > 8
185#undef MAX_TUPLE_TEST_SIZE
186#define MAX_TUPLE_TEST_SIZE 8
189#if MAX_TUPLE_TEST_SIZE > __TBB_VARIADIC_MAX
190#undef MAX_TUPLE_TEST_SIZE
191#define MAX_TUPLE_TEST_SIZE __TBB_VARIADIC_MAX
196#ifndef TBB_PREVIEW_FLOW_GRAPH_FEATURES
197#define TBB_PREVIEW_FLOW_GRAPH_FEATURES 1
199#ifndef TBB_PREVIEW_FLOW_GRAPH_TRACE
200#define TBB_PREVIEW_FLOW_GRAPH_TRACE 1
202#ifndef TBB_PREVIEW_ALGORITHM_TRACE
203#define TBB_PREVIEW_ALGORITHM_TRACE 1
205#ifndef TBB_DEPRECATED_LIMITER_NODE_CONSTRUCTOR
206#define TBB_DEPRECATED_LIMITER_NODE_CONSTRUCTOR 1
212#ifndef harness_assert_H
213#define harness_assert_H
224#define ASSERT_CUSTOM(p,message,file,line)
225#define ASSERT(p,message)
226#define ASSERT_WARNING(p,message)
261#ifndef tbb_tests_harness_report_H
262#define tbb_tests_harness_report_H
264#if defined(MAX_TRACE_SIZE) && MAX_TRACE_SIZE < 1024
267#ifndef MAX_TRACE_SIZE
268#define MAX_TRACE_SIZE 1024
280#include "tbb/tbb_config.h"
283#include "harness_mic.h"
286#ifdef HARNESS_INCOMPLETE_SOURCES
287#error Source files are not complete. Check the build environment
291#define snprintf _snprintf
293#define vsnprintf _vsnprintf
300#ifndef TbbHarnessReporter
306 OutputDebugStringA(msg);
326 Tracer() : m_flags(0), m_file(NULL), m_func(NULL), m_line(0) {}
339 const char* msg_fmt = fmt;
342 msg_fmt = msg_fmt_buf;
345 va_start(argptr, fmt);
358 static Tracer tracer;
362 static bool first_call =
false;
363 bool res = first_call;
371#if defined(_MSC_VER) && _MSC_VER >= 1300 || defined(__GNUC__) || defined(__GNUG__)
372#define HARNESS_TRACE_ORIG_INFO __FILE__, __LINE__, __FUNCTION__
374#define HARNESS_TRACE_ORIG_INFO __FILE__, __LINE__, ""
375#define __FUNCTION__ ""
381#define TRACE Harness::internal::tracer.set_trace_info(Harness::internal::Tracer::need_lf, HARNESS_TRACE_ORIG_INFO)->trace
384#define TRACENL Harness::internal::tracer.set_trace_info(0, HARNESS_TRACE_ORIG_INFO)->trace
387#define TRACEP Harness::internal::tracer.set_trace_info(Harness::internal::Tracer::prefix | \
388 Harness::internal::Tracer::need_lf, HARNESS_TRACE_ORIG_INFO)->trace
392#define REMARK !Verbose ? (void)0 : TRACENL
397#define REMARK_ONCE (!Verbose || Harness::internal::not_the_first_call<__LINE__>()) ? (void)0 : TRACE
401#define REPORT TRACENL
406#define REPORT_ONCE (Harness::internal::not_the_first_call<__LINE__>()) ? (void)0 : TRACENL
410#define HARNESS_NO_ASSERT 1
425#if !HARNESS_NO_ASSERT
429#include <tbb/tbb_stddef.h>
433 void (*default_terminate_handler)();
434 InitReporter() : default_terminate_handler(NULL) {
437 tbb::set_assertion_handler(ReportError);
439 ASSERT_WARNING(TBB_INTERFACE_VERSION <= tbb::TBB_runtime_interface_version(),
"runtime version mismatch");
441#if TBB_USE_EXCEPTIONS
442 default_terminate_handler = std::set_terminate(handle_terminate);
445 static void handle_terminate();
447static InitReporter InitReportError;
449void InitReporter::handle_terminate() {
450 REPORT(
"std::terminate called.\n");
452 if (InitReportError.default_terminate_handler) {
453 InitReportError.default_terminate_handler();
457typedef void (*test_error_extra_t)(void);
458static test_error_extra_t ErrorExtraCall;
460void SetHarnessErrorProcessing(test_error_extra_t extra_call) {
461 ErrorExtraCall = extra_call;
465void ReportError(
const char* filename,
int line,
const char* expression,
const char* message) {
467#if __TBB_ICL_11_1_CODE_GEN_BROKEN
468 printf(
"%s:%d, assertion %s: %s\n", filename, line, expression, message ? message :
"failed");
470 REPORT_FATAL_ERROR(
"%s:%d, assertion %s: %s\n", filename, line, expression, message ? message :
"failed");
475 fflush(stdout); fflush(stderr);
476#if HARNESS_TERMINATE_ON_ASSERT
477 TerminateProcess(GetCurrentProcess(), 1);
478#elif HARNESS_EXIT_ON_ASSERT
480#elif HARNESS_CONTINUE_ON_ASSERT
482#elif _MSC_VER && _DEBUG
484 if (1 == _CrtDbgReport(_CRT_ASSERT, filename, line, NULL,
"%s\r\n%s", expression, message ? message :
""))
491void ReportWarning(
const char* filename,
int line,
const char* expression,
const char* message) {
492 REPORT(
"Warning: %s:%d, assertion %s: %s\n", filename, line, expression, message ? message :
"failed");
497#define ASSERT(p,msg) (Harness::suppress_unused_warning(p), (void)0)
498#define ASSERT_WARNING(p,msg) (Harness::suppress_unused_warning(p), (void)0)
518template<
typename Index,
typename Body>
530#if __TBB_WIN8UI_SUPPORT
531 std::thread* thread_tmp =
new std::thread(thread_function,
this);
532 thread_handle = thread_tmp->native_handle();
535 unsigned stack_size = 0;
536#if HARNESS_THREAD_STACK_SIZE
537 stack_size = HARNESS_THREAD_STACK_SIZE;
539 thread_handle = (HANDLE)_beginthreadex(NULL, stack_size, thread_function,
this, 0, &thread_id);
541 ASSERT(thread_handle != 0,
"NativeParallelFor: _beginthreadex failed");
544#pragma warning (push)
545#pragma warning (disable: 2193)
551#if !defined(HARNESS_THREAD_STACK_SIZE)
552#if __i386__||__i386||__arm__
553 const size_t stack_size = 1 *
MByte;
555 const size_t stack_size = 2 *
MByte;
557 const size_t stack_size = 4 *
MByte;
560 const size_t stack_size = HARNESS_THREAD_STACK_SIZE;
562 pthread_attr_t attr_stack;
563 int status = pthread_attr_init(&attr_stack);
564 ASSERT(0 == status,
"NativeParallelFor: pthread_attr_init failed");
565 status = pthread_attr_setstacksize(&attr_stack, stack_size);
566 ASSERT(0 == status,
"NativeParallelFor: pthread_attr_setstacksize failed");
567 status = pthread_create(&thread_id, &attr_stack, thread_function,
this);
568 ASSERT(0 == status,
"NativeParallelFor: pthread_create failed");
569 pthread_attr_destroy(&attr_stack);
579 DWORD status = WaitForSingleObjectEx(thread_handle, INFINITE, FALSE);
580 ASSERT(status != WAIT_FAILED,
"WaitForSingleObject failed");
581 CloseHandle(thread_handle);
583 int status = pthread_join(thread_id, NULL);
584 ASSERT(!status,
"pthread_join failed");
593 HANDLE thread_handle;
605 static unsigned __stdcall thread_function(
void*
object)
607 static void* thread_function(
void*
object)
611 (self.body)(self.index);
612#if HARNESS_TBBMALLOC_THREAD_SHUTDOWN && __TBB_SOURCE_DIRECTLY_INCLUDED && (_WIN32||_WIN64)
616 __TBB_mallocThreadShutdownNotification();
622template<
typename Index,
typename Body>
628 task* array =
static_cast<task*
>(
operator new(n *
sizeof(task)));
631 for (Index i = 0; i != n; ++i)
632 new(&array[i]) task(i, body);
635 for (Index i = 0; i != n; ++i)
639 for (Index i = n; i; --i) {
640 array[i - 1].wait_to_finish();
641 array[i - 1].~task();
645 operator delete(array);
Tracer * set_trace_info(int flags, const char *file, size_t line, const char *func)
void trace(const char *fmt,...)
For internal use by template function NativeParallelFor.
NativeParallelForTask(Index index_, const Body &body_)
void wait_to_finish()
Wait for task to finish.
Base class for types that should not be assigned.
void operator=(const NoAssign &)=delete
NoAssign(const NoAssign &)=default
Base class for types that should not be copied or assigned.
NoCopy(const NoCopy &)=delete
void AssertSameType(const T &, const T &)
Compile-time error if x and y have different types.
#define ASSERT(p, message)
#define REPORT
printf style reporting macro
#define ASSERT_WARNING(p, message)
void NativeParallelFor(Index n, const Body &body)
bool not_the_first_call()
void suppress_unused_warning(const T &)
Utility template function to prevent "unused" warnings by various compilers.
Utility helper structure to ease overload resolution.
void Report(const char *msg)