Home | History | Annotate | Line # | Download | only in libpthread
h_thread_local_dtor.cpp revision 1.1
      1  1.1  joerg /*
      2  1.1  joerg  * Copyright (c) 2016 Tavian Barnes. All rights reserved.
      3  1.1  joerg  *
      4  1.1  joerg  * Redistribution and use in source and binary forms, with or without
      5  1.1  joerg  * modification, are permitted provided that the following conditions
      6  1.1  joerg  * are met:
      7  1.1  joerg  * 1. Redistributions of source code must retain the above copyright
      8  1.1  joerg  *    notice, this list of conditions and the following disclaimer.
      9  1.1  joerg  * 2. Redistributions in binary form must reproduce the above copyright
     10  1.1  joerg  *    notice, this list of conditions and the following disclaimer in the
     11  1.1  joerg  *    documentation and/or other materials provided with the distribution.
     12  1.1  joerg  *
     13  1.1  joerg  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     14  1.1  joerg  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     15  1.1  joerg  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  1.1  joerg  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     17  1.1  joerg  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  1.1  joerg  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  1.1  joerg  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  1.1  joerg  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  1.1  joerg  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  1.1  joerg  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     23  1.1  joerg  * POSSIBILITY OF SUCH DAMAGE.
     24  1.1  joerg  */
     25  1.1  joerg 
     26  1.1  joerg #include <sys/cdefs.h>
     27  1.1  joerg __RCSID("$NetBSD: h_thread_local_dtor.cpp,v 1.1 2017/07/11 15:21:36 joerg Exp $");
     28  1.1  joerg 
     29  1.1  joerg #include <cstdlib>
     30  1.1  joerg #include <thread>
     31  1.1  joerg 
     32  1.1  joerg static int seq;
     33  1.1  joerg 
     34  1.1  joerg class OrderChecker {
     35  1.1  joerg public:
     36  1.1  joerg   explicit OrderChecker(int n) : n_{n} { }
     37  1.1  joerg 
     38  1.1  joerg   ~OrderChecker() {
     39  1.1  joerg     if (seq != n_) {
     40  1.1  joerg       printf("Unexpected sequence point: %d\n", 3);
     41  1.1  joerg       _Exit(1);
     42  1.1  joerg     }
     43  1.1  joerg     ++seq;
     44  1.1  joerg   }
     45  1.1  joerg 
     46  1.1  joerg private:
     47  1.1  joerg   int n_;
     48  1.1  joerg };
     49  1.1  joerg 
     50  1.1  joerg template <int ID>
     51  1.1  joerg class CreatesThreadLocalInDestructor {
     52  1.1  joerg public:
     53  1.1  joerg   ~CreatesThreadLocalInDestructor() {
     54  1.1  joerg     thread_local OrderChecker checker{ID};
     55  1.1  joerg   }
     56  1.1  joerg };
     57  1.1  joerg 
     58  1.1  joerg OrderChecker global{7};
     59  1.1  joerg 
     60  1.1  joerg void thread_fn() {
     61  1.1  joerg   static OrderChecker fn_static{5};
     62  1.1  joerg   thread_local CreatesThreadLocalInDestructor<2> creates_tl2;
     63  1.1  joerg   thread_local OrderChecker fn_thread_local{1};
     64  1.1  joerg   thread_local CreatesThreadLocalInDestructor<0> creates_tl0;
     65  1.1  joerg }
     66  1.1  joerg 
     67  1.1  joerg int main() {
     68  1.1  joerg   static OrderChecker fn_static{6};
     69  1.1  joerg 
     70  1.1  joerg   std::thread{thread_fn}.join();
     71  1.1  joerg   if (seq != 3) {
     72  1.1  joerg     printf("Unexpected sequence point: %d\n", 3);
     73  1.1  joerg     _Exit(1);
     74  1.1  joerg   }
     75  1.1  joerg 
     76  1.1  joerg   thread_local OrderChecker fn_thread_local{4};
     77  1.1  joerg   thread_local CreatesThreadLocalInDestructor<3> creates_tl;
     78  1.1  joerg 
     79  1.1  joerg   return 0;
     80  1.1  joerg }
     81