Several Python.Runtime problems

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Several Python.Runtime problems

Alexey Borzenkov
Hello,

While using Python.NET in one of my projects I found some problems:

1. PythonException uses Runtime.PyErr_Fetch before calling
AcquireLock, which is wrong. Here's the patch:

--- src/runtime/pythonexception.cs (revision 138)
+++ src/runtime/pythonexception.cs (working copy)
@@ -27,11 +27,11 @@

     public PythonException() : base()
     {
+        IntPtr gs = PythonEngine.AcquireLock();
         Runtime.PyErr_Fetch(ref _pyType, ref _pyValue, ref _pyTB);
         Runtime.Incref(_pyType);
         Runtime.Incref(_pyValue);
         Runtime.Incref(_pyTB);
-        IntPtr gs = PythonEngine.AcquireLock();
         if ((_pyType != IntPtr.Zero) && (_pyValue != IntPtr.Zero))
         {
             string type = new PyObject(_pyType).GetAttr("__name__").ToString();

2. Every time .NET code throws an exception Python.NET leaks memory,
because exception object is not decref'ed after calling
PyErr_SetObject. In my case there were lots of exceptions, so problem
was very noticable over time. Here's the patch:

-- src/runtime/exceptions.cs (revision 138)
+++ src/runtime/exceptions.cs (working copy)
@@ -473,6 +473,7 @@
             IntPtr etype = Runtime.PyObject_GetAttrString(op, "__class__");
             Runtime.PyErr_SetObject(etype, op);
             Runtime.Decref(etype);
+            Runtime.Decref(op);
         }

         /// <summary>

Hope this helps others in their fights for thread safety and against
memory leaks. :)

Thanks,
Alexey.
_________________________________________________
Python.NET mailing list - [hidden email]
http://mail.python.org/mailman/listinfo/pythondotnet
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Several Python.Runtime problems

Barton
Thanks, Alexey,
I've applied your patches to the trunk.
It's great to have on the project!

On 1/23/2012 12:33 PM, Alexey Borzenkov wrote:

> Hello,
>
> While using Python.NET in one of my projects I found some problems:
>
> 1. PythonException uses Runtime.PyErr_Fetch before calling
> AcquireLock, which is wrong. Here's the patch:
>
> --- src/runtime/pythonexception.cs (revision 138)
> +++ src/runtime/pythonexception.cs (working copy)
> @@ -27,11 +27,11 @@
>
>       public PythonException() : base()
>       {
> +        IntPtr gs = PythonEngine.AcquireLock();
>           Runtime.PyErr_Fetch(ref _pyType, ref _pyValue, ref _pyTB);
>           Runtime.Incref(_pyType);
>           Runtime.Incref(_pyValue);
>           Runtime.Incref(_pyTB);
> -        IntPtr gs = PythonEngine.AcquireLock();
>           if ((_pyType != IntPtr.Zero)&&  (_pyValue != IntPtr.Zero))
>           {
>               string type = new PyObject(_pyType).GetAttr("__name__").ToString();
>
> 2. Every time .NET code throws an exception Python.NET leaks memory,
> because exception object is not decref'ed after calling
> PyErr_SetObject. In my case there were lots of exceptions, so problem
> was very noticable over time. Here's the patch:
>
> -- src/runtime/exceptions.cs (revision 138)
> +++ src/runtime/exceptions.cs (working copy)
> @@ -473,6 +473,7 @@
>               IntPtr etype = Runtime.PyObject_GetAttrString(op, "__class__");
>               Runtime.PyErr_SetObject(etype, op);
>               Runtime.Decref(etype);
> +            Runtime.Decref(op);
>           }
>
>           ///<summary>
>
> Hope this helps others in their fights for thread safety and against
> memory leaks. :)
>
> Thanks,
> Alexey.
> _________________________________________________
> Python.NET mailing list - [hidden email]
> http://mail.python.org/mailman/listinfo/pythondotnet
>
_________________________________________________
Python.NET mailing list - [hidden email]
http://mail.python.org/mailman/listinfo/pythondotnet
Loading...