Skip to content

Commit 76e4a03

Browse files
committed
More LockManager test.
1 parent e7612a0 commit 76e4a03

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

src/lock/tests/LockManagerTest.cpp

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ BOOST_AUTO_TEST_SUITE(LockManagerSuite)
5656
BOOST_AUTO_TEST_SUITE(LockManagerTests)
5757

5858

59-
BOOST_AUTO_TEST_CASE(LockUnlockTest)
59+
BOOST_AUTO_TEST_CASE(LockUnlockWaitTest)
6060
{
6161
constexpr unsigned THREAD_COUNT = 8u;
6262
constexpr unsigned ITERATION_COUNT = 10'000u;
@@ -114,6 +114,65 @@ BOOST_AUTO_TEST_CASE(LockUnlockTest)
114114
}
115115

116116

117+
BOOST_AUTO_TEST_CASE(LockUnlockNoWaitTest)
118+
{
119+
constexpr unsigned THREAD_COUNT = 8u;
120+
constexpr unsigned ITERATION_COUNT = 10'000u;
121+
122+
ConfigFile configFile(ConfigFile::USE_TEXT, "\n");
123+
Config config(configFile);
124+
125+
LockManagerTestCallbacks callbacks;
126+
const string lockManagerId(getUniqueId().c_str());
127+
auto lockManager = std::make_unique<LockManager>(lockManagerId, &config);
128+
129+
unsigned lockSuccess = 0u;
130+
std::atomic_uint lockFail = 0;
131+
132+
std::vector<std::thread> threads;
133+
std::latch latch(THREAD_COUNT);
134+
135+
for (unsigned threadNum = 0u; threadNum < THREAD_COUNT; ++threadNum)
136+
{
137+
threads.emplace_back([&, threadNum]() {
138+
const UCHAR LOCK_KEY[] = {'1'};
139+
FbLocalStatus statusVector;
140+
LOCK_OWNER_T ownerId = threadNum + 1;
141+
SLONG ownerHandle = 0;
142+
143+
lockManager->initializeOwner(&statusVector, ownerId, LCK_OWNER_attachment, &ownerHandle);
144+
145+
latch.arrive_and_wait();
146+
147+
for (unsigned i = 0; i < ITERATION_COUNT; ++i)
148+
{
149+
const auto lockId = lockManager->enqueue(callbacks, &statusVector, 0,
150+
LCK_expression, LOCK_KEY, sizeof(LOCK_KEY), LCK_EX, nullptr, nullptr, 0, LCK_NO_WAIT, ownerHandle);
151+
152+
if (lockId)
153+
{
154+
++lockSuccess;
155+
lockManager->dequeue(lockId);
156+
}
157+
else
158+
++lockFail;
159+
}
160+
161+
lockManager->shutdownOwner(callbacks, &ownerHandle);
162+
});
163+
}
164+
165+
for (auto& thread : threads)
166+
thread.join();
167+
168+
BOOST_CHECK_GT(lockFail.load(), 0u);
169+
BOOST_CHECK_GT(lockSuccess, 0u);
170+
BOOST_CHECK_EQUAL(lockSuccess + lockFail, THREAD_COUNT * ITERATION_COUNT);
171+
172+
lockManager.reset();
173+
}
174+
175+
117176
BOOST_AUTO_TEST_SUITE_END() // LockManagerTests
118177
BOOST_AUTO_TEST_SUITE_END() // LockManagerSuite
119178
BOOST_AUTO_TEST_SUITE_END() // EngineSuite

0 commit comments

Comments
 (0)