summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/stacktrace/test/thread_safety_checking.cpp
blob: 98d9c23ab272b675225a08ce5075a454ccf9b6f0 (plain)
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
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright Antony Polukhin, 2016-2019.
//
// 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 <sstream>

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

#include <boost/timer/timer.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;
        }
    }
}

#if defined(BOOST_STACKTRACE_TEST_COM_PREINIT_MT) || defined(BOOST_STACKTRACE_TEST_COM_PREINIT_ST)
#   include <windows.h>
#   include "dbgeng.h"
#endif

int main() {
#if defined(BOOST_STACKTRACE_TEST_COM_PREINIT_MT)
    ::CoInitializeEx(0, COINIT_MULTITHREADED);
#elif defined(BOOST_STACKTRACE_TEST_COM_PREINIT_ST)
    ::CoInitializeEx(0, COINIT_APARTMENTTHREADED);
#endif

    boost::timer::auto_cpu_timer t;

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

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

#if defined(BOOST_STACKTRACE_TEST_COM_PREINIT_MT) || defined(BOOST_STACKTRACE_TEST_COM_PREINIT_ST)
    ::CoUninitialize();
#endif

    return boost::report_errors();
}