@@ -56,7 +56,7 @@ BOOST_AUTO_TEST_SUITE(LockManagerSuite)
56
56
BOOST_AUTO_TEST_SUITE(LockManagerTests)
57
57
58
58
59
- BOOST_AUTO_TEST_CASE(LockUnlockTest )
59
+ BOOST_AUTO_TEST_CASE(LockUnlockWaitTest )
60
60
{
61
61
constexpr unsigned THREAD_COUNT = 8u ;
62
62
constexpr unsigned ITERATION_COUNT = 10'000u ;
@@ -114,6 +114,65 @@ BOOST_AUTO_TEST_CASE(LockUnlockTest)
114
114
}
115
115
116
116
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
+
117
176
BOOST_AUTO_TEST_SUITE_END () // LockManagerTests
118
177
BOOST_AUTO_TEST_SUITE_END() // LockManagerSuite
119
178
BOOST_AUTO_TEST_SUITE_END() // EngineSuite
0 commit comments