#include #include #include #include #include namespace NYT::NThreading { namespace { //////////////////////////////////////////////////////////////////////////////// #ifndef NDEBUG TEST(TSpinLockCountTest, SpinLock) { EXPECT_EQ(GetActiveSpinLockCount(), 0); TSpinLock lock; auto guard = Guard(lock); EXPECT_EQ(GetActiveSpinLockCount(), 1); guard.Release(); EXPECT_EQ(GetActiveSpinLockCount(), 0); } TEST(TSpinLockCountTest, RecursiveSpinLock) { EXPECT_EQ(GetActiveSpinLockCount(), 0); TRecursiveSpinLock lock; auto guard1 = Guard(lock); EXPECT_EQ(GetActiveSpinLockCount(), 1); auto guard2 = Guard(lock); EXPECT_EQ(GetActiveSpinLockCount(), 2); guard2.Release(); EXPECT_EQ(GetActiveSpinLockCount(), 1); guard1.Release(); EXPECT_EQ(GetActiveSpinLockCount(), 0); } TEST(TSpinLockCountTest, ForkAwareSpinLock) { EXPECT_EQ(GetActiveSpinLockCount(), 0); TForkAwareSpinLock lock; auto guard = Guard(lock); EXPECT_EQ(GetActiveSpinLockCount(), 1); guard.Release(); EXPECT_EQ(GetActiveSpinLockCount(), 0); } TEST(TSpinLockCountTest, RWSpinLock) { EXPECT_EQ(GetActiveSpinLockCount(), 0); TReaderWriterSpinLock lock; auto readerGuard = ReaderGuard(lock); EXPECT_EQ(GetActiveSpinLockCount(), 1); readerGuard.Release(); EXPECT_EQ(GetActiveSpinLockCount(), 0); auto writerGuard = WriterGuard(lock); EXPECT_EQ(GetActiveSpinLockCount(), 1); writerGuard.Release(); EXPECT_EQ(GetActiveSpinLockCount(), 0); } #endif //////////////////////////////////////////////////////////////////////////////// } // namespace } // namespace NYT::NThreading