aboutsummaryrefslogtreecommitdiff
path: root/lib/libpthread/h_thread_local_dtor.cpp
diff options
context:
space:
mode:
authorEnji Cooper <ngie@FreeBSD.org>2023-08-11 08:41:49 +0000
committerEnji Cooper <ngie@FreeBSD.org>2023-08-11 08:41:49 +0000
commitdc9c7dc6ec9ecb5449d71d79ae13f9782c866b73 (patch)
tree77811130a73711377eb46a3e3eb9fac15fdcf746 /lib/libpthread/h_thread_local_dtor.cpp
parentd328162dcb73d9041fe8ceb9fbae7276c3dacb53 (diff)
Diffstat (limited to 'lib/libpthread/h_thread_local_dtor.cpp')
-rw-r--r--lib/libpthread/h_thread_local_dtor.cpp80
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;
+}