/*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2015 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <atomic>
#include <chrono>
#include <condition_variable>
+#include <limits.h>
#include <map>
#include <mutex>
#include <set>
EXPECT_EQ(10, Widget::totalVal_);
}
+TEST(ThreadLocalPtr, CreateOnThreadExit) {
+ Widget::totalVal_ = 0;
+ ThreadLocal<Widget> w;
+ ThreadLocalPtr<int> tl;
+
+ std::thread([&] {
+ tl.reset(new int(1), [&] (int* ptr, TLPDestructionMode mode) {
+ delete ptr;
+ // This test ensures Widgets allocated here are not leaked.
+ ++w.get()->val_;
+ ThreadLocal<Widget> wl;
+ ++wl.get()->val_;
+ });
+ }).join();
+ EXPECT_EQ(2, Widget::totalVal_);
+}
+
// Test deleting the ThreadLocalPtr object
TEST(ThreadLocalPtr, CustomDeleter2) {
Widget::totalVal_ = 0;
TEST(ThreadLocal, InterleavedDestructors) {
Widget::totalVal_ = 0;
- ThreadLocal<Widget>* w = nullptr;
+ std::unique_ptr<ThreadLocal<Widget>> w;
int wVersion = 0;
const int wVersionMax = 2;
int thIter = 0;
{
std::lock_guard<std::mutex> g(lock);
thIterPrev = thIter;
- delete w;
- w = new ThreadLocal<Widget>();
+ w.reset(new ThreadLocal<Widget>());
++wVersion;
}
while (true) {
} // namespace
-#if FOLLY_HAVE_STD__THIS_THREAD__SLEEP_FOR
+#if FOLLY_HAVE_STD_THIS_THREAD_SLEEP_FOR
TEST(ThreadLocal, Stress) {
constexpr size_t numFillObjects = 250;
std::array<ThreadLocalPtr<FillObject>, numFillObjects> objects;
} // namespace
+#ifdef FOLLY_HAVE_PTHREAD_ATFORK
TEST(ThreadLocal, Fork) {
EXPECT_EQ(1, ptr->value()); // ensure created
EXPECT_EQ(1, totalValue());
EXPECT_EQ(1, totalValue());
}
+#endif
struct HoldsOneTag2 {};
}
}
+// clang is unable to compile this code unless in c++14 mode.
+#if __cplusplus >= 201402L
+namespace {
+// This will fail to compile unless ThreadLocal{Ptr} has a constexpr
+// default constructor. This ensures that ThreadLocal is safe to use in
+// static constructors without worrying about initialization order
+class ConstexprThreadLocalCompile {
+ ThreadLocal<int> a_;
+ ThreadLocalPtr<int> b_;
+
+ constexpr ConstexprThreadLocalCompile() {}
+};
+}
+#endif
+
// Simple reference implementation using pthread_get_specific
template<typename T>
class PThreadGetSpecific {