@@ -260,7 +260,8 @@ class device_image_impl
260260                    ur_program_handle_t  Program, uint8_t  Origins, private_tag)
261261      : MBinImage(BinImage), MContext(std::move(Context)),
262262        MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
263-         MProgram(Program), MKernelIDs(std::move(KernelIDs)),
263+         MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
264+         MKernelIDs(std::move(KernelIDs)),
264265        MSpecConstsDefValBlob(getSpecConstsDefValBlob()), MOrigins(Origins) {
265266    updateSpecConstSymMap ();
266267    if  (BinImage && (MOrigins & ImageOriginSYCLBIN)) {
@@ -294,8 +295,8 @@ class device_image_impl
294295      std::unique_ptr<DynRTDeviceBinaryImage> &&MergedImageStorage, private_tag)
295296      : MBinImage(BinImage), MContext(std::move(Context)),
296297        MDevices(Devices.to<std::vector<device_impl *>>()), MState(State),
297-         MProgram(Program), MKernelIDs(std::move(KernelIDs )),
298-         MKernelNames{std::move (KernelNames)},
298+         MProgram(Program, getSyclObjImpl(MContext)->getAdapter( )),
299+         MKernelIDs(std::move(KernelIDs)),  MKernelNames{std::move (KernelNames)},
299300        MEliminatedKernelArgMasks{std::move (EliminatedKernelArgMasks)},
300301        MSpecConstsBlob (SpecConstsBlob),
301302        MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
@@ -311,7 +312,8 @@ class device_image_impl
311312                    private_tag)
312313      : MBinImage(BinImage), MContext(std::move(Context)),
313314        MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
314-         MProgram(Program), MKernelNames{std::move (KernelNames)},
315+         MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
316+         MKernelNames{std::move (KernelNames)},
315317        MEliminatedKernelArgMasks{std::move (EliminatedKernelArgMasks)},
316318        MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
317319        MOrigins (ImageOriginKernelCompiler),
@@ -329,8 +331,7 @@ class device_image_impl
329331      private_tag)
330332      : MBinImage(BinImage), MContext(std::move(Context)),
331333        MDevices (Devices.to<std::vector<device_impl *>>()), MState(State),
332-         MProgram(nullptr ), MKernelIDs(std::move(KernelIDs)),
333-         MKernelNames{std::move (KernelNames)},
334+         MKernelIDs(std::move(KernelIDs)), MKernelNames{std::move (KernelNames)},
334335        MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
335336        MOrigins(ImageOriginKernelCompiler),
336337        MRTCBinInfo(KernelCompilerBinaryInfo{
@@ -344,7 +345,7 @@ class device_image_impl
344345                    include_pairs_t  &&IncludePairsVec, private_tag)
345346      : MBinImage(Src), MContext(std::move(Context)),
346347        MDevices(Devices.to<std::vector<device_impl *>>()),
347-         MState(bundle_state::ext_oneapi_source), MProgram( nullptr ), 
348+         MState(bundle_state::ext_oneapi_source),
348349        MSpecConstsDefValBlob(getSpecConstsDefValBlob()),
349350        MOrigins(ImageOriginKernelCompiler),
350351        MRTCBinInfo(
@@ -357,7 +358,7 @@ class device_image_impl
357358                    private_tag)
358359      : MBinImage(Bytes), MContext(std::move(Context)),
359360        MDevices(Devices.to<std::vector<device_impl *>>()),
360-         MState(bundle_state::ext_oneapi_source), MProgram( nullptr ), 
361+         MState(bundle_state::ext_oneapi_source),
361362        MSpecConstsDefValBlob(getSpecConstsDefValBlob()),
362363        MOrigins(ImageOriginKernelCompiler),
363364        MRTCBinInfo(KernelCompilerBinaryInfo{Lang}) {
@@ -371,7 +372,8 @@ class device_image_impl
371372      : MBinImage(static_cast <const  RTDeviceBinaryImage *>(nullptr )),
372373        MContext(std::move(Context)),
373374        MDevices(Devices.to<std::vector<device_impl *>>()), MState(State),
374-         MProgram(Program), MKernelNames{std::move (KernelNames)},
375+         MProgram(Program, getSyclObjImpl(MContext)->getAdapter()),
376+         MKernelNames{std::move (KernelNames)},
375377        MSpecConstsDefValBlob (getSpecConstsDefValBlob()),
376378        MOrigins(ImageOriginKernelCompiler),
377379        MRTCBinInfo(KernelCompilerBinaryInfo{Lang}) {}
@@ -558,9 +560,7 @@ class device_image_impl
558560    return  get_devices ().contains (Dev);
559561  }
560562
561-   const  ur_program_handle_t  &get_ur_program_ref () const  noexcept  {
562-     return  MProgram;
563-   }
563+   ur_program_handle_t  get_ur_program () const  noexcept  { return  MProgram; }
564564
565565  const  RTDeviceBinaryImage *const  &get_bin_image_ref () const  {
566566    return  std::get<const  RTDeviceBinaryImage *>(MBinImage);
@@ -617,21 +617,25 @@ class device_image_impl
617617    return  NativeProgram;
618618  }
619619
620-   ~device_image_impl () {
621-     try  {
622-       if  (MProgram) {
623-         adapter_impl &Adapter = getSyclObjImpl (MContext)->getAdapter ();
624-         Adapter.call <UrApiKind::urProgramRelease>(MProgram);
625-       }
626-       if  (MSpecConstsBuffer) {
627-         std::lock_guard<std::mutex> Lock{MSpecConstAccessMtx};
628-         adapter_impl &Adapter = getSyclObjImpl (MContext)->getAdapter ();
629-         memReleaseHelper (Adapter, MSpecConstsBuffer);
630-       }
631-     } catch  (std::exception &e) {
632-       __SYCL_REPORT_EXCEPTION_TO_STREAM (" exception in ~device_image_impl"  , e);
620+ #ifdef  _MSC_VER
621+ #pragma  warning(push)
622+ //  https://developercommunity.visualstudio.com/t/False-C4297-warning-while-using-function/1130300
623+ //  https://godbolt.org/z/xsMvKf84f
624+ #pragma  warning(disable : 4297)
625+ #endif 
626+   ~device_image_impl () try  {
627+     if  (MSpecConstsBuffer) {
628+       std::lock_guard<std::mutex> Lock{MSpecConstAccessMtx};
629+       adapter_impl &Adapter = getSyclObjImpl (MContext)->getAdapter ();
630+       memReleaseHelper (Adapter, MSpecConstsBuffer);
633631    }
632+   } catch  (std::exception &e) {
633+     __SYCL_REPORT_EXCEPTION_TO_STREAM (" exception in ~device_image_impl"  , e);
634+     return ; //  Don't re-throw.
634635  }
636+ #ifdef  _MSC_VER
637+ #pragma  warning(pop)
638+ #endif 
635639
636640  std::string adjustKernelName (std::string_view Name) const  {
637641    if  (MOrigins & ImageOriginSYCLBIN) {
@@ -1298,7 +1302,7 @@ class device_image_impl
12981302  std::vector<device_impl *> MDevices;
12991303  bundle_state MState;
13001304  //  Native program handler which this device image represents
1301-   ur_program_handle_t  MProgram =  nullptr ;
1305+   Managed< ur_program_handle_t >  MProgram;
13021306
13031307  //  List of kernel ids available in this image, elements should be sorted
13041308  //  according to LessByNameComp. Shared between images for performance reasons
0 commit comments