Multiple RTLInfoTy objects are stored in a list AllRTLs. Since
RTLInfoTy contains a std::mutex, it is by default not a copyable object.
In order to support AllRTLs.push_back(...) which is currently used, a customized
copy constructor is provided. Every time we need to add a new data member into
RTLInfoTy, we should keep in mind not forgetting to add corresponding assignment
in the copy constructor. In fact, the only use of the copy constructor is to push
the object into the list, we can of course write it in a way that first emplace
a new object back, and then use the reference to the last element. In this way we
don't need the copy constructor anymore. If the element is invalid, we just need
to pop it, and that's what this patch does.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
openmp/libomptarget/src/rtl.cpp | ||
---|---|---|
168–169 | The exit logic has a minor issue. Will fix it. |
Delighted to see the copy ctor go. That's an easy place to forget to update. It should probably be explicitly = delete.
Does the move constructor do the right thing on a std::mutex? It'll be called by the vector resizing. Will want it = default after the copy ctor is marked delete iirc.
openmp/libomptarget/src/rtl.cpp | ||
---|---|---|
101 | A plugin missing one of the required functions is an infrequent error. I think we can drop all the ValidPlugin && statements to get simpler code that runs faster in the normal case, and does a bunch of unnecessary but harmless dlsym on the failing path. |
std::mutex is non-copyable and non-movable. Any struct containing it will be marked non-copyable and non-movable implicitly. Actually I'm not sure how compiler handles this struct because if I explicitly add RTLInfoTy(RTLInfoTy &&) = default and RTLInfoTy(const RTLInfoTy &) = delete, the compiler complains "no matching constructor for initialization of 'RTLInfoTy'". However, everything seems all good if I don't do anything...
A plugin missing one of the required functions is an infrequent error.
I think we can drop all the ValidPlugin && statements to get simpler code that runs faster in the normal case, and does a bunch of unnecessary but harmless dlsym on the failing path.