Make append and setLastQueuedCommand atomic

Two threads can enqueue to the same HostQueue (HostQueue::enqueue)
and result in last queued command being the first one reachine queue_.enqueue

NOTE: Temporarly make setLastQueuedCommand empty function to pass the build

Change-Id: Id09c3a28d184986f52b2ec86a2f6a18c40df1f0b
This commit is contained in:
Christophe Paquot
2020-07-10 08:32:15 -07:00
committed by Saleel Kudchadker
parent 453ea922a7
commit 3d15a1e291
3 changed files with 11 additions and 16 deletions
+10 -12
View File
@@ -185,7 +185,17 @@ void HostQueue::append(Command& command) {
}
command.retain();
command.setStatus(CL_QUEUED);
ScopedLock l(lastCmdLock_);
queue_.enqueue(&command);
if (!IS_HIP) {
return;
}
// Set last submitted command
if (lastEnqueueCommand_ != nullptr) {
lastEnqueueCommand_->release();
}
lastEnqueueCommand_ = &command;
lastEnqueueCommand_->retain();
}
bool HostQueue::isEmpty() {
@@ -193,18 +203,6 @@ bool HostQueue::isEmpty() {
return queue_.empty();
}
void HostQueue::setLastQueuedCommand(Command* lastCommand) {
// Set last submitted command
ScopedLock l(lastCmdLock_);
if (lastEnqueueCommand_ != nullptr) {
lastEnqueueCommand_->release();
}
lastEnqueueCommand_ = lastCommand;
if (lastCommand != nullptr) {
lastEnqueueCommand_->retain();
}
}
Command* HostQueue::getLastQueuedCommand(bool retain) {
// Get last submitted command
ScopedLock l(lastCmdLock_);