SWDEV-264244 Fix StreamSync

Change-Id: I3a46a607a77aaf46dcd1fcf08db7e926613fe8d1
Dieser Commit ist enthalten in:
Satyanvesh Dittakavi
2020-12-14 07:27:56 -05:00
Ursprung 7648b2a61b
Commit a148a71075
2 geänderte Dateien mit 42 neuen und 25 gelöschten Zeilen
+39 -24
Datei anzeigen
@@ -183,47 +183,62 @@ void Event::processCallbacks(int32_t status) const {
}
}
void Event::waitForCompletion() {
ClPrint(LOG_DEBUG, LOG_WAIT, "waiting for event %p to complete, current status %d", this, status());
auto* queue = command().queue();
if ((queue != nullptr) && queue->vdev()->ActiveWait()) {
while (status() > CL_COMPLETE) {
amd::Os::yield();
}
} else {
ScopedLock lock(lock_);
// Wait until the status becomes CL_COMPLETE or negative.
while (status() > CL_COMPLETE) {
lock_.wait();
}
}
ClPrint(LOG_DEBUG, LOG_WAIT, "event %p wait completed", this);
}
bool Event::awaitCompletion() {
if (status() > CL_COMPLETE) {
// Notifies current command queue about waiting
if (!notifyCmdQueue()) {
Command* command = notifyCmdQueue(true);
if (command == nullptr) {
return false;
}
ClPrint(LOG_DEBUG, LOG_WAIT, "waiting for event %p to complete, current status %d", this, status());
auto* queue = command().queue();
if ((queue != nullptr) && queue->vdev()->ActiveWait()) {
while (status() > CL_COMPLETE) {
amd::Os::yield();
}
} else {
ScopedLock lock(lock_);
// Wait until the status becomes CL_COMPLETE or negative.
while (status() > CL_COMPLETE) {
lock_.wait();
}
command->waitForCompletion();
auto status = command->status();
command->release();
return status == CL_COMPLETE;
}
ClPrint(LOG_DEBUG, LOG_WAIT, "event %p wait completed", this);
}
// Command is already completed
return status() == CL_COMPLETE;
}
bool Event::notifyCmdQueue() {
Command* Event::notifyCmdQueue(bool retain) {
HostQueue* queue = command().queue();
if ((status() > CL_COMPLETE) && (NULL != queue) && !notified_.test_and_set()) {
// Make sure the queue is draining the enqueued commands.
amd::Command* command = new amd::Marker(*queue, false, nullWaitList, this);
if (command == NULL) {
amd::Command* internalCommand = new amd::Marker(*queue, false, nullWaitList, this);
if (internalCommand == NULL) {
notified_.clear();
return false;
return nullptr;
}
ClPrint(LOG_DEBUG, LOG_CMD, "queue marker to command queue: %p", queue);
command->enqueue();
command->release();
internalCommand->enqueue();
// if retain is false, release the command here, else release in the caller function
if (!retain) {
internalCommand->release();
}
return internalCommand;
}
return true;
if (retain) {
this->retain();
}
return &command();
}
const Event::EventWaitList Event::nullWaitList(0);