1 // Copyright 2017 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "dso-ctor.h"
6 
7 #include <unittest/unittest.h>
8 #include <sched.h>
9 #include <stdbool.h>
10 
11 static bool dso_ctor_ran;
12 
13 static struct Global {
GlobalGlobal14     Global() { dso_ctor_ran = true; }
~GlobalGlobal15     ~Global() {
16         // This is just some random nonempty thing that the compiler
17         // can definitely never decide to optimize away.  We can't
18         // easily test that the destructor got run, but we can ensure
19         // that using a static destructor compiles and links correctly.
20         sched_yield();
21     }
22 } global;
23 
check_dso_ctor()24 bool check_dso_ctor() {
25     BEGIN_HELPER;
26     EXPECT_TRUE(dso_ctor_ran, "DSO global constuctor didn't run!");
27     END_HELPER;
28 }
29 
30 static bool dso_tlocal_ctor_ran, dso_tlocal_dtor_ran;
31 static thread_local ThreadLocal<&dso_tlocal_ctor_ran,
32                                 &dso_tlocal_dtor_ran> dso_tlocal;
33 
check_dso_tlocal_in_thread()34 bool check_dso_tlocal_in_thread() {
35     BEGIN_HELPER;
36     EXPECT_TRUE(decltype(dso_tlocal)::check_before_reference());
37     dso_tlocal.flag = true;
38     EXPECT_TRUE(decltype(dso_tlocal)::check_after_reference());
39     END_HELPER;
40 }
41 
check_dso_tlocal_after_join()42 bool check_dso_tlocal_after_join() {
43     BEGIN_HELPER;
44     EXPECT_TRUE(decltype(dso_tlocal)::check_after_join());
45     END_HELPER;
46 }
47