21 #include <gtest/gtest.h>
29 #if defined(OPENSSL_THREADS)
31 static unsigned g_once_init_called = 0;
33 static void once_init(
void) {
38 std::this_thread::sleep_for(std::chrono::milliseconds(1));
43 TEST(ThreadTest, Once) {
45 <<
"g_once_init_called was non-zero at start.";
47 auto call_once_func = [] {
CRYPTO_once(&g_test_once, once_init); };
48 std::thread thread1(call_once_func), thread2(call_once_func);
66 TEST(ThreadTest, InitZeros) {
72 Bytes((
uint8_t *)&once_init_value,
sizeof(once_init_value)));
74 Bytes((
uint8_t *)&mutex_init_value,
sizeof(mutex_init_value)));
76 Bytes((
uint8_t *)&ex_data_class_bss,
sizeof(ex_data_class_bss)),
77 Bytes((
uint8_t *)&ex_data_class_value,
sizeof(ex_data_class_value)));
81 static int g_test_thread_ok = 0;
82 static unsigned g_destructor_called_count = 0;
84 static void thread_local_destructor(
void *
arg) {
89 unsigned *
count =
reinterpret_cast<unsigned*
>(
arg);
93 TEST(ThreadTest, ThreadLocal) {
95 <<
"Thread-local data was non-NULL at start.";
100 &g_destructor_called_count,
101 thread_local_destructor) ||
103 &g_destructor_called_count) {
107 g_test_thread_ok = 1;
111 EXPECT_TRUE(g_test_thread_ok) <<
"Thread-local data didn't work in thread.";
120 TEST(ThreadTest, RandState) {
134 TEST(ThreadTest, InitThreads) {
138 std::vector<std::thread>
threads;
148 TEST(ThreadTest, PreSandboxInitThreads) {
152 std::vector<std::thread>
threads;
162 #endif // OPENSSL_THREADS