/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
#include <folly/AtomicUnorderedMap.h>
-#include <folly/test/DeterministicSchedule.h>
+
+#include <memory>
#include <thread>
-#include <semaphore.h>
-#include <gflags/gflags.h>
-#include <gtest/gtest.h>
-#include <folly/Benchmark.h>
#include <unordered_map>
+#include <folly/Benchmark.h>
+#include <folly/portability/GFlags.h>
+#include <folly/portability/GTest.h>
+#include <folly/portability/Semaphore.h>
+#include <folly/test/DeterministicSchedule.h>
+
using namespace folly;
using namespace folly::test;
-template<class T>
+template <class T>
struct non_atomic {
T value;
T operator+=(T arg) { value += arg; return load();}
- T load(std::memory_order order= std::memory_order_seq_cst) const {
+ T load(std::memory_order /* order */ = std::memory_order_seq_cst) const {
return value;
}
/* implicit */
operator T() const {return load();}
- void store(T desired, std::memory_order order = std::memory_order_seq_cst) {
+ void store(T desired,
+ std::memory_order /* order */ = std::memory_order_seq_cst) {
value = desired;
}
- T exchange(T desired, std::memory_order order = std::memory_order_seq_cst) {
+ T exchange(T desired,
+ std::memory_order /* order */ = std::memory_order_seq_cst) {
T old = load();
store(desired);
return old;
}
bool compare_exchange_weak(
- T& expected, T desired,
- std::memory_order success = std::memory_order_seq_cst,
- std::memory_order failure = std::memory_order_seq_cst) {
+ T& expected,
+ T desired,
+ std::memory_order /* success */ = std::memory_order_seq_cst,
+ std::memory_order /* failure */ = std::memory_order_seq_cst) {
if (value == expected) {
value = desired;
return true;
}
bool compare_exchange_strong(
- T& expected, T desired,
- std::memory_order success = std::memory_order_seq_cst,
- std::memory_order failure = std::memory_order_seq_cst) {
+ T& expected,
+ T desired,
+ std::memory_order /* success */ = std::memory_order_seq_cst,
+ std::memory_order /* failure */ = std::memory_order_seq_cst) {
if (value == expected) {
value = desired;
return true;
bool is_lock_free() const {return true;}
};
-template <typename Key,
- typename Value,
- typename IndexType,
- template <typename> class Atom = std::atomic,
- typename Allocator = std::allocator<char>>
+template <
+ typename Key,
+ typename Value,
+ typename IndexType,
+ template <typename> class Atom = std::atomic,
+ typename Allocator = std::allocator<char>>
using UIM =
AtomicUnorderedInsertMap<Key,
Value,
namespace {
template <typename T>
struct AtomicUnorderedInsertMapTest : public ::testing::Test {};
-}
+} // namespace
// uint16_t doesn't make sense for most platforms, but we might as well
// test it
size_t capacity = 100000;
BENCHMARK_SUSPEND {
- ptr.reset(new AtomicUnorderedInsertMap<int,size_t>(capacity));
+ ptr = std::make_unique<AtomicUnorderedInsertMap<int, size_t>>(capacity);
for (size_t i = 0; i < capacity; ++i) {
auto k = 3 * ((5641 * i) % capacity);
ptr->emplace(k, k + 1);
std::vector<std::thread> threads;
BENCHMARK_SUSPEND {
- ptr.reset(new Map(capacity));
+ ptr = std::make_unique<Map>(capacity);
while (threads.size() < numThreads) {
threads.emplace_back([&](){
while (!go) {
if (!pr.second) {
pr.first->second.data++;
}
- } catch (std::bad_alloc& x) {
+ } catch (std::bad_alloc&) {
LOG(INFO) << "bad alloc";
}
}
int main(int argc, char ** argv) {
testing::InitGoogleTest(&argc, argv);
- google::ParseCommandLineFlags(&argc, &argv, true);
+ gflags::ParseCommandLineFlags(&argc, &argv, true);
int rv = RUN_ALL_TESTS();
folly::runBenchmarksOnFlag();
return rv;