Skip to content

Commit e112609

Browse files
[SYCL] Fix memory leak (queue_impl) due to intel#5901 (intel#6707)
Cross dependency event_impl vs queue_impl prevents objects release. Event_impl now has only weak pointer to queue. Signed-off-by: Tikhomirova, Kseniya <kseniya.tikhomirova@intel.com>
1 parent bbe3744 commit e112609

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

sycl/source/detail/event_impl.hpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,16 @@ class event_impl {
214214

215215
/// Returns worker queue for command.
216216
///
217-
/// @return a reference to MWorkerQueue.
218-
QueueImplPtr &getWorkerQueue() { return MWorkerQueue; };
217+
/// @return shared_ptr to MWorkerQueue, please be aware it can be empty
218+
/// pointer
219+
QueueImplPtr getWorkerQueue() { return MWorkerQueue.lock(); };
220+
221+
/// Sets worker queue for command.
222+
///
223+
/// @return
224+
void setWorkerQueue(const QueueImplPtr &WorkerQueue) {
225+
MWorkerQueue = WorkerQueue;
226+
};
219227

220228
/// Checks if an event is in a fully intialized state. Default-constructed
221229
/// events will return true only after having initialized its native event,
@@ -248,7 +256,7 @@ class event_impl {
248256
std::weak_ptr<queue_impl> MQueue;
249257
const bool MIsProfilingEnabled = false;
250258

251-
QueueImplPtr MWorkerQueue;
259+
std::weak_ptr<queue_impl> MWorkerQueue;
252260

253261
/// Dependency events prepared for waiting by backend.
254262
std::vector<EventImplPtr> MPreparedDepsEvents;

sycl/source/detail/scheduler/commands.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,8 @@ Command::getPiEvents(const std::vector<EventImplPtr> &EventImpls) const {
214214
// current one is a host task. In this case we should not skip pi event due
215215
// to different sync mechanisms for different task types on in-order queue.
216216
const QueueImplPtr &WorkerQueue = getWorkerQueue();
217+
// MWorkerQueue in command is always not null. So check if
218+
// EventImpl->getWorkerQueue != nullptr is implicit.
217219
if (EventImpl->getWorkerQueue() == WorkerQueue &&
218220
WorkerQueue->isInOrder() && !isHostTask())
219221
continue;
@@ -410,12 +412,12 @@ void Command::waitForEvents(QueueImplPtr Queue,
410412
Command::Command(CommandType Type, QueueImplPtr Queue)
411413
: MQueue(std::move(Queue)),
412414
MEvent(std::make_shared<detail::event_impl>(MQueue)),
413-
MWorkerQueue(MEvent->getWorkerQueue()),
414415
MPreparedDepsEvents(MEvent->getPreparedDepsEvents()),
415416
MPreparedHostDepsEvents(MEvent->getPreparedHostDepsEvents()),
416417
MType(Type) {
417418
MSubmittedQueue = MQueue;
418419
MWorkerQueue = MQueue;
420+
MEvent->setWorkerQueue(MWorkerQueue);
419421
MEvent->setCommand(this);
420422
MEvent->setContextImpl(MQueue->getContextImplPtr());
421423
MEvent->setStateIncomplete();
@@ -1313,6 +1315,7 @@ MemCpyCommand::MemCpyCommand(Requirement SrcReq,
13131315
}
13141316

13151317
MWorkerQueue = MQueue->is_host() ? MSrcQueue : MQueue;
1318+
MEvent->setWorkerQueue(MWorkerQueue);
13161319

13171320
emitInstrumentationDataProxy();
13181321
}
@@ -1494,6 +1497,7 @@ MemCpyCommandHost::MemCpyCommandHost(Requirement SrcReq,
14941497
}
14951498

14961499
MWorkerQueue = MQueue->is_host() ? MSrcQueue : MQueue;
1500+
MEvent->setWorkerQueue(MWorkerQueue);
14971501

14981502
emitInstrumentationDataProxy();
14991503
}

sycl/source/detail/scheduler/commands.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,7 @@ class Command {
218218
QueueImplPtr MQueue;
219219
QueueImplPtr MSubmittedQueue;
220220
EventImplPtr MEvent;
221-
222-
QueueImplPtr &MWorkerQueue;
221+
QueueImplPtr MWorkerQueue;
223222

224223
/// Dependency events prepared for waiting by backend.
225224
/// See processDepEvent for details.

0 commit comments

Comments
 (0)