diff options
| author | Enji Cooper <ngie@FreeBSD.org> | 2023-08-11 08:41:49 +0000 |
|---|---|---|
| committer | Enji Cooper <ngie@FreeBSD.org> | 2023-08-11 08:41:49 +0000 |
| commit | dc9c7dc6ec9ecb5449d71d79ae13f9782c866b73 (patch) | |
| tree | 77811130a73711377eb46a3e3eb9fac15fdcf746 /lib/libpthread/h_thread_local_dtor.cpp | |
| parent | d328162dcb73d9041fe8ceb9fbae7276c3dacb53 (diff) | |
Diffstat (limited to 'lib/libpthread/h_thread_local_dtor.cpp')
| -rw-r--r-- | lib/libpthread/h_thread_local_dtor.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/libpthread/h_thread_local_dtor.cpp b/lib/libpthread/h_thread_local_dtor.cpp new file mode 100644 index 000000000000..337c207502db --- /dev/null +++ b/lib/libpthread/h_thread_local_dtor.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2016 Tavian Barnes. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__RCSID("$NetBSD: h_thread_local_dtor.cpp,v 1.1 2017/07/11 15:21:36 joerg Exp $"); + +#include <cstdlib> +#include <thread> + +static int seq; + +class OrderChecker { +public: + explicit OrderChecker(int n) : n_{n} { } + + ~OrderChecker() { + if (seq != n_) { + printf("Unexpected sequence point: %d\n", 3); + _Exit(1); + } + ++seq; + } + +private: + int n_; +}; + +template <int ID> +class CreatesThreadLocalInDestructor { +public: + ~CreatesThreadLocalInDestructor() { + thread_local OrderChecker checker{ID}; + } +}; + +OrderChecker global{7}; + +void thread_fn() { + static OrderChecker fn_static{5}; + thread_local CreatesThreadLocalInDestructor<2> creates_tl2; + thread_local OrderChecker fn_thread_local{1}; + thread_local CreatesThreadLocalInDestructor<0> creates_tl0; +} + +int main() { + static OrderChecker fn_static{6}; + + std::thread{thread_fn}.join(); + if (seq != 3) { + printf("Unexpected sequence point: %d\n", 3); + _Exit(1); + } + + thread_local OrderChecker fn_thread_local{4}; + thread_local CreatesThreadLocalInDestructor<3> creates_tl; + + return 0; +} |
