2 #include <cds/gc/dhp.h>
4 #include <cds/sync/rwlock.h>
5 #include <cds_test/stress_test.h>
13 typedef cds_others::RWLock RWLock;
14 class RWLockTest : public cds_test::stress_fixture {
18 static RWLock *rwlock;
19 static const int kReaderThreads = 0;
20 static const int kWriterThreads = 0;
21 static const int kReaderWriterThreads = 6;
22 static const int kWriterPercentage = 20;
23 static const int kRWPassCount = 20000;
25 static void SetUpTestCase() {}
27 static void ReaderThread() {
28 for (int i = 0; i < 10000; i++) {
29 for (int j = 0; j < 10; i++) {
30 if (rwlock->read_can_lock()) {
31 if (!rwlock->read_trylock()) {
35 rwlock->read_unlock();
39 rwlock->read_unlock();
45 static void WriterThread() {
46 for (int i = 0; i < 10000; i++) {
47 if (rwlock->write_can_lock()) {
48 if (!rwlock->write_trylock()) {
52 rwlock->write_unlock();
56 rwlock->write_unlock();
61 static void ReaderWriterThread() {
62 for (int i = 0; i < kRWPassCount; i++) {
63 for (int j = 0; j < kRWPassCount; j++) {
64 if (rand(100) < kWriterPercentage) {
65 if (rwlock->read_can_lock()) {
66 if (!rwlock->read_trylock()) {
70 rwlock->read_unlock();
74 rwlock->read_unlock();
77 if (rwlock->write_can_lock()) {
78 if (!rwlock->write_trylock()) {
82 rwlock->write_unlock();
86 rwlock->write_unlock();
96 RWLock *RWLockTest::rwlock;
97 const int RWLockTest::kReaderThreads;
98 const int RWLockTest::kWriterThreads;
99 const int RWLockTest::kReaderWriterThreads;
100 const int RWLockTest::kRWPassCount;
102 TEST_F(RWLockTest, BasicLockUnlock) {
103 rwlock = new RWLock();
104 int num_threads = kReaderThreads + kWriterThreads + kReaderWriterThreads;
105 std::thread *threads = new std::thread[num_threads];
106 for (int i = 0; i < kReaderThreads; i++) {
107 threads[i] = std::thread(ReaderThread);
109 for (int i = kReaderThreads; i < (kReaderThreads + kWriterThreads); i++) {
110 threads[i] = std::thread(WriterThread);
112 for (int i = (kReaderThreads + kWriterThreads); i < num_threads; i++) {
113 threads[i] = std::thread(ReaderWriterThread);
116 for (int i = 0; i < num_threads; i++) {