using RAII to manage GIL -- still fails to handle exceptions correctly
authorAlexander Mordvintsev <no@email>
Wed, 7 Mar 2012 12:46:21 +0000 (12:46 +0000)
committerAlexander Mordvintsev <no@email>
Wed, 7 Mar 2012 12:46:21 +0000 (12:46 +0000)
modules/python/src2/cv2.cpp
modules/python/src2/gen2.py

index b4e4611..8255265 100644 (file)
@@ -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:
index a76c519..5eeaaa0 100644 (file)
@@ -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;
     }
 """)