pitrou commented on code in PR #38713:
URL: https://github.com/apache/arrow/pull/38713#discussion_r1394326106
##########
python/pyarrow/src/arrow/python/common.h:
##########
@@ -235,6 +238,48 @@ class ARROW_PYTHON_EXPORT OwnedRefNoGIL : public OwnedRef {
}
};
+template <template <typename...> typename SmartPtr, typename... Ts>
+class SmartPtrNoGIL : public SmartPtr<Ts...> {
+ using Base = SmartPtr<Ts...>;
+
+ public:
+ template <typename... Args>
+ SmartPtrNoGIL(Args&&... args) : Base(std::forward<Args>(args)...) {}
+
+ ~SmartPtrNoGIL() { reset(); }
+
+ template <typename... Args>
+ void reset(Args&&... args) {
+ auto release_guard = optional_gil_release();
+ Base::reset(std::forward<Args>(args)...);
+ }
+
+ template <typename V>
+ SmartPtrNoGIL& operator=(V&& v) {
+ auto release_guard = optional_gil_release();
+ Base::operator=(std::forward<V>(v));
+ return *this;
+ }
+
+ private:
+ // Only release the GIL if we own an object *and* the Python runtime is
+ // valid *and* the GIL is held.
+ std::optional<PyReleaseGIL> optional_gil_release() const {
+ if (this->get() != nullptr && Py_IsInitialized() && PyGILState_Check()) {
+ return PyReleaseGIL();
+ }
+ return {};
+ }
+};
+
+/// \brief A std::shared_ptr<T, ...> subclass that releases the GIL when
destroying T
+template <typename... Ts>
+using SharedPtrNoGIL = SmartPtrNoGIL<std::shared_ptr, Ts...>;
Review Comment:
> I _think_ that this will be fine since such a call would acquire the GIL
at the call site
Yes, it would.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]