blob: 7900b80237a70b48c8244f2eba0fcb7f8e345a42 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "dso-ctor.h"
#include <unittest/unittest.h>
#include <sched.h>
#include <stdbool.h>
static bool dso_ctor_ran;
static struct Global {
Global() { dso_ctor_ran = true; }
~Global() {
// This is just some random nonempty thing that the compiler
// can definitely never decide to optimize away. We can't
// easily test that the destructor got run, but we can ensure
// that using a static destructor compiles and links correctly.
sched_yield();
}
} global;
bool check_dso_ctor() {
BEGIN_HELPER;
EXPECT_TRUE(dso_ctor_ran, "DSO global constuctor didn't run!");
END_HELPER;
}
static bool dso_tlocal_ctor_ran, dso_tlocal_dtor_ran;
static thread_local ThreadLocal<&dso_tlocal_ctor_ran,
&dso_tlocal_dtor_ran> dso_tlocal;
bool check_dso_tlocal_in_thread() {
BEGIN_HELPER;
EXPECT_TRUE(decltype(dso_tlocal)::check_before_reference());
dso_tlocal.flag = true;
EXPECT_TRUE(decltype(dso_tlocal)::check_after_reference());
END_HELPER;
}
bool check_dso_tlocal_after_join() {
BEGIN_HELPER;
EXPECT_TRUE(decltype(dso_tlocal)::check_after_join());
END_HELPER;
}