void TestTaskHandle () { FIB_TEST_PROLOGUE(); uint_t sum = 0; for( unsigned i = 0; i < numRepeats; ++i ) sum += RunFib3(N); FIB_TEST_EPILOGUE(sum); }
void TestFib1 () { FIB_TEST_PROLOGUE(); uint_t sum = 0; for( unsigned i = 0; i < numRepeats; ++i ) sum += Fib_SpawnRightChildOnly(N); FIB_TEST_EPILOGUE(sum); }
void TestFibWithLambdas () { REMARK ("Lambdas test"); FIB_TEST_PROLOGUE(); atomic_t sum; sum = 0; Concurrency::task_group rg; for( unsigned i = 0; i < numRepeats; ++i ) rg.run( [&](){sum += Fib_SpawnBothChildren(N);} ); rg.wait(); FIB_TEST_EPILOGUE(sum); }
void TestFib2 () { FIB_TEST_PROLOGUE(); g_Sum = 0; Concurrency::task_group rg; for( unsigned i = 0; i < numRepeats - 1; ++i ) rg.run( &RunFib2 ); rg.wait(); rg.run( &RunFib2 ); rg.wait(); FIB_TEST_EPILOGUE(g_Sum); }
void TestTaskHandle2 () { FIB_TEST_PROLOGUE(); g_Sum = 0; task_group_type rg; typedef tbb::aligned_space<handle_type> handle_space_t; handle_space_t *handles = new handle_space_t[numRepeats]; handle_type *h = NULL; #if __TBB_ipf && __TBB_GCC_VERSION==40601 volatile // Workaround for unexpected exit from the loop below after the exception was caught #endif unsigned i = 0; for( ;; ++i ) { h = handles[i].begin(); #if __TBB_FUNC_PTR_AS_TEMPL_PARAM_BROKEN new ( h ) handle_type((void(*)())RunFib4<task_group_type>); #else new ( h ) handle_type(RunFib4<task_group_type>); #endif if ( i == numRepeats - 1 ) break; rg.run( *h ); #if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN bool caught = false; try { if( i&1 ) rg.run( *h ); else rg.run_and_wait( *h ); } catch ( Concurrency::invalid_multiple_scheduling& e ) { ASSERT( e.what(), "Error message is absent" ); caught = true; } catch ( ... ) { ASSERT ( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unrecognized exception" ); } ASSERT ( caught, "Expected invalid_multiple_scheduling exception is missing" ); #endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */ } ASSERT( i == numRepeats - 1, "unexpected exit from the loop" ); rg.run_and_wait( *h ); for( i = 0; i < numRepeats; ++i ) #if __TBB_UNQUALIFIED_CALL_OF_DTOR_BROKEN handles[i].begin()->Concurrency::task_handle<void(*)()>::~task_handle(); #else handles[i].begin()->~handle_type(); #endif delete []handles; FIB_TEST_EPILOGUE(g_Sum); }
void TestTaskHandle2 () { FIB_TEST_PROLOGUE(); g_Sum = 0; task_group_type rg; const unsigned hSize = sizeof(handle_type); char *handles = new char [numRepeats * hSize]; handle_type *h = NULL; for( unsigned i = 0; ; ++i ) { h = tbb::internal::punned_cast<handle_type*,char>(handles + i * hSize); #if __TBB_FUNC_PTR_AS_TEMPL_PARAM_BROKEN new ( h ) handle_type((void(*)())RunFib4<task_group_type>); #else new ( h ) handle_type(RunFib4<task_group_type>); #endif if ( i == numRepeats - 1 ) break; rg.run( *h ); #if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN bool caught = false; try { rg.run( *h ); } catch ( Concurrency::invalid_multiple_scheduling& e ) { ASSERT( e.what(), "Error message is absent" ); caught = true; } catch ( ... ) { ASSERT ( __TBB_EXCEPTION_TYPE_INFO_BROKEN, "Unrecognized exception" ); } ASSERT ( caught, "Expected invalid_multiple_scheduling exception is missing" ); #endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */ } rg.run_and_wait( *h ); for( unsigned i = 0; i < numRepeats; ++i ) #if __TBB_UNQUALIFIED_CALL_OF_DTOR_BROKEN tbb::internal::punned_cast<handle_type*,char>(handles + i * hSize)->Concurrency::task_handle<void(*)()>::~task_handle(); #else tbb::internal::punned_cast<handle_type*,char>(handles + i * hSize)->~handle_type(); #endif delete []handles; FIB_TEST_EPILOGUE(g_Sum); }