diff --git a/sycl/source/detail/event_impl.hpp b/sycl/source/detail/event_impl.hpp index 256f2cea18372..d33da055a4f8e 100644 --- a/sycl/source/detail/event_impl.hpp +++ b/sycl/source/detail/event_impl.hpp @@ -214,8 +214,16 @@ class event_impl { /// Returns worker queue for command. /// - /// @return a reference to MWorkerQueue. - QueueImplPtr &getWorkerQueue() { return MWorkerQueue; }; + /// @return shared_ptr to MWorkerQueue, please be aware it can be empty + /// pointer + QueueImplPtr getWorkerQueue() { return MWorkerQueue.lock(); }; + + /// Sets worker queue for command. + /// + /// @return + void setWorkerQueue(const QueueImplPtr &WorkerQueue) { + MWorkerQueue = WorkerQueue; + }; /// Checks if an event is in a fully intialized state. Default-constructed /// events will return true only after having initialized its native event, @@ -248,7 +256,7 @@ class event_impl { std::weak_ptr MQueue; const bool MIsProfilingEnabled = false; - QueueImplPtr MWorkerQueue; + std::weak_ptr MWorkerQueue; /// Dependency events prepared for waiting by backend. std::vector MPreparedDepsEvents; diff --git a/sycl/source/detail/scheduler/commands.cpp b/sycl/source/detail/scheduler/commands.cpp index 37c77ffe4c22c..9ab0eba9974d2 100644 --- a/sycl/source/detail/scheduler/commands.cpp +++ b/sycl/source/detail/scheduler/commands.cpp @@ -214,6 +214,8 @@ Command::getPiEvents(const std::vector &EventImpls) const { // current one is a host task. In this case we should not skip pi event due // to different sync mechanisms for different task types on in-order queue. const QueueImplPtr &WorkerQueue = getWorkerQueue(); + // MWorkerQueue in command is always not null. So check if + // EventImpl->getWorkerQueue != nullptr is implicit. if (EventImpl->getWorkerQueue() == WorkerQueue && WorkerQueue->isInOrder() && !isHostTask()) continue; @@ -410,12 +412,12 @@ void Command::waitForEvents(QueueImplPtr Queue, Command::Command(CommandType Type, QueueImplPtr Queue) : MQueue(std::move(Queue)), MEvent(std::make_shared(MQueue)), - MWorkerQueue(MEvent->getWorkerQueue()), MPreparedDepsEvents(MEvent->getPreparedDepsEvents()), MPreparedHostDepsEvents(MEvent->getPreparedHostDepsEvents()), MType(Type) { MSubmittedQueue = MQueue; MWorkerQueue = MQueue; + MEvent->setWorkerQueue(MWorkerQueue); MEvent->setCommand(this); MEvent->setContextImpl(MQueue->getContextImplPtr()); MEvent->setStateIncomplete(); @@ -1313,6 +1315,7 @@ MemCpyCommand::MemCpyCommand(Requirement SrcReq, } MWorkerQueue = MQueue->is_host() ? MSrcQueue : MQueue; + MEvent->setWorkerQueue(MWorkerQueue); emitInstrumentationDataProxy(); } @@ -1494,6 +1497,7 @@ MemCpyCommandHost::MemCpyCommandHost(Requirement SrcReq, } MWorkerQueue = MQueue->is_host() ? MSrcQueue : MQueue; + MEvent->setWorkerQueue(MWorkerQueue); emitInstrumentationDataProxy(); } diff --git a/sycl/source/detail/scheduler/commands.hpp b/sycl/source/detail/scheduler/commands.hpp index d95f0e307456a..f80d14d312afb 100644 --- a/sycl/source/detail/scheduler/commands.hpp +++ b/sycl/source/detail/scheduler/commands.hpp @@ -218,8 +218,7 @@ class Command { QueueImplPtr MQueue; QueueImplPtr MSubmittedQueue; EventImplPtr MEvent; - - QueueImplPtr &MWorkerQueue; + QueueImplPtr MWorkerQueue; /// Dependency events prepared for waiting by backend. /// See processDepEvent for details.