/*
- * Copyright 2012 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 <stdlib.h>
#include <unistd.h>
#include <vector>
+#include <thread>
-#include <boost/thread.hpp>
-
-#include "gtest/gtest.h"
+#include <gtest/gtest.h>
#include <gflags/gflags.h>
#include <glog/logging.h>
-#include "folly/RWSpinLock.h"
+#include <folly/RWSpinLock.h>
DEFINE_int32(num_threads, 8, "num threads");
};
typedef testing::Types<RWSpinLock
-#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64__) || \
- defined(ARCH_K8))
+#ifdef RW_SPINLOCK_USE_X86_INTRINSIC_
, RWTicketSpinLockT<32, true>,
RWTicketSpinLockT<32, false>,
RWTicketSpinLockT<64, true>,
++reads;
}
}
- VLOG(0) << "total reads: " << reads << "; total writes: " << writes;
+ // VLOG(0) << "total reads: " << reads << "; total writes: " << writes;
}
TYPED_TEST(RWSpinLockTest, ConcurrentTests) {
typedef typename TestFixture::RWSpinLockType RWSpinLockType;
RWSpinLockType l;
- srand(time(NULL));
+ srand(time(nullptr));
- std::vector<boost::thread> threads;
+ std::vector<std::thread> threads;
for (int i = 0; i < FLAGS_num_threads; ++i) {
- threads.push_back(boost::thread(&run<RWSpinLockType>, &l));
+ threads.push_back(std::thread(&run<RWSpinLockType>, &l));
}
sleep(1);
TEST(RWSpinLock, lock_unlock_tests) {
folly::RWSpinLock lock;
EXPECT_TRUE(lock.try_lock_upgrade());
- EXPECT_TRUE(lock.try_lock_shared());
+ EXPECT_FALSE(lock.try_lock_shared());
EXPECT_FALSE(lock.try_lock());
EXPECT_FALSE(lock.try_lock_upgrade());
lock.unlock_upgrade();
+ lock.lock_shared();
EXPECT_FALSE(lock.try_lock());
EXPECT_TRUE(lock.try_lock_upgrade());
lock.unlock_upgrade();
EXPECT_TRUE(lock.try_lock());
EXPECT_FALSE(lock.try_lock_upgrade());
lock.unlock_and_lock_upgrade();
- EXPECT_TRUE(lock.try_lock_shared());
- lock.unlock_shared();
+ EXPECT_FALSE(lock.try_lock_shared());
lock.unlock_upgrade_and_lock_shared();
lock.unlock_shared();
EXPECT_EQ(0, lock.bits());
}
TEST(RWSpinLock, concurrent_holder_test) {
- srand(time(NULL));
+ srand(time(nullptr));
folly::RWSpinLock lock;
std::atomic<int64_t> reads(0);
while (!stop.load(std::memory_order_acquire)) {
auto r = (uint32_t)(rand()) % 10;
if (r < 3) { // starts from write lock
- RWSpinLock::ReadHolder rg(
- RWSpinLock::UpgradedHolder ug(
- RWSpinLock::WriteHolder(&lock)));
+ RWSpinLock::ReadHolder rg{
+ RWSpinLock::UpgradedHolder{
+ RWSpinLock::WriteHolder{&lock}}};
writes.fetch_add(1, std::memory_order_acq_rel);;
-
} else if (r < 6) { // starts from upgrade lock
RWSpinLock::UpgradedHolder ug(&lock);
if (r < 4) {
}
upgrades.fetch_add(1, std::memory_order_acq_rel);;
} else {
- RWSpinLock::UpgradedHolder ug(
- RWSpinLock::WriteHolder(
- RWSpinLock::ReadHolder(&lock)));
+ RWSpinLock::ReadHolder rg{&lock};
reads.fetch_add(1, std::memory_order_acq_rel);
}
}
};
- std::vector<boost::thread> threads;
+ std::vector<std::thread> threads;
for (int i = 0; i < FLAGS_num_threads; ++i) {
- threads.push_back(boost::thread(go));
+ threads.push_back(std::thread(go));
}
sleep(5);
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
- google::ParseCommandLineFlags(&argc, &argv, true);
+ gflags::ParseCommandLineFlags(&argc, &argv, true);
return RUN_ALL_TESTS();
}