Fix call_guard usage inside .def_property calls.

See also [PR #5533](https://github.com/pybind/pybind11/pull/5533).

PiperOrigin-RevId: 886714838
Change-Id: I8c98461098ccf4958fb18bdcb5acc293c988c258
This commit is contained in:
Michael Moss
2026-03-20 04:50:13 -07:00
committed by Copybara-Service
parent 9fa3f6f77e
commit 02d1d3d503
+26 -41
View File
@@ -374,38 +374,29 @@ PYBIND11_MODULE(_simulate, pymodule) {
.def_property_readonly("d", &SimulateWrapper::GetData) .def_property_readonly("d", &SimulateWrapper::GetData)
.def_property_readonly("viewport", &SimulateWrapper::GetViewport) .def_property_readonly("viewport", &SimulateWrapper::GetViewport)
.def_property_readonly("ctrl_noise_std", .def_property_readonly("ctrl_noise_std",
GetIfNotNull(&mujoco::Simulate::ctrl_noise_std), py::cpp_function(GetIfNotNull(&mujoco::Simulate::ctrl_noise_std), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property_readonly("ctrl_noise_rate", .def_property_readonly("ctrl_noise_rate",
GetIfNotNull(&mujoco::Simulate::ctrl_noise_rate), py::cpp_function(GetIfNotNull(&mujoco::Simulate::ctrl_noise_rate), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property_readonly("real_time_index", .def_property_readonly("real_time_index",
GetIfNotNull(&mujoco::Simulate::real_time_index), py::cpp_function(GetIfNotNull(&mujoco::Simulate::real_time_index), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property("speed_changed", .def_property("speed_changed",
GetIfNotNull(&mujoco::Simulate::speed_changed), py::cpp_function(GetIfNotNull(&mujoco::Simulate::speed_changed), py::call_guard<py::gil_scoped_release>()),
SetIfNotNull(&mujoco::Simulate::speed_changed), py::cpp_function(SetIfNotNull(&mujoco::Simulate::speed_changed), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property("measured_slowdown", .def_property("measured_slowdown",
GetIfNotNull(&mujoco::Simulate::measured_slowdown), py::cpp_function(GetIfNotNull(&mujoco::Simulate::measured_slowdown), py::call_guard<py::gil_scoped_release>()),
SetIfNotNull(&mujoco::Simulate::measured_slowdown), py::cpp_function(SetIfNotNull(&mujoco::Simulate::measured_slowdown), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property_readonly("refresh_rate", .def_property_readonly("refresh_rate",
GetIfNotNull(&mujoco::Simulate::refresh_rate), py::cpp_function(GetIfNotNull(&mujoco::Simulate::refresh_rate), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property_readonly("busywait", .def_property_readonly("busywait",
GetIfNotNull(&mujoco::Simulate::busywait), py::cpp_function(GetIfNotNull(&mujoco::Simulate::busywait), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>()) .def_property_readonly("run", py::cpp_function(GetIfNotNull(&mujoco::Simulate::run), py::call_guard<py::gil_scoped_release>()))
.def_property_readonly("run", GetIfNotNull(&mujoco::Simulate::run),
py::call_guard<py::gil_scoped_release>())
.def_property_readonly("exitrequest", .def_property_readonly("exitrequest",
CallIfNotNull(+[](mujoco::Simulate& sim) { py::cpp_function(CallIfNotNull(+[](mujoco::Simulate& sim) {
return sim.exitrequest.load(); return sim.exitrequest.load();
}), }), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def("exit", .def("exit",
[](SimulateWrapper& wrapper) { [](SimulateWrapper& wrapper) {
mujoco::Simulate* sim = wrapper.simulate(); mujoco::Simulate* sim = wrapper.simulate();
@@ -419,10 +410,9 @@ PYBIND11_MODULE(_simulate, pymodule) {
}) })
.def_property_readonly("uiloadrequest", .def_property_readonly("uiloadrequest",
CallIfNotNull(+[](mujoco::Simulate& sim) { py::cpp_function(CallIfNotNull(+[](mujoco::Simulate& sim) {
return sim.uiloadrequest.load(); return sim.uiloadrequest.load();
}), }), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def("uiloadrequest_decrement", CallIfNotNull(+[](mujoco::Simulate& sim) { .def("uiloadrequest_decrement", CallIfNotNull(+[](mujoco::Simulate& sim) {
sim.uiloadrequest.fetch_sub(1); sim.uiloadrequest.fetch_sub(1);
}), }),
@@ -443,19 +433,16 @@ PYBIND11_MODULE(_simulate, pymodule) {
py::call_guard<py::gil_scoped_release>()) py::call_guard<py::gil_scoped_release>())
.def_property( .def_property(
"droploadrequest", CallIfNotNull(+[](mujoco::Simulate& sim) { "droploadrequest", py::cpp_function(CallIfNotNull(+[](mujoco::Simulate& sim) {
return sim.droploadrequest.load(); return sim.droploadrequest.load();
}), }), py::call_guard<py::gil_scoped_release>()),
CallIfNotNull(+[](mujoco::Simulate& sim, bool droploadrequest) { py::cpp_function(CallIfNotNull(+[](mujoco::Simulate& sim, bool droploadrequest) {
sim.droploadrequest.store(droploadrequest); sim.droploadrequest.store(droploadrequest);
}), }), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property_readonly("dropfilename", .def_property_readonly("dropfilename",
GetIfNotNull(&mujoco::Simulate::dropfilename), py::cpp_function(GetIfNotNull(&mujoco::Simulate::dropfilename), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property_readonly("filename", .def_property_readonly("filename",
GetIfNotNull(&mujoco::Simulate::filename), py::cpp_function(GetIfNotNull(&mujoco::Simulate::filename), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>())
.def_property( .def_property(
"load_error", GetIfNotNull(&mujoco::Simulate::load_error), "load_error", GetIfNotNull(&mujoco::Simulate::load_error),
CallIfNotNull(+[](mujoco::Simulate& sim, const std::string& error) { CallIfNotNull(+[](mujoco::Simulate& sim, const std::string& error) {
@@ -463,16 +450,14 @@ PYBIND11_MODULE(_simulate, pymodule) {
std::strncpy(sim.load_error, error.c_str(), max_length - 1); std::strncpy(sim.load_error, error.c_str(), max_length - 1);
sim.load_error[max_length - 1] = '\0'; sim.load_error[max_length - 1] = '\0';
})) }))
.def_property("ui0_enable", GetIfNotNull(&mujoco::Simulate::ui0_enable), .def_property("ui0_enable", py::cpp_function(GetIfNotNull(&mujoco::Simulate::ui0_enable), py::call_guard<py::gil_scoped_release>()),
CallIfNotNull(+[](mujoco::Simulate& sim, int enabled) { py::cpp_function(CallIfNotNull(+[](mujoco::Simulate& sim, int enabled) {
sim.ui0_enable = enabled; sim.ui0_enable = enabled;
}), }), py::call_guard<py::gil_scoped_release>()))
py::call_guard<py::gil_scoped_release>()) .def_property("ui1_enable", py::cpp_function(GetIfNotNull(&mujoco::Simulate::ui1_enable), py::call_guard<py::gil_scoped_release>()),
.def_property("ui1_enable", GetIfNotNull(&mujoco::Simulate::ui1_enable), py::cpp_function(CallIfNotNull(+[](mujoco::Simulate& sim, int enabled) {
CallIfNotNull(+[](mujoco::Simulate& sim, int enabled) {
sim.ui1_enable = enabled; sim.ui1_enable = enabled;
}), }), py::call_guard<py::gil_scoped_release>()));
py::call_guard<py::gil_scoped_release>());
pymodule.def("set_glfw_dlhandle", [](std::uintptr_t dlhandle) { pymodule.def("set_glfw_dlhandle", [](std::uintptr_t dlhandle) {
mujoco::Glfw(reinterpret_cast<void*>(dlhandle)); mujoco::Glfw(reinterpret_cast<void*>(dlhandle));