/*
- * Copyright 2017 Facebook, Inc.
+ * Copyright 2011-present 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 <array>
#include <atomic>
#include <chrono>
+#include <climits>
#include <condition_variable>
-#include <limits.h>
#include <map>
+#include <memory>
#include <mutex>
#include <set>
#include <thread>
#include <glog/logging.h>
-#include <folly/Baton.h>
#include <folly/Memory.h>
-#include <folly/ThreadId.h>
#include <folly/experimental/io/FsUtil.h>
#include <folly/portability/GTest.h>
#include <folly/portability/Unistd.h>
+#include <folly/synchronization/Baton.h>
+#include <folly/system/ThreadId.h>
using namespace folly;
Widget::totalVal_ = 0;
{
ThreadLocalPtr<Widget> w;
- auto source = folly::make_unique<Widget>();
+ auto source = std::make_unique<Widget>();
std::thread([&w, &source]() {
w.reset(std::move(source));
w.get()->val_ += 10;
{
std::lock_guard<std::mutex> g(lock);
thIterPrev = thIter;
- w.reset(new ThreadLocal<Widget>());
+ w = std::make_unique<ThreadLocal<Widget>>();
++wVersion;
}
while (true) {
std::atomic<int> totalAtomic(0);
std::vector<std::thread> threads;
for (int i = 0; i < kNumThreads; ++i) {
- threads.push_back(std::thread([&,i]() {
+ threads.push_back(std::thread([&]() {
stci.add(1);
totalAtomic.fetch_add(1);
- while (run.load()) { usleep(100); }
+ while (run.load()) {
+ usleep(100);
+ }
}));
}
while (totalAtomic.load() != kNumThreads) { usleep(100); }
struct Foo {
folly::ThreadLocal<int, Tag> tl;
};
-} // namespace
+} // namespace
TEST(ThreadLocal, Movable1) {
Foo a;
uint64_t data_[kFillObjectSize];
};
-} // namespace
+} // namespace
-#if FOLLY_HAVE_STD_THIS_THREAD_SLEEP_FOR
TEST(ThreadLocal, Stress) {
static constexpr size_t numFillObjects = 250;
std::array<ThreadLocalPtr<FillObject>, numFillObjects> objects;
EXPECT_EQ(numFillObjects * numThreads * numReps, gDestroyed);
}
-#endif
// Yes, threads and fork don't mix
// (http://cppwisdom.quora.com/Why-threads-and-fork-dont-mix) but if you're
return value;
}
-} // namespace
+} // namespace
#ifdef FOLLY_HAVE_PTHREAD_ATFORK
TEST(ThreadLocal, Fork) {
EXPECT_TRUE(WIFEXITED(status));
EXPECT_EQ(0, WEXITSTATUS(status));
} else {
- EXPECT_TRUE(false) << "fork failed";
+ ADD_FAILURE() << "fork failed";
}
EXPECT_EQ(2, totalValue());
EXPECT_TRUE(WIFEXITED(status));
EXPECT_EQ(0, WEXITSTATUS(status));
} else {
- EXPECT_TRUE(false) << "fork failed";
+ ADD_FAILURE() << "fork failed";
}
}
PthreadKeyUnregister p;
constexpr PthreadKeyUnregisterTester() = default;
};
-}}
+} // namespace threadlocal_detail
+} // namespace folly
TEST(ThreadLocal, UnregisterClassHasConstExprCtor) {
folly::threadlocal_detail::PthreadKeyUnregisterTester x;