brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 509d019 Raw
88 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// UNSUPPORTED: no-threads10 11// <thread>12 13// class thread14 15// void join();16 17#include <thread>18#include <new>19#include <cstdlib>20#include <cassert>21#include <system_error>22#include <atomic>23 24#include "make_test_thread.h"25#include "test_macros.h"26 27std::atomic_bool done(false);28 29class G30{31    int alive_;32public:33    static int n_alive;34    static bool op_run;35 36    G() : alive_(1) {++n_alive;}37    G(const G& g) : alive_(g.alive_) {++n_alive;}38    ~G() {alive_ = 0; --n_alive;}39 40    void operator()()41    {42        assert(alive_ == 1);43        assert(n_alive >= 1);44        op_run = true;45    }46};47 48int G::n_alive = 0;49bool G::op_run = false;50 51void foo() { done = true; }52 53int main(int, char**)54{55    {56        G g;57        std::thread t0 = support::make_test_thread(g);58        assert(t0.joinable());59        t0.join();60        assert(!t0.joinable());61#ifndef TEST_HAS_NO_EXCEPTIONS62        try {63            t0.join();64            assert(false);65        } catch (std::system_error const&) {66        }67#endif68    }69#ifndef TEST_HAS_NO_EXCEPTIONS70    {71        std::thread t0 = support::make_test_thread(foo);72        t0.detach();73        try {74            t0.join();75            assert(false);76        } catch (std::system_error const&) {77        }78        // Wait to make sure that the detached thread has started up.79        // Without this, we could exit main and start destructing global80        // resources that are needed when the thread starts up, while the81        // detached thread would start up only later.82        while (!done) {}83    }84#endif85 86  return 0;87}88