aboutsummaryrefslogtreecommitdiffstats
path: root/include/pybind11/functional.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/pybind11/functional.h')
-rw-r--r--include/pybind11/functional.h15
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>());
};