瀏覽代碼

ZOOKEEPER-1431. zkpython async calls leak memory (Kapil Thangavelu and Andre Cruz via henryr)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1351541 13f79535-47bb-0310-9956-ffa450edef68
Henry Robinson 13 年之前
父節點
當前提交
e969c29dcd
共有 2 個文件被更改,包括 9 次插入1 次删除
  1. 2 0
      CHANGES.txt
  2. 7 1
      src/contrib/zkpython/src/c/zookeeper.c

+ 2 - 0
CHANGES.txt

@@ -183,6 +183,8 @@ BUGFIXES:
 
   ZOOKEEPER-642. "exceeded deadline by N ms" floods logs (Marc Celani via michim)
 
+  ZOOKEEPER-1431. zkpython async calls leak memory (Kapil Thangavelu and Andre Cruz via henryr)
+
 IMPROVEMENTS:
 
   ZOOKEEPER-1170. Fix compiler (eclipse) warnings: unused imports,

+ 7 - 1
src/contrib/zkpython/src/c/zookeeper.c

@@ -437,6 +437,7 @@ void watcher_dispatch(zhandle_t *zzh, int type, int state,
   if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) {
     PyErr_Print();
   }
+  Py_DECREF(arglist);
   if (pyw->permanent == 0 && (type != ZOO_SESSION_EVENT || state < 0)) {
     free_pywatcher(pyw);
   }
@@ -458,6 +459,7 @@ void void_completion_dispatch(int rc, const void *data)
   PyObject *arglist = Py_BuildValue("(i,i)", pyw->zhandle, rc);
   if (PyObject_CallObject((PyObject*)callback, arglist) == NULL)
     PyErr_Print();
+  Py_DECREF(arglist);
   free_pywatcher(pyw);
   PyGILState_Release(gstate);
 }
@@ -475,9 +477,9 @@ void stat_completion_dispatch(int rc, const struct Stat *stat, const void *data)
   PyObject *pystat = build_stat(stat);
   PyObject *arglist = Py_BuildValue("(i,i,O)", pyw->zhandle,rc, pystat);
   Py_DECREF(pystat);
-
   if (PyObject_CallObject((PyObject*)callback, arglist) == NULL)
     PyErr_Print();
+  Py_DECREF(arglist);
   free_pywatcher(pyw);
   PyGILState_Release(gstate);
 }
@@ -499,6 +501,7 @@ void data_completion_dispatch(int rc, const char *value, int value_len, const st
 
   if (PyObject_CallObject((PyObject*)callback, arglist) == NULL)
     PyErr_Print();
+  Py_DECREF(arglist);
   free_pywatcher(pyw);
   PyGILState_Release(gstate);
 }
@@ -519,6 +522,7 @@ void strings_completion_dispatch(int rc, const struct String_vector *strings, co
       PyObject *arglist = Py_BuildValue("(i,i,O)", pyw->zhandle, rc, pystrings);   
       if (arglist == NULL || PyObject_CallObject((PyObject*)callback, arglist) == NULL)
         PyErr_Print();
+      Py_DECREF(arglist);
     }
   else
     PyErr_Print();
@@ -541,6 +545,7 @@ void string_completion_dispatch(int rc, const char *value, const void *data)
   PyObject *arglist = Py_BuildValue("(i,i,s)", pyw->zhandle,rc, value);
   if (PyObject_CallObject((PyObject*)callback, arglist) == NULL)
     PyErr_Print();
+  Py_DECREF(arglist);
   free_pywatcher(pyw);
   PyGILState_Release(gstate);
 }
@@ -566,6 +571,7 @@ void acl_completion_dispatch(int rc, struct ACL_vector *acl, struct Stat *stat,
   if (PyObject_CallObject((PyObject*)callback, arglist) == NULL) {
     PyErr_Print();
   }
+  Py_DECREF(arglist);
   free_pywatcher(pyw);
   PyGILState_Release(gstate);
 }