File: thread_safety_checking.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (60 lines) | stat: -rw-r--r-- 1,545 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#include "test_impl.hpp"
#include <boost/stacktrace/stacktrace_fwd.hpp>

#include <chrono> 
#include <sstream>
#include <thread>

#include <boost/stacktrace.hpp>
#include <boost/optional.hpp>
#include <boost/core/lightweight_test.hpp>

using boost::stacktrace::stacktrace;


void main_test_loop() {
    std::size_t loops = 100;
    int Depth = 25;

    boost::optional<std::pair<stacktrace, stacktrace> > ethalon;
    std::stringstream ss_ethalon;

    while (--loops) {
        std::pair<stacktrace, stacktrace> res = function_from_library(Depth, function_from_main_translation_unit);
        if (ethalon) {
            BOOST_TEST(res == *ethalon);

            std::stringstream ss;
            ss << res.first;
            BOOST_TEST(ss.str() == ss_ethalon.str());
        } else {
            ethalon = res;
            ss_ethalon << ethalon->first;
        }
    }
}

int main() {
    const auto t = std::chrono::steady_clock::now();

    std::thread t1(main_test_loop);
    std::thread t2(main_test_loop);
    std::thread t3(main_test_loop);
    main_test_loop();

    t1.join();
    t2.join();
    t3.join();

    const auto elapsed = t - std::chrono::steady_clock::now();
    std::cout << "Elapsed: " << std::chrono::duration_cast<std::chrono::milliseconds>(
        elapsed
    ). count() << "ms";
    return boost::report_errors();
}