getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] r5245 - /trunk/getfem/interface/src/python/getfem_pytho


From: logari81
Subject: [Getfem-commits] r5245 - /trunk/getfem/interface/src/python/getfem_python.c
Date: Fri, 11 Mar 2016 16:39:56 -0000

Author: logari81
Date: Fri Mar 11 17:39:56 2016
New Revision: 5245

URL: http://svn.gna.org/viewcvs/getfem?rev=5245&view=rev
Log:
fix memory leak in python interface

Modified:
    trunk/getfem/interface/src/python/getfem_python.c

Modified: trunk/getfem/interface/src/python/getfem_python.c
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/interface/src/python/getfem_python.c?rev=5245&r1=5244&r2=5245&view=diff
==============================================================================
--- trunk/getfem/interface/src/python/getfem_python.c   (original)
+++ trunk/getfem/interface/src/python/getfem_python.c   Fri Mar 11 17:39:56 2016
@@ -174,6 +174,7 @@
   void *p[COLLECTCHUNK];
   int n;
   struct ptr_collect *next;
+  int owned[COLLECTCHUNK];
 } ptr_collect;
 
 typedef struct gcollect {
@@ -182,22 +183,25 @@
 } gcollect;
 
 static ptr_collect *
-ptr_collect_push_front(ptr_collect *col, void *p) {
+ptr_collect_push_front(ptr_collect *col, void *p, int owned) {
   if (col == NULL || col->n == COLLECTCHUNK) {
     ptr_collect *pcol = col;
     col = malloc(sizeof(ptr_collect));
     col->next = pcol;
-    col->n = 1; col->p[0] = p;
+    col->n = 1;
+    col->p[0] = p;
+    col->owned[0] = owned;
   } else {
-    col->p[col->n++] = p;
+    col->p[col->n] = p;
+    col->owned[col->n++] = owned;
   }
   return col;
 }
 
 /* mark a pyobject as referenced */
 static void
-gc_ref(gcollect *gc, PyObject *o) {
-  gc->pyobjects = ptr_collect_push_front(gc->pyobjects, o);
+gc_ref(gcollect *gc, PyObject *o, int owned) {
+  gc->pyobjects = ptr_collect_push_front(gc->pyobjects, o, owned);
 }
 
 /* allocate a collectable chunk of memory */
@@ -206,7 +210,7 @@
   //printf("gc_alloc(%lu)\n", sz);
   void *p = malloc(sz == 0 ? 1 : sz);
   if (p) {
-    gc->allocated = ptr_collect_push_front(gc->allocated, p);
+    gc->allocated = ptr_collect_push_front(gc->allocated, p, 1);
   } else {
     PyErr_Format(PyExc_RuntimeError,
                  "could not allocate %d bytes: memory exhausted", (int)sz);
@@ -222,8 +226,9 @@
   int i;
   if (!PyErr_Occurred())
     for (p = gc->pyobjects; p; p = np) {
-      /*for (i=0; i < p->n; ++i)
-        Py_DECREF((PyObject*)p->p[i]);*/
+      for (i=0; i < p->n; ++i)
+        if (p->owned[i])
+          Py_DECREF((PyObject*)p->p[i]);
       np = p->next; free(p);
     }
   gc->pyobjects = NULL;
@@ -231,8 +236,9 @@
   for (p = gc->allocated; p; p = np) {
     //fprintf(stderr, "release bloc: n=%d, next=%p\n", p->n, p->next);
     for (i=0; i < p->n; ++i) {
+      if (p->owned[i])
       //fprintf(stderr, " i=%d release %p\n", i, p->p[i]);
-      free(p->p[i]);
+        free(p->p[i]);
     }
     np = p->next; free(p);
   }
@@ -274,7 +280,7 @@
     /* for strings, the pointer is shared, no copy */
     int L = strlen(PyString_AsString(o));
     char *s = PyString_AsString(o);
-    gc_ref(gc, o);
+    gc_ref(gc, o, 0);
 
     t->storage.type = GFI_CHAR;
     t->dim.dim_len = 1; t->dim.dim_val = &TGFISTORE(char,len);
@@ -344,9 +350,9 @@
           po = PyArray_CheckFromAny(o,PyArray_DescrFromType(NPY_INT),0,0,
                                     NPY_ARRAY_FORCECAST | NPY_ARRAY_OUT_FARRAY
                                     | NPY_ARRAY_ELEMENTSTRIDES, NULL);
-        if(!po) { PyErr_NoMemory(); return NULL;}
-
-        gc_ref(gc,po);
+        if (!po) { PyErr_NoMemory(); return NULL;}
+
+        gc_ref(gc, po, 1);
         /* No new copy. */
         TGFISTORE(int32,val) = (int *)PyArray_DATA((PyArrayObject *)po);
         break;
@@ -365,9 +371,9 @@
           po = PyArray_CheckFromAny(o,PyArray_DescrFromType(NPY_DOUBLE),0,0,
                                     NPY_ARRAY_FORCECAST | NPY_ARRAY_OUT_FARRAY
                                     | NPY_ARRAY_ELEMENTSTRIDES, NULL);
-        if(!po) { PyErr_NoMemory(); return NULL;}
-
-        gc_ref(gc,po);
+        if (!po) { PyErr_NoMemory(); return NULL;}
+
+        gc_ref(gc, po, 1);
         /* No new copy. */
         TGFISTORE(double,val) = (double *)PyArray_DATA((PyArrayObject *)po);
         break;
@@ -386,9 +392,9 @@
           po = PyArray_CheckFromAny(o,PyArray_DescrFromType(NPY_CDOUBLE),0,0,
                                     NPY_ARRAY_FORCECAST | NPY_ARRAY_OUT_FARRAY
                                     | NPY_ARRAY_ELEMENTSTRIDES, NULL);
-        if(!po) { PyErr_NoMemory(); return NULL;}
-
-        gc_ref(gc,po);
+        if (!po) { PyErr_NoMemory(); return NULL;}
+
+        gc_ref(gc, po, 1);
         /* No new copy. */
         TGFISTORE(double,val) = (double *)PyArray_DATA((PyArrayObject *)po);
         break;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]