Skip to content

Commit 73248e3

Browse files
committed
SimDevice: only release GIL when calling API
Functions returned a py::str, which means the std::string -> py::str conversion was happening without the GIL. Fixes #144
1 parent 4170a81 commit 73248e3

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

subprojects/robotpy-hal/gen/SimDevice.yml

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,12 @@ inline_code: |
256256
.def_property("value", &SimBoolean::Get, &SimBoolean::Set, release_gil())
257257
.def("__repr__", [](const SimBoolean &self) -> py::str {
258258
if (self) {
259-
py::gil_scoped_release release;
260-
return std::string("<SimBoolean value=") + (self.Get() ? "True" : "False") + ">";
259+
bool value;
260+
{
261+
py::gil_scoped_release release;
262+
value = self.Get();
263+
}
264+
return std::string("<SimBoolean value=") + (value ? "True" : "False") + ">";
261265
} else {
262266
return "<SimBoolean (invalid)>";
263267
}
@@ -274,8 +278,12 @@ inline_code: |
274278
if (!self) {
275279
return "<invalid>";
276280
} else {
277-
py::gil_scoped_release release;
278-
return HALSIM_GetSimDeviceName(self);
281+
const char *name;
282+
{
283+
py::gil_scoped_release release;
284+
name = HALSIM_GetSimDeviceName(self);
285+
}
286+
return name;
279287
}
280288
#endif
281289
})
@@ -299,8 +307,12 @@ inline_code: |
299307
.def_property("value", &SimDouble::Get, &SimDouble::Set, release_gil())
300308
.def("__repr__", [](const SimDouble &self) -> py::str {
301309
if (self) {
302-
py::gil_scoped_release release;
303-
return "<SimDouble value=" + std::to_string(self.Get()) + ">";
310+
double value;
311+
{
312+
py::gil_scoped_release release;
313+
value = self.Get();
314+
}
315+
return "<SimDouble value=" + std::to_string(value) + ">";
304316
} else {
305317
return "<SimDouble (invalid)>";
306318
}
@@ -339,8 +351,12 @@ inline_code: |
339351
.def_property("value", &SimInt::Get, &SimInt::Set)
340352
.def("__repr__", [](const SimInt &self) -> py::str {
341353
if (self) {
342-
py::gil_scoped_release release;
343-
return "<SimInt value=" + std::to_string(self.Get()) + ">";
354+
int32_t value;
355+
{
356+
py::gil_scoped_release release;
357+
value = self.Get();
358+
}
359+
return "<SimInt value=" + std::to_string(value) + ">";
344360
} else {
345361
return "<SimInt (invalid)>";
346362
}
@@ -350,8 +366,12 @@ inline_code: |
350366
.def_property("value", &SimLong::Get, &SimLong::Set)
351367
.def("__repr__", [](const SimLong &self) -> py::str {
352368
if (self) {
353-
py::gil_scoped_release release;
354-
return "<SimLong value=" + std::to_string(self.Get()) + ">";
369+
int64_t value;
370+
{
371+
py::gil_scoped_release release;
372+
value = self.Get();
373+
}
374+
return "<SimLong value=" + std::to_string(value) + ">";
355375
} else {
356376
return "<SimLong (invalid)>";
357377
}

0 commit comments

Comments
 (0)