Sysman for Windows: Adding break from Listen.

Breaking from the Listen call via registerEvents(0).

Signed-off-by: Daniel Enriquez <daniel.enriquez.montanez@intel.com>
This commit is contained in:
Daniel Enriquez 2021-04-07 23:37:25 -07:00 committed by Compute-Runtime-Automation
parent 0aa6ec777c
commit b604ce4da5
2 changed files with 21 additions and 4 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -44,6 +44,8 @@ void WddmEventsImp::unregisterEvents() {
KmdSysman::RequestProperty request;
KmdSysman::ResponseProperty response;
SetEvent(exitHandle);
request.commandId = KmdSysman::Command::UnregisterEvent;
request.componentId = KmdSysman::Component::InterfaceProperties;
request.dataSize = sizeof(HANDLE);
@ -89,6 +91,7 @@ ze_result_t WddmEventsImp::eventRegister(zes_event_type_flags_t events) {
bool WddmEventsImp::eventListen(zes_event_type_flags_t &pEvent, uint32_t timeout) {
HANDLE events[MAXIMUM_WAIT_OBJECTS];
pEvent = 0;
if (eventList.size() == 0) {
return false;
@ -98,9 +101,19 @@ bool WddmEventsImp::eventListen(zes_event_type_flags_t &pEvent, uint32_t timeout
events[i] = eventList[i].windowsHandle;
}
uint32_t signaledEvent = WaitForMultipleObjects(static_cast<uint32_t>(eventList.size()), events, FALSE, timeout);
events[eventList.size()] = exitHandle;
// Setting the last handle for the exit handle, then the exit handle is signaled, it breaks from the wait.
uint32_t signaledEvent = WaitForMultipleObjects(static_cast<uint32_t>(eventList.size() + 1), events, FALSE, timeout);
// Was a timeout
if (signaledEvent == WAIT_TIMEOUT) {
return false;
}
// Was the exit event
if (signaledEvent >= eventList.size()) {
ResetEvent(exitHandle);
return false;
}
@ -112,6 +125,7 @@ bool WddmEventsImp::eventListen(zes_event_type_flags_t &pEvent, uint32_t timeout
WddmEventsImp::WddmEventsImp(OsSysman *pOsSysman) {
WddmSysmanImp *pWddmSysmanImp = static_cast<WddmSysmanImp *>(pOsSysman);
pKmdSysManager = &pWddmSysmanImp->getKmdSysManager();
exitHandle = CreateEvent(NULL, FALSE, FALSE, NULL);
}
OsEvents *OsEvents::create(OsSysman *pOsSysman) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -27,7 +27,9 @@ class WddmEventsImp : public OsEvents, NEO::NonCopyableOrMovableClass {
bool eventListen(zes_event_type_flags_t &pEvent, uint32_t timeout) override;
ze_result_t eventRegister(zes_event_type_flags_t events) override;
WddmEventsImp(OsSysman *pOsSysman);
~WddmEventsImp() = default;
~WddmEventsImp() {
CloseHandle(exitHandle);
}
// Don't allow copies of the WddmEventsImp object
WddmEventsImp(const WddmEventsImp &obj) = delete;
@ -36,6 +38,7 @@ class WddmEventsImp : public OsEvents, NEO::NonCopyableOrMovableClass {
private:
void registerEvents(zes_event_type_flags_t eventId, uint32_t requestId);
void unregisterEvents();
HANDLE exitHandle;
protected:
KmdSysManager *pKmdSysManager = nullptr;