From 0e27c772aa88e84979ad2f7686bb7d21b035eb91 Mon Sep 17 00:00:00 2001 From: Alexander Mordvintsev Date: Wed, 7 Mar 2012 12:46:21 +0000 Subject: [PATCH] using RAII to manage GIL -- still fails to handle exceptions correctly --- modules/python/src2/cv2.cpp | 16 ++++++++++++++++ modules/python/src2/gen2.py | 7 ++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index b4e4611ee..8255265ca 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -105,6 +105,22 @@ static inline int* refcountFromPyObject(const PyObject* obj) return (int*)((size_t)obj + REFCOUNT_OFFSET); } +class PyAllowThreads +{ +public: + PyAllowThreads() : _state(PyEval_SaveThread()) + { + //printf("+GIL\n"); + } + ~PyAllowThreads() + { + PyEval_RestoreThread(_state); + //printf("-GIL\n"); + } +private: + PyThreadState* _state; +}; + class NumpyAllocator : public MatAllocator { public: diff --git a/modules/python/src2/gen2.py b/modules/python/src2/gen2.py index a76c51964..5eeaaa01c 100644 --- a/modules/python/src2/gen2.py +++ b/modules/python/src2/gen2.py @@ -19,9 +19,10 @@ gen_template_parse_args = Template("""const char* keywords[] = { $kw_list, NULL gen_template_func_body = Template("""$code_decl $code_parse { - Py_BEGIN_ALLOW_THREADS - $code_fcall; - Py_END_ALLOW_THREADS + { + PyAllowThreads allow; + $code_fcall; + } $code_ret; } """)