@@ -56,7 +56,7 @@ BOOST_AUTO_TEST_SUITE(LockManagerSuite)
5656BOOST_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+
117176BOOST_AUTO_TEST_SUITE_END () // LockManagerTests
118177BOOST_AUTO_TEST_SUITE_END() // LockManagerSuite
119178BOOST_AUTO_TEST_SUITE_END() // EngineSuite
0 commit comments