@@ -49,24 +49,40 @@ handler::handler(std::shared_ptr<detail::queue_impl> Queue,
4949 MSharedPtrStorage.push_back (std::move (ExtendedMembers));
5050}
5151
52+ static detail::ExtendedMemberT &getHandlerImplMember (
53+ std::vector<std::shared_ptr<const void >> &SharedPtrStorage) {
54+ assert (!SharedPtrStorage.empty ());
55+ std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
56+ detail::convertToExtendedMembers (SharedPtrStorage[0 ]);
57+ assert (ExtendedMembersVec->size () > 0 );
58+ auto &HandlerImplMember = (*ExtendedMembersVec)[0 ];
59+ assert (detail::ExtendedMembersType::HANDLER_IMPL == HandlerImplMember.MType );
60+ return HandlerImplMember;
61+ }
62+
5263// / Gets the handler_impl at the start of the extended members.
5364std::shared_ptr<detail::handler_impl> handler::getHandlerImpl () const {
5465 std::lock_guard<std::mutex> Lock (
5566 detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
67+ return std::static_pointer_cast<detail::handler_impl>(
68+ getHandlerImplMember (MSharedPtrStorage).MData );
69+ }
5670
57- assert (!MSharedPtrStorage.empty ());
58-
59- std::shared_ptr<std::vector<detail::ExtendedMemberT>> ExtendedMembersVec =
60- detail::convertToExtendedMembers (MSharedPtrStorage[0 ]);
61-
62- assert (ExtendedMembersVec->size () > 0 );
63-
64- auto HandlerImplMember = (*ExtendedMembersVec)[0 ];
71+ // / Gets the handler_impl at the start of the extended members and removes it.
72+ std::shared_ptr<detail::handler_impl> handler::evictHandlerImpl () const {
73+ std::lock_guard<std::mutex> Lock (
74+ detail::GlobalHandler::instance ().getHandlerExtendedMembersMutex ());
75+ auto &HandlerImplMember = getHandlerImplMember (MSharedPtrStorage);
76+ auto Impl =
77+ std::static_pointer_cast<detail::handler_impl>(HandlerImplMember.MData );
6578
66- assert (detail::ExtendedMembersType::HANDLER_IMPL == HandlerImplMember.MType );
79+ // Reset the data of the member.
80+ // NOTE: We let it stay because removing the front can be expensive. This will
81+ // be improved when the impl is made a member of handler. In fact eviction is
82+ // likely to not be needed when that happens.
83+ HandlerImplMember.MData .reset ();
6784
68- return std::static_pointer_cast<detail::handler_impl>(
69- HandlerImplMember.MData );
85+ return Impl;
7086}
7187
7288// Sets the submission state to indicate that an explicit kernel bundle has been
@@ -281,6 +297,10 @@ event handler::finalize() {
281297 return MLastEvent;
282298 }
283299
300+ // Evict handler_impl from extended members to make sure the command group
301+ // does not keep it alive.
302+ std::shared_ptr<detail::handler_impl> Impl = evictHandlerImpl ();
303+
284304 std::unique_ptr<detail::CG> CommandGroup;
285305 switch (type) {
286306 case detail::CG::Kernel:
@@ -293,7 +313,8 @@ event handler::finalize() {
293313 std::move (MArgsStorage), std::move (MAccStorage),
294314 std::move (MSharedPtrStorage), std::move (MRequirements),
295315 std::move (MEvents), std::move (MArgs), MKernelName, MOSModuleHandle,
296- std::move (MStreamStorage), MCGType, MCodeLoc));
316+ std::move (MStreamStorage), std::move (Impl->MAuxiliaryResources ),
317+ MCGType, MCodeLoc));
297318 break ;
298319 }
299320 case detail::CG::CodeplayInteropTask:
@@ -382,6 +403,10 @@ event handler::finalize() {
382403 return MLastEvent;
383404}
384405
406+ void handler::addReduction (const std::shared_ptr<const void > &ReduObj) {
407+ getHandlerImpl ()->MAuxiliaryResources .push_back (ReduObj);
408+ }
409+
385410void handler::associateWithHandler (detail::AccessorBaseHost *AccBase,
386411 access::target AccTarget) {
387412 detail::AccessorImplPtr AccImpl = detail::getSyclObjImpl (*AccBase);
0 commit comments