X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2Ftest%2FSynchronizedTestLib-inl.h;h=faf60f7cb93176197f2b3f9b739d152dcd6c9346;hp=99968fd93ac0795b3a8313527b6bf1b204aa79a3;hb=382372728d0f77c8d430577ea4cf77b53a56a4de;hpb=5d90c1385188d4632ce9a0f0e6bc5b83d4cf5138 diff --git a/folly/test/SynchronizedTestLib-inl.h b/folly/test/SynchronizedTestLib-inl.h index 99968fd9..faf60f7c 100644 --- a/folly/test/SynchronizedTestLib-inl.h +++ b/folly/test/SynchronizedTestLib-inl.h @@ -42,6 +42,7 @@ inline std::mt19937& getRNG() { void randomSleep(std::chrono::milliseconds min, std::chrono::milliseconds max) { std::uniform_int_distribution<> range(min.count(), max.count()); std::chrono::milliseconds duration(range(getRNG())); + /* sleep override */ std::this_thread::sleep_for(duration); } @@ -354,6 +355,104 @@ testWithLock() { }); } +template +void testUnlockCommon() { + folly::Synchronized value{7}; + const auto& cv = value; + + { + auto lv = value.contextualLock(); + EXPECT_EQ(7, *lv); + *lv = 5; + lv.unlock(); + EXPECT_TRUE(lv.isNull()); + EXPECT_FALSE(lv); + + auto rlv = cv.contextualLock(); + EXPECT_EQ(5, *rlv); + rlv.unlock(); + EXPECT_TRUE(rlv.isNull()); + EXPECT_FALSE(rlv); + + auto rlv2 = cv.contextualRLock(); + EXPECT_EQ(5, *rlv2); + rlv2.unlock(); + + lv = value.contextualLock(); + EXPECT_EQ(5, *lv); + *lv = 9; + } + + EXPECT_EQ(9, *value.contextualRLock()); +} + +// testUnlock() version for shared lock types +template +typename std::enable_if::is_shared>::type +testUnlock() { + folly::Synchronized value{10}; + { + auto lv = value.wlock(); + EXPECT_EQ(10, *lv); + *lv = 5; + lv.unlock(); + EXPECT_FALSE(lv); + EXPECT_TRUE(lv.isNull()); + + auto rlv = value.rlock(); + EXPECT_EQ(5, *rlv); + rlv.unlock(); + EXPECT_FALSE(rlv); + EXPECT_TRUE(rlv.isNull()); + + auto lv2 = value.wlock(); + EXPECT_EQ(5, *lv2); + *lv2 = 7; + + lv = std::move(lv2); + EXPECT_FALSE(lv2); + EXPECT_TRUE(lv2.isNull()); + EXPECT_FALSE(lv.isNull()); + EXPECT_EQ(7, *lv); + } + + testUnlockCommon(); +} + +// testUnlock() version for non-shared lock types +template +typename std::enable_if::is_shared>::type +testUnlock() { + folly::Synchronized value{10}; + { + auto lv = value.lock(); + EXPECT_EQ(10, *lv); + *lv = 5; + lv.unlock(); + EXPECT_TRUE(lv.isNull()); + EXPECT_FALSE(lv); + + auto lv2 = value.lock(); + EXPECT_EQ(5, *lv2); + *lv2 = 6; + lv2.unlock(); + EXPECT_TRUE(lv2.isNull()); + EXPECT_FALSE(lv2); + + lv = value.lock(); + EXPECT_EQ(6, *lv); + *lv = 7; + + lv2 = std::move(lv); + EXPECT_TRUE(lv.isNull()); + EXPECT_FALSE(lv); + EXPECT_FALSE(lv2.isNull()); + EXPECT_EQ(7, *lv2); + } + + testUnlockCommon(); +} + // Testing the deprecated SYNCHRONIZED and SYNCHRONIZED_CONST APIs template void testDeprecated() {