diff --git a/python/PyCGraph.cpp b/python/PyCGraph.cpp index cd4ad7e6..8886abaf 100644 --- a/python/PyCGraph.cpp +++ b/python/PyCGraph.cpp @@ -163,7 +163,15 @@ PYBIND11_MODULE(pycgraph, cg) { .def("unlock", &GParam::unlock, py::call_guard()) .def("tryLock", &GParam::tryLock, - py::call_guard()); + py::call_guard()) + .def("__enter__", [](GParam& self) -> GParam& { + self.lock(); + return self; + }, py::call_guard(), py::return_value_policy::reference_internal) + .def("__exit__", [](GParam& self, py::object, py::object, py::object) { + self.unlock(); + return false; + }, py::call_guard()); py::class_ >(cg, "GPassedParam") .def(py::init<>()); diff --git a/python/tutorial/MyGNode/MyReadParamNode.py b/python/tutorial/MyGNode/MyReadParamNode.py index cc313c93..5c8ba10b 100644 --- a/python/tutorial/MyGNode/MyReadParamNode.py +++ b/python/tutorial/MyGNode/MyReadParamNode.py @@ -13,8 +13,12 @@ class MyReadParamNode(GNode): def run(self): - param = self.getGParamWithNoEmpty("param1") - param.lock() - print('[{0}] value is {1}, count is {2}'.format(self.getName(), param.value, param.count)) - param.unlock() + param: MyParam = self.getGParamWithNoEmpty("param1") + + # use `with param:` as same as: + # param.lock() + # print('[{0}] value is {1}, count is {2}'.format(self.getName(), param.value, param.count)) + # param.unlock() + with param: + print('[{0}] value is {1}, count is {2}'.format(self.getName(), param.value, param.count)) return CStatus() diff --git a/python/tutorial/MyGNode/MyWriteParamNode.py b/python/tutorial/MyGNode/MyWriteParamNode.py index f4fae1ed..28e9311b 100644 --- a/python/tutorial/MyGNode/MyWriteParamNode.py +++ b/python/tutorial/MyGNode/MyWriteParamNode.py @@ -16,10 +16,10 @@ def init(self): def run(self): param: MyParam = self.getGParam("param1") - - param.lock() - param.count += 1 - param.value += 1 - print('[{0}] value is {1}, count is {2}'.format(self.getName(), param.value, param.count)) - param.unlock() + with param: + # user `with param` to enter thread safe area for param's info change + # as same as param.lock() and param.unlock() + param.count += 1 + param.value += 1 + print('[{0}] value is {1}, count is {2}'.format(self.getName(), param.value, param.count)) return CStatus()