Skip to content

Commit 7c0eb15

Browse files
committed
Fix UB for try_lock()
Signed-off-by: Dmitry Vodopyanov <[email protected]>
1 parent f050b2a commit 7c0eb15

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

sycl/source/detail/scheduler/scheduler.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ EventImplPtr Scheduler::addCG(std::unique_ptr<detail::CG> CommandGroup,
6767
const bool IsKernel = CommandGroup->getType() == CG::KERNEL;
6868
{
6969
std::unique_lock<std::shared_timed_mutex> Lock(MGraphLock, std::defer_lock);
70-
while (!Lock.try_lock())
71-
;
70+
while (!Lock.owns_lock()) {
71+
Lock.try_lock();
72+
}
7273

7374
switch (CommandGroup->getType()) {
7475
case CG::UPDATE_HOST:
@@ -94,8 +95,9 @@ EventImplPtr Scheduler::addCG(std::unique_ptr<detail::CG> CommandGroup,
9495

9596
EventImplPtr Scheduler::addCopyBack(Requirement *Req) {
9697
std::unique_lock<std::shared_timed_mutex> Lock(MGraphLock, std::defer_lock);
97-
while (!Lock.try_lock())
98-
;
98+
while (!Lock.owns_lock()) {
99+
Lock.try_lock();
100+
}
99101
Command *NewCmd = MGraphBuilder.addCopyBack(Req);
100102
// Command was not creted because there were no operations with
101103
// buffer.
@@ -152,8 +154,9 @@ void Scheduler::cleanupFinishedCommands(EventImplPtr FinishedEvent) {
152154

153155
void Scheduler::removeMemoryObject(detail::SYCLMemObjI *MemObj) {
154156
std::unique_lock<std::shared_timed_mutex> Lock(MGraphLock, std::defer_lock);
155-
while (!Lock.try_lock())
156-
;
157+
while (!Lock.owns_lock()) {
158+
Lock.try_lock();
159+
}
157160

158161
MemObjRecord *Record = MGraphBuilder.getMemObjRecord(MemObj);
159162
if (!Record)
@@ -168,12 +171,13 @@ void Scheduler::removeMemoryObject(detail::SYCLMemObjI *MemObj) {
168171
EventImplPtr Scheduler::addHostAccessor(Requirement *Req,
169172
const bool destructor) {
170173
// Avoiding deadlock situation for MSVC. std::shared_timed_mutex specification
171-
// does not specify a priority for shared and exclusive locks. It will be a
174+
// does not specify a priority for shared and exclusive accesses. It will be a
172175
// deadlock in MSVC's std::shared_timed_mutex implementation, if exclusive
173-
// lock occurs after shared lock.
176+
// access occurs after shared access.
174177
std::unique_lock<std::shared_timed_mutex> Lock(MGraphLock, std::defer_lock);
175-
while (!Lock.try_lock())
176-
;
178+
while (!Lock.owns_lock()) {
179+
Lock.try_lock();
180+
}
177181

178182
Command *NewCmd = MGraphBuilder.addHostAccessor(Req, destructor);
179183

@@ -187,8 +191,8 @@ EventImplPtr Scheduler::addHostAccessor(Requirement *Req,
187191
}
188192

189193
void Scheduler::releaseHostAccessor(Requirement *Req) {
190-
Req->MBlockedCmd->MEnqueueStatus = EnqueueResultT::SyclEnqueueReady;
191194
std::shared_lock<std::shared_timed_mutex> Lock(MGraphLock);
195+
Req->MBlockedCmd->MEnqueueStatus = EnqueueResultT::SyclEnqueueReady;
192196
MemObjRecord *Record = Req->MSYCLMemObj->MRecord.get();
193197
auto EnqueueLeaves = [](CircularBuffer<Command *> &Leaves) {
194198
for (Command *Cmd : Leaves) {

0 commit comments

Comments
 (0)