Skip to content

Commit

Permalink
Create recursion guard and check for sorting only once
Browse files Browse the repository at this point in the history
Signed-off-by: Neil R. Spruit <[email protected]>
  • Loading branch information
nrspruit committed Feb 27, 2025
1 parent 0276d13 commit 41ad40a
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 17 deletions.
22 changes: 13 additions & 9 deletions scripts/templates/ldrddi.cpp.mako
Original file line number Diff line number Diff line change
Expand Up @@ -59,19 +59,23 @@ namespace loader
%elif re.match(r"\w+DriverGet$", th.make_func_name(n, tags, obj)) or re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)):
uint32_t total_driver_handle_count = 0;

%if namespace != "zes":
if (!loader::context->coredriverSortingCompleted) {
if (!loader::context->sortingInProgress.exchange(true)) {
%if namespace != "zes":
%if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)):
loader::context->coredriverSortingCompleted = loader::context->driverSorting(&loader::context->zeDrivers, nullptr);
std::call_once(loader::context->coreDriverSortOnce, []() {
loader::context->driverSorting(&loader::context->zeDrivers, nullptr);
});
%else:
loader::context->coredriverSortingCompleted = loader::context->driverSorting(&loader::context->zeDrivers, desc);
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
loader::context->driverSorting(&loader::context->zeDrivers, desc);
});
%endif
%else:
std::call_once(loader::context->sysmanDriverSortOnce, []() {
loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr);
});
%endif
}
%else:
if (!loader::context->sysmandriverSortingCompleted) {
loader::context->sysmandriverSortingCompleted = loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr);
}
%endif

%if namespace != "zes":
for( auto& drv : loader::context->zeDrivers )
Expand Down
12 changes: 8 additions & 4 deletions source/loader/ze_ldrddi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,10 @@ namespace loader

uint32_t total_driver_handle_count = 0;

if (!loader::context->coredriverSortingCompleted) {
loader::context->coredriverSortingCompleted = loader::context->driverSorting(&loader::context->zeDrivers, nullptr);
if (!loader::context->sortingInProgress.exchange(true)) {
std::call_once(loader::context->coreDriverSortOnce, []() {
loader::context->driverSorting(&loader::context->zeDrivers, nullptr);
});
}

for( auto& drv : loader::context->zeDrivers )
Expand Down Expand Up @@ -135,8 +137,10 @@ namespace loader

uint32_t total_driver_handle_count = 0;

if (!loader::context->coredriverSortingCompleted) {
loader::context->coredriverSortingCompleted = loader::context->driverSorting(&loader::context->zeDrivers, desc);
if (!loader::context->sortingInProgress.exchange(true)) {
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
loader::context->driverSorting(&loader::context->zeDrivers, desc);
});
}

for( auto& drv : loader::context->zeDrivers )
Expand Down
5 changes: 3 additions & 2 deletions source/loader/ze_loader_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,9 @@ namespace loader
bool intercept_enabled = false;
bool debugTraceEnabled = false;
bool tracingLayerEnabled = false;
bool coredriverSortingCompleted = false;
bool sysmandriverSortingCompleted = false;
std::once_flag coreDriverSortOnce;
std::once_flag sysmanDriverSortOnce;
std::atomic<bool> sortingInProgress = {false};
dditable_t tracing_dditable = {};
std::shared_ptr<Logger> zel_logger;
};
Expand Down
6 changes: 4 additions & 2 deletions source/loader/zes_ldrddi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,10 @@ namespace loader

uint32_t total_driver_handle_count = 0;

if (!loader::context->sysmandriverSortingCompleted) {
loader::context->sysmandriverSortingCompleted = loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr);
if (!loader::context->sortingInProgress.exchange(true)) {
std::call_once(loader::context->sysmanDriverSortOnce, []() {
loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr);
});
}

for( auto& drv : *loader::context->sysmanInstanceDrivers )
Expand Down

0 comments on commit 41ad40a

Please sign in to comment.