Skip to content

Conversation

@aelovikov-intel
Copy link
Contributor

Most important part is the removal of a dedicated weak_object_base.hpp. It was introduced to break a cyclic headers dependency, but a forward declaration achieves the same in a much less intrusive way.

Once the header is removed and weak_object_base definitions are moved into weak_object.hpp where sycl::buffer/sycl::stream are complete we can move more common methods into the weak_object_base (see lock()).

The rest is minor stylistic improvements.

@aelovikov-intel
Copy link
Contributor Author

Going through individual commits might be easier to review, I kept them atomic.

@aelovikov-intel
Copy link
Contributor Author

aelovikov-intel commented Dec 5, 2025

Windows failure is basically this (I think):

#include <memory>
#include <type_traits>

struct ImplUtils {
  template <class Obj>
  static const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObj) {
    return SyclObj.impl;
  }
};

template <class Obj>
auto getSyclObjImpl(const Obj &SyclObj)
    -> decltype(ImplUtils::getSyclObjImpl(SyclObj)) {
  return ImplUtils::getSyclObjImpl(SyclObj);
}
template <typename SYCLObjT> class weak_object_base;

template <typename SYCLObjT>
decltype(weak_object_base<SYCLObjT>::MObjWeakPtr)
getSyclWeakObjImpl(const weak_object_base<SYCLObjT> &WeakObj);

template <class SyclObjT> class OwnerLessBase {
public:
  bool ext_oneapi_owner_before(
      const weak_object_base<SyclObjT> &Other) const noexcept {
    return getSyclObjImpl(*static_cast<const SyclObjT *>(this))
        .owner_before(getSyclWeakObjImpl(Other));
  }

  bool ext_oneapi_owner_before(const SyclObjT &Other) const noexcept {
    return getSyclObjImpl(*static_cast<const SyclObjT *>(this))
        .owner_before(getSyclObjImpl(Other));
  }
};

class device_impl;

class __declspec(dllexport) device : public OwnerLessBase<device> {
  friend ImplUtils;

public:
private:
  std::shared_ptr<device_impl> impl;
};
$ clang++ -fsyntax-only -xc++ a.ii -fms-extensions -Xclang -triple -Xclang  x86_64-windows-msvc
a.ii:27:23: error: no matching function for call to 'getSyclWeakObjImpl'
   27 |         .owner_before(getSyclWeakObjImpl(Other));
      |                       ^~~~~~~~~~~~~~~~~~
a.ii:22:33: note: in instantiation of member function 'OwnerLessBase<device>::ext_oneapi_owner_before' requested here
   22 | template <class SyclObjT> class OwnerLessBase {
      |                                 ^
a.ii:20:1: note: candidate template ignored: substitution failure [with SYCLObjT = device]: implicit instantiation of undefined template 'weak_object_base<device>'
   19 | decltype(weak_object_base<SYCLObjT>::MObjWeakPtr)
      |          ~~~~~~~~~~~~~~~~
   20 | getSyclWeakObjImpl(const weak_object_base<SYCLObjT> &WeakObj);
      | ^
1 error generated.

which should be solvable by ensuring weak_object.hpp is include in every sycl.dll's TU that uses OwnerLessBase (which isn't unreasonable). Not sure how to do that yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant