diff options
Diffstat (limited to 'include/pybind11/functional.h')
-rw-r--r-- | include/pybind11/functional.h | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/include/pybind11/functional.h b/include/pybind11/functional.h index 9cdf21f..7a0988a 100644 --- a/include/pybind11/functional.h +++ b/include/pybind11/functional.h @@ -54,9 +54,20 @@ public: } } - value = [func](Args... args) -> Return { + // ensure GIL is held during functor destruction + struct func_handle { + function f; + func_handle(function&& f_) : f(std::move(f_)) {} + func_handle(const func_handle&) = default; + ~func_handle() { + gil_scoped_acquire acq; + function kill_f(std::move(f)); + } + }; + + value = [hfunc = func_handle(std::move(func))](Args... args) -> Return { gil_scoped_acquire acq; - object retval(func(std::forward<Args>(args)...)); + object retval(hfunc.f(std::forward<Args>(args)...)); /* Visual studio 2015 parser issue: need parentheses around this expression */ return (retval.template cast<Return>()); }; |