Skip to content

Commit b82cdd6

Browse files
Program MI_SEMAPHORE_WAIT for dependencies during blit operations
Change-Id: I8b0e467886bfb23d026a0c13be514343a22a20a1 Related-To: NEO-3020 Signed-off-by: Dunajski, Bartosz <[email protected]>
1 parent e6c7c86 commit b82cdd6

File tree

11 files changed

+100
-27
lines changed

11 files changed

+100
-27
lines changed

runtime/command_stream/command_stream_receiver.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ cl_int CommandStreamReceiver::expectMemory(const void *gfxAddress, const void *s
408408
}
409409

410410
void CommandStreamReceiver::blitWithHostPtr(Buffer &buffer, void *hostPtr, uint64_t hostPtrSize,
411-
BlitterConstants::BlitWithHostPtrDirection copyDirection) {
411+
BlitterConstants::BlitWithHostPtrDirection copyDirection, CsrDependencies &csrDependencies) {
412412
HostPtrSurface hostPtrSurface(hostPtr, static_cast<size_t>(hostPtrSize), true);
413413
bool success = createAllocationForHostSurface(hostPtrSurface, false);
414414
UNRECOVERABLE_IF(!success);
@@ -420,9 +420,9 @@ void CommandStreamReceiver::blitWithHostPtr(Buffer &buffer, void *hostPtr, uint6
420420
true, false, true));
421421

422422
if (BlitterConstants::BlitWithHostPtrDirection::FromHostPtr == copyDirection) {
423-
blitBuffer(buffer, *hostPtrBuffer, hostPtrSize);
423+
blitBuffer(buffer, *hostPtrBuffer, hostPtrSize, csrDependencies);
424424
} else {
425-
blitBuffer(*hostPtrBuffer, buffer, hostPtrSize);
425+
blitBuffer(*hostPtrBuffer, buffer, hostPtrSize, csrDependencies);
426426
}
427427
}
428428
} // namespace NEO

runtime/command_stream/command_stream_receiver.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,9 @@ class CommandStreamReceiver {
174174
this->latestSentTaskCount = latestSentTaskCount;
175175
}
176176

177-
void blitWithHostPtr(Buffer &buffer, void *hostPtr, uint64_t hostPtrSize, BlitterConstants::BlitWithHostPtrDirection copyDirection);
178-
virtual void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize) = 0;
177+
void blitWithHostPtr(Buffer &buffer, void *hostPtr, uint64_t hostPtrSize,
178+
BlitterConstants::BlitWithHostPtrDirection copyDirection, CsrDependencies &csrDependencies);
179+
virtual void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize, CsrDependencies &csrDependencies) = 0;
179180

180181
protected:
181182
void cleanupResources();

runtime/command_stream/command_stream_receiver_hw.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class CommandStreamReceiverHw : public CommandStreamReceiver {
7070
return CommandStreamReceiverType::CSR_HW;
7171
}
7272

73-
void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize) override;
73+
void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize, CsrDependencies &csrDependencies) override;
7474

7575
protected:
7676
using CommandStreamReceiver::osContext;

runtime/command_stream/command_stream_receiver_hw_base.inl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -725,18 +725,20 @@ bool CommandStreamReceiverHw<GfxFamily>::detectInitProgrammingFlagsRequired(cons
725725
}
726726

727727
template <typename GfxFamily>
728-
void CommandStreamReceiverHw<GfxFamily>::blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize) {
728+
void CommandStreamReceiverHw<GfxFamily>::blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize, CsrDependencies &csrDependencies) {
729729
using MI_BATCH_BUFFER_END = typename GfxFamily::MI_BATCH_BUFFER_END;
730730
using MI_FLUSH_DW = typename GfxFamily::MI_FLUSH_DW;
731731

732732
UNRECOVERABLE_IF(osContext->getEngineType() != aub_stream::EngineType::ENGINE_BCS);
733733

734734
auto lock = obtainUniqueOwnership();
735-
auto &commandStream = getCS(BlitCommandsHelper<GfxFamily>::estimateBlitCommandsSize(sourceSize));
735+
auto &commandStream = getCS(BlitCommandsHelper<GfxFamily>::estimateBlitCommandsSize(sourceSize, csrDependencies));
736736
auto commandStreamStart = commandStream.getUsed();
737737
auto newTaskCount = taskCount + 1;
738738
latestSentTaskCount = newTaskCount;
739739

740+
TimestampPacketHelper::programCsrDependencies<GfxFamily>(commandStream, csrDependencies);
741+
740742
BlitCommandsHelper<GfxFamily>::dispatchBlitCommandsForBuffer(dstBuffer, srcBuffer, commandStream, sourceSize);
741743

742744
auto miFlushDwCmd = reinterpret_cast<MI_FLUSH_DW *>(commandStream.getSpace(sizeof(MI_FLUSH_DW)));

runtime/helpers/blit_commands_helper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class LinearStream;
1515

1616
template <typename GfxFamily>
1717
struct BlitCommandsHelper {
18-
static size_t estimateBlitCommandsSize(uint64_t copySize);
18+
static size_t estimateBlitCommandsSize(uint64_t copySize, CsrDependencies &csrDependencies);
1919
static void dispatchBlitCommandsForBuffer(Buffer &dstBuffer, Buffer &srcBuffer, LinearStream &linearStream, uint64_t copySize);
2020
static void appendBlitCommandsForBuffer(Buffer &dstBuffer, Buffer &srcBuffer, typename GfxFamily::XY_COPY_BLT &blitCmd);
2121
};

runtime/helpers/blit_commands_helper_base.inl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace NEO {
1111

1212
template <typename GfxFamily>
13-
size_t BlitCommandsHelper<GfxFamily>::estimateBlitCommandsSize(uint64_t copySize) {
13+
size_t BlitCommandsHelper<GfxFamily>::estimateBlitCommandsSize(uint64_t copySize, CsrDependencies &csrDependencies) {
1414
size_t numberOfBlits = 0;
1515
uint64_t sizeToBlit = copySize;
1616
uint64_t width = 1;
@@ -30,7 +30,8 @@ size_t BlitCommandsHelper<GfxFamily>::estimateBlitCommandsSize(uint64_t copySize
3030
numberOfBlits++;
3131
}
3232

33-
size_t size = (sizeof(typename GfxFamily::XY_COPY_BLT) * numberOfBlits) +
33+
size_t size = TimestampPacketHelper::getRequiredCmdStreamSize<GfxFamily>(csrDependencies) +
34+
(sizeof(typename GfxFamily::XY_COPY_BLT) * numberOfBlits) +
3435
sizeof(typename GfxFamily::MI_FLUSH_DW) +
3536
sizeof(typename GfxFamily::MI_BATCH_BUFFER_END);
3637

runtime/mem_obj/buffer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,9 @@ Buffer *Buffer::create(Context *context,
277277
if (gpuCopyRequired) {
278278
auto blitCommandStreamReceiver = context->getCommandStreamReceiverForBlitOperation(*pBuffer);
279279
if (blitCommandStreamReceiver) {
280-
blitCommandStreamReceiver->blitWithHostPtr(*pBuffer, hostPtr, size, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr);
280+
CsrDependencies dependencies;
281+
blitCommandStreamReceiver->blitWithHostPtr(*pBuffer, hostPtr, size, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr,
282+
dependencies);
281283
} else {
282284
auto cmdQ = context->getSpecialQueue();
283285
if (CL_SUCCESS != cmdQ->enqueueWriteBuffer(pBuffer, CL_TRUE, 0, size, hostPtr, nullptr, 0, nullptr, nullptr)) {

unit_tests/command_stream/command_stream_receiver_hw_tests.cpp

Lines changed: 78 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "unit_tests/mocks/mock_internal_allocation_storage.h"
4242
#include "unit_tests/mocks/mock_kernel.h"
4343
#include "unit_tests/mocks/mock_submissions_aggregator.h"
44+
#include "unit_tests/mocks/mock_timestamp_container.h"
4445
#include "unit_tests/utilities/base_object_utils.h"
4546

4647
#include "reg_configs_common.h"
@@ -276,6 +277,7 @@ struct BcsTests : public CommandStreamReceiverHwTest {
276277
CommandStreamReceiverHwTest::TearDown();
277278
}
278279

280+
CsrDependencies csrDependencies;
279281
std::unique_ptr<MockContext> context;
280282
};
281283

@@ -291,13 +293,34 @@ HWTEST_F(BcsTests, givenBltSizeWhenEstimatingCommandSizeThenAddAllRequiredComman
291293
auto expectedAlignedSize = alignUp(expectedSize + (sizeof(typename FamilyType::XY_COPY_BLT) * alignedNumberOfBlts), MemoryConstants::cacheLineSize);
292294
auto expectedNotAlignedSize = alignUp(expectedSize + (sizeof(typename FamilyType::XY_COPY_BLT) * notAlignedNumberOfBlts), MemoryConstants::cacheLineSize);
293295

294-
auto alignedEstimatedSize = BlitCommandsHelper<FamilyType>::estimateBlitCommandsSize(alignedBltSize);
295-
auto notAlignedEstimatedSize = BlitCommandsHelper<FamilyType>::estimateBlitCommandsSize(notAlignedBltSize);
296+
auto alignedEstimatedSize = BlitCommandsHelper<FamilyType>::estimateBlitCommandsSize(alignedBltSize, csrDependencies);
297+
auto notAlignedEstimatedSize = BlitCommandsHelper<FamilyType>::estimateBlitCommandsSize(notAlignedBltSize, csrDependencies);
296298

297299
EXPECT_EQ(expectedAlignedSize, alignedEstimatedSize);
298300
EXPECT_EQ(expectedNotAlignedSize, notAlignedEstimatedSize);
299301
}
300302

303+
HWTEST_F(BcsTests, givenBltSizeAndCsrDependenciesWhenEstimatingCommandSizeThenAddAllRequiredCommands) {
304+
uint32_t numberOfBlts = 1;
305+
size_t numberNodesPerContainer = 5;
306+
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
307+
308+
MockTimestampPacketContainer timestamp0(*csr.getTimestampPacketAllocator(), numberNodesPerContainer);
309+
MockTimestampPacketContainer timestamp1(*csr.getTimestampPacketAllocator(), numberNodesPerContainer);
310+
csrDependencies.push_back(&timestamp0);
311+
csrDependencies.push_back(&timestamp1);
312+
313+
size_t expectedSize = sizeof(typename FamilyType::MI_FLUSH_DW) + sizeof(typename FamilyType::MI_BATCH_BUFFER_END) +
314+
(sizeof(typename FamilyType::XY_COPY_BLT) * numberOfBlts) +
315+
TimestampPacketHelper::getRequiredCmdStreamSize<FamilyType>(csrDependencies);
316+
317+
auto expectedAlignedSize = alignUp(expectedSize, MemoryConstants::cacheLineSize);
318+
319+
auto estimatedSize = BlitCommandsHelper<FamilyType>::estimateBlitCommandsSize(1, csrDependencies);
320+
321+
EXPECT_EQ(expectedAlignedSize, estimatedSize);
322+
}
323+
301324
HWTEST_F(BcsTests, givenBltSizeWithLeftoverWhenDispatchedThenProgramAllRequiredCommands) {
302325
using MI_FLUSH_DW = typename FamilyType::MI_FLUSH_DW;
303326
constexpr auto max2DBlitSize = BlitterConstants::maxBlitWidth * BlitterConstants::maxBlitHeight;
@@ -316,7 +339,7 @@ HWTEST_F(BcsTests, givenBltSizeWithLeftoverWhenDispatchedThenProgramAllRequiredC
316339
uint32_t newTaskCount = 19;
317340
csr.taskCount = newTaskCount - 1;
318341
EXPECT_EQ(0u, csr.recursiveLockCounter.load());
319-
csr.blitWithHostPtr(*buffer, hostPtr, bltSize, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr);
342+
csr.blitWithHostPtr(*buffer, hostPtr, bltSize, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr, csrDependencies);
320343
EXPECT_EQ(newTaskCount, csr.taskCount);
321344
EXPECT_EQ(newTaskCount, csr.latestFlushedTaskCount);
322345
EXPECT_EQ(newTaskCount, csr.latestSentTaskCount);
@@ -363,6 +386,50 @@ HWTEST_F(BcsTests, givenBltSizeWithLeftoverWhenDispatchedThenProgramAllRequiredC
363386
}
364387
}
365388

389+
HWTEST_F(BcsTests, givenCsrDependenciesWhenProgrammingCommandStreamThenAddSemaphoreAndAtomic) {
390+
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
391+
392+
cl_int retVal = CL_SUCCESS;
393+
auto buffer = clUniquePtr<Buffer>(Buffer::create(context.get(), CL_MEM_READ_WRITE, 1, nullptr, retVal));
394+
void *hostPtr = reinterpret_cast<void *>(0x12340000);
395+
uint32_t numberOfDependencyContainers = 2;
396+
size_t numberNodesPerContainer = 5;
397+
398+
MockTimestampPacketContainer timestamp0(*csr.getTimestampPacketAllocator(), numberNodesPerContainer);
399+
MockTimestampPacketContainer timestamp1(*csr.getTimestampPacketAllocator(), numberNodesPerContainer);
400+
csrDependencies.push_back(&timestamp0);
401+
csrDependencies.push_back(&timestamp1);
402+
403+
csr.blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr, csrDependencies);
404+
405+
HardwareParse hwParser;
406+
hwParser.parseCommands<FamilyType>(csr.commandStream);
407+
auto &cmdList = hwParser.cmdList;
408+
bool xyCopyBltCmdFound = false;
409+
bool dependenciesFound = false;
410+
411+
for (auto cmdIterator = cmdList.begin(); cmdIterator != cmdList.end(); cmdIterator++) {
412+
if (genCmdCast<typename FamilyType::XY_COPY_BLT *>(*cmdIterator)) {
413+
xyCopyBltCmdFound = true;
414+
continue;
415+
}
416+
auto miSemaphore = genCmdCast<typename FamilyType::MI_SEMAPHORE_WAIT *>(*cmdIterator);
417+
if (miSemaphore) {
418+
dependenciesFound = true;
419+
EXPECT_FALSE(xyCopyBltCmdFound);
420+
auto miAtomic = genCmdCast<typename FamilyType::MI_ATOMIC *>(*(++cmdIterator));
421+
EXPECT_NE(nullptr, miAtomic);
422+
423+
for (uint32_t i = 1; i < numberOfDependencyContainers * numberNodesPerContainer; i++) {
424+
EXPECT_NE(nullptr, genCmdCast<typename FamilyType::MI_SEMAPHORE_WAIT *>(*(++cmdIterator)));
425+
EXPECT_NE(nullptr, genCmdCast<typename FamilyType::MI_ATOMIC *>(*(++cmdIterator)));
426+
}
427+
}
428+
}
429+
EXPECT_TRUE(xyCopyBltCmdFound);
430+
EXPECT_TRUE(dependenciesFound);
431+
}
432+
366433
HWTEST_F(BcsTests, givenInputAllocationsWhenBlitDispatchedThenMakeAllAllocationsResident) {
367434
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
368435
csr.storeMakeResidentAllocations = true;
@@ -373,7 +440,7 @@ HWTEST_F(BcsTests, givenInputAllocationsWhenBlitDispatchedThenMakeAllAllocations
373440

374441
EXPECT_EQ(0u, csr.makeSurfacePackNonResidentCalled);
375442

376-
csr.blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr);
443+
csr.blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr, csrDependencies);
377444

378445
EXPECT_TRUE(csr.isMadeResident(buffer->getGraphicsAllocation()));
379446
EXPECT_TRUE(csr.isMadeResident(csr.commandStream.getGraphicsAllocation()));
@@ -397,7 +464,7 @@ HWTEST_F(BcsTests, givenBufferWhenBlitCalledThenFlushCommandBuffer) {
397464

398465
uint32_t newTaskCount = 17;
399466
csr.taskCount = newTaskCount - 1;
400-
csr.blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr);
467+
csr.blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr, csrDependencies);
401468

402469
EXPECT_EQ(commandStream.getGraphicsAllocation(), csr.latestFlushedBatchBuffer.commandBufferAllocation);
403470
EXPECT_EQ(commandStreamOffset, csr.latestFlushedBatchBuffer.startOffset);
@@ -442,7 +509,7 @@ HWTEST_F(BcsTests, whenBlitFromHostPtrCalledThenCallWaitWithKmdFallback) {
442509
auto buffer = clUniquePtr<Buffer>(Buffer::create(context.get(), CL_MEM_READ_WRITE, 1, nullptr, retVal));
443510
void *hostPtr = reinterpret_cast<void *>(0x12340000);
444511

445-
myMockCsr->blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr);
512+
myMockCsr->blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr, csrDependencies);
446513

447514
EXPECT_EQ(1u, myMockCsr->waitForTaskCountWithKmdNotifyFallbackCalled);
448515
EXPECT_EQ(myMockCsr->taskCount, myMockCsr->taskCountToWaitPassed);
@@ -464,13 +531,13 @@ HWTEST_F(BcsTests, whenBlitFromHostPtrCalledThenCleanTemporaryAllocations) {
464531
bcsCsr.taskCount = newTaskCount - 1;
465532

466533
EXPECT_EQ(0u, mockInternalAllocationsStorage->cleanAllocationsCalled);
467-
bcsCsr.blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr);
534+
bcsCsr.blitWithHostPtr(*buffer, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr, csrDependencies);
468535
EXPECT_EQ(1u, mockInternalAllocationsStorage->cleanAllocationsCalled);
469536
EXPECT_EQ(newTaskCount, mockInternalAllocationsStorage->lastCleanAllocationsTaskCount);
470537
EXPECT_TRUE(TEMPORARY_ALLOCATION == mockInternalAllocationsStorage->lastCleanAllocationUsage);
471538
}
472539

473-
HWTEST_F(BcsTests, givenHostPtrWhenBlitWithHostPtrCalledThenProgramCorrectGpuAddresses) {
540+
HWTEST_F(BcsTests, givenBufferWhenBlitOperationCalledThenProgramCorrectGpuAddresses) {
474541
auto &csr = pDevice->getUltCommandStreamReceiver<FamilyType>();
475542

476543
cl_int retVal = CL_SUCCESS;
@@ -481,7 +548,7 @@ HWTEST_F(BcsTests, givenHostPtrWhenBlitWithHostPtrCalledThenProgramCorrectGpuAdd
481548
{
482549
// from hostPtr
483550
HardwareParse hwParser;
484-
csr.blitWithHostPtr(*buffer1, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr);
551+
csr.blitWithHostPtr(*buffer1, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::FromHostPtr, csrDependencies);
485552

486553
hwParser.parseCommands<FamilyType>(csr.commandStream);
487554

@@ -494,7 +561,7 @@ HWTEST_F(BcsTests, givenHostPtrWhenBlitWithHostPtrCalledThenProgramCorrectGpuAdd
494561
// to hostPtr
495562
HardwareParse hwParser;
496563
auto offset = csr.commandStream.getUsed();
497-
csr.blitWithHostPtr(*buffer1, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::ToHostPtr);
564+
csr.blitWithHostPtr(*buffer1, hostPtr, 1, BlitterConstants::BlitWithHostPtrDirection::ToHostPtr, csrDependencies);
498565

499566
hwParser.parseCommands<FamilyType>(csr.commandStream, offset);
500567

@@ -507,7 +574,7 @@ HWTEST_F(BcsTests, givenHostPtrWhenBlitWithHostPtrCalledThenProgramCorrectGpuAdd
507574
// Buffer to Buffer
508575
HardwareParse hwParser;
509576
auto offset = csr.commandStream.getUsed();
510-
csr.blitBuffer(*buffer1, *buffer2, 1);
577+
csr.blitBuffer(*buffer1, *buffer2, 1, csrDependencies);
511578

512579
hwParser.parseCommands<FamilyType>(csr.commandStream, offset);
513580

unit_tests/kernel/kernel_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ class CommandStreamReceiverMock : public CommandStreamReceiver {
544544

545545
void waitForTaskCountWithKmdNotifyFallback(uint32_t taskCountToWait, FlushStamp flushStampToWait, bool quickKmdSleep, bool forcePowerSavingMode) override {
546546
}
547-
void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize) override{};
547+
void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize, CsrDependencies &csrDependencies) override{};
548548

549549
CompletionStamp flushTask(
550550
LinearStream &commandStream,

unit_tests/libult/ult_command_stream_receiver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
165165
return CommandStreamReceiverHw<GfxFamily>::obtainUniqueOwnership();
166166
}
167167

168-
void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize) override {
168+
void blitBuffer(Buffer &dstBuffer, Buffer &srcBuffer, uint64_t sourceSize, CsrDependencies &csrDependencies) override {
169169
blitBufferCalled++;
170-
CommandStreamReceiverHw<GfxFamily>::blitBuffer(dstBuffer, srcBuffer, sourceSize);
170+
CommandStreamReceiverHw<GfxFamily>::blitBuffer(dstBuffer, srcBuffer, sourceSize, csrDependencies);
171171
}
172172

173173
std::atomic<uint32_t> recursiveLockCounter;

0 commit comments

Comments
 (0)