diff --git a/sycl/source/detail/global_handler.cpp b/sycl/source/detail/global_handler.cpp index 9e5fbc94fb757..91aac69cd30aa 100644 --- a/sycl/source/detail/global_handler.cpp +++ b/sycl/source/detail/global_handler.cpp @@ -52,9 +52,7 @@ class ObjectUsageCounter { LockGuard Guard(GlobalHandler::MSyclGlobalHandlerProtector); GlobalHandler *RTGlobalObjHandler = GlobalHandler::getInstancePtr(); if (RTGlobalObjHandler) { - RTGlobalObjHandler->drainThreadPool(); - if (RTGlobalObjHandler->MScheduler.Inst) - RTGlobalObjHandler->MScheduler.Inst->releaseResources(); + RTGlobalObjHandler->prepareSchedulerToRelease(); } } } @@ -93,7 +91,7 @@ void GlobalHandler::attachScheduler(Scheduler *Scheduler) { // The method is used in unit tests only. Do not protect with lock since // releaseResources will cause dead lock due to host queue release if (MScheduler.Inst) - MScheduler.Inst->releaseResources(); + prepareSchedulerToRelease(); MScheduler.Inst.reset(Scheduler); } @@ -201,11 +199,17 @@ void GlobalHandler::unloadPlugins() { getPlugins().clear(); } -void GlobalHandler::drainThreadPool() { +void GlobalHandler::prepareSchedulerToRelease() { #ifndef _WIN32 + drainThreadPool(); + if (MScheduler.Inst) + MScheduler.Inst->releaseResources(); +#endif +} + +void GlobalHandler::drainThreadPool() { if (MHostTaskThreadPool.Inst) MHostTaskThreadPool.Inst->drain(); -#endif } void shutdown() { @@ -216,9 +220,7 @@ void shutdown() { // Ensure neither host task is working so that no default context is accessed // upon its release - Handler->drainThreadPool(); - if (Handler->MScheduler.Inst) - Handler->MScheduler.Inst->releaseResources(); + Handler->prepareSchedulerToRelease(); if (Handler->MHostTaskThreadPool.Inst) Handler->MHostTaskThreadPool.Inst->finishAndWait(); diff --git a/sycl/source/detail/global_handler.hpp b/sycl/source/detail/global_handler.hpp index a9b29a15b9391..11cb65879c647 100644 --- a/sycl/source/detail/global_handler.hpp +++ b/sycl/source/detail/global_handler.hpp @@ -77,6 +77,7 @@ class GlobalHandler { void unloadPlugins(); void releaseDefaultContexts(); void drainThreadPool(); + void prepareSchedulerToRelease(); // For testing purposes only void attachScheduler(Scheduler *Scheduler); diff --git a/sycl/source/detail/scheduler/scheduler.cpp b/sycl/source/detail/scheduler/scheduler.cpp index 144409dcb51a1..ed1a3ff8a2a47 100644 --- a/sycl/source/detail/scheduler/scheduler.cpp +++ b/sycl/source/detail/scheduler/scheduler.cpp @@ -392,7 +392,6 @@ Scheduler::Scheduler() { Scheduler::~Scheduler() { DefaultHostQueue.reset(); } void Scheduler::releaseResources() { -#ifndef _WIN32 // There might be some commands scheduled for post enqueue cleanup that // haven't been freed because of the graph mutex being locked at the time, // clean them up now. @@ -408,7 +407,6 @@ void Scheduler::releaseResources() { // added to deferred mem obj storage. So we may end up with leak. while (!isDeferredMemObjectsEmpty()) cleanupDeferredMemObjects(BlockingT::BLOCKING); -#endif } MemObjRecord *Scheduler::getMemObjRecord(const Requirement *const Req) {