xref: /oneTBB/test/tbb/test_tick_count.cpp (revision b15aabb3)
151c0b2f7Stbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2005-2021 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 #include "common/test.h"
1851c0b2f7Stbbdev #include "common/utils.h"
1951c0b2f7Stbbdev #include "common/utils_concurrency_limit.h"
2051c0b2f7Stbbdev #include "common/spin_barrier.h"
2151c0b2f7Stbbdev 
2251c0b2f7Stbbdev #include <tbb/tick_count.h>
2351c0b2f7Stbbdev #include <thread>
2451c0b2f7Stbbdev 
2551c0b2f7Stbbdev //! \file test_tick_count.cpp
2651c0b2f7Stbbdev //! \brief Test for [timing] specification
2751c0b2f7Stbbdev 
2851c0b2f7Stbbdev //! Testing clock type of tbb::tick_count
2951c0b2f7Stbbdev //! Clock in tbb::tick_count should be steady
3051c0b2f7Stbbdev //! \brief \ref requirement
3151c0b2f7Stbbdev TEST_CASE("Clock in tbb::tick_count should be steady") {
3251c0b2f7Stbbdev     CHECK_EQ(tbb::tick_count::clock_type::is_steady, true);
3351c0b2f7Stbbdev }
3451c0b2f7Stbbdev 
3551c0b2f7Stbbdev #if TBB_USE_EXCEPTIONS
3651c0b2f7Stbbdev //! Subtraction of equal tick_counts should not throw
3751c0b2f7Stbbdev //! \brief \ref error_guessing
3851c0b2f7Stbbdev TEST_CASE("Subtraction of equal tick_counts should not throw") {
3951c0b2f7Stbbdev     tbb::tick_count tick_f = tbb::tick_count::now();
4051c0b2f7Stbbdev     tbb::tick_count tick_s(tick_f);
4151c0b2f7Stbbdev     CHECK_NOTHROW(tick_f - tick_s);
4251c0b2f7Stbbdev }
4351c0b2f7Stbbdev #endif
4451c0b2f7Stbbdev 
4551c0b2f7Stbbdev //! Test that two tick_count values recorded on different threads can be meaningfully subtracted.
4651c0b2f7Stbbdev //! \brief \ref error_guessing
4751c0b2f7Stbbdev TEST_CASE("Test for subtracting calls to tick_count from different threads") {
4851c0b2f7Stbbdev     auto num_of_threads = utils::get_platform_max_threads();
4951c0b2f7Stbbdev 
5051c0b2f7Stbbdev     utils::SpinBarrier thread_barrier(num_of_threads);
5151c0b2f7Stbbdev     tbb::tick_count start_time;
5251c0b2f7Stbbdev 
__anon7e030fbd0102(std::size_t ) 5351c0b2f7Stbbdev     auto diff_func = [&thread_barrier, &start_time] (std::size_t ) {
5451c0b2f7Stbbdev         thread_barrier.wait([&start_time] { start_time = tbb::tick_count::now(); });
5551c0b2f7Stbbdev 
5651c0b2f7Stbbdev         tbb::tick_count end_time(tbb::tick_count::now());
5751c0b2f7Stbbdev         while ((end_time - start_time).seconds() == 0) {
5851c0b2f7Stbbdev             end_time = tbb::tick_count::now();
5951c0b2f7Stbbdev         }
6051c0b2f7Stbbdev 
6151c0b2f7Stbbdev         CHECK_GT((end_time - start_time).seconds(), 0);
6251c0b2f7Stbbdev     };
6351c0b2f7Stbbdev 
6451c0b2f7Stbbdev     for (std::size_t i = 0; i < 10; ++i) {
6551c0b2f7Stbbdev         utils::NativeParallelFor(num_of_threads, diff_func);
6651c0b2f7Stbbdev     }
6751c0b2f7Stbbdev }
68