fix wrong decrefs

Original commit message from CVS:
fix wrong decrefs
This commit is contained in:
Thomas Vander Stichele 2005-09-13 09:48:32 +00:00
parent 509bee5e5b
commit de0ee6f4fd
2 changed files with 50 additions and 37 deletions

View file

@ -1,3 +1,8 @@
2005-09-13 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/gstbus.override:
fix wrong decrefs
2005-09-12 Thomas Vander Stichele <thomas at apestaart dot org> 2005-09-12 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/gst.defs: * gst/gst.defs:

View file

@ -32,43 +32,48 @@ bus_sync_handler (GstBus *bus, GstMessage *message, gpointer user_data)
PyObject *py_msg; PyObject *py_msg;
PyObject *callback, *args; PyObject *callback, *args;
PyObject *ret; PyObject *ret;
gint i,len; gint i, len;
g_return_val_if_fail (user_data != NULL, GST_BUS_PASS); g_return_val_if_fail (user_data != NULL, GST_BUS_PASS);
state = pyg_gil_state_ensure(); state = pyg_gil_state_ensure ();
py_userdata = (PyObject *) user_data; py_userdata = (PyObject *) user_data;
py_msg = pygstminiobject_new(GST_MINI_OBJECT(message)); py_msg = pygstminiobject_new (GST_MINI_OBJECT (message));
callback = PyTuple_GetItem(py_userdata, 0); callback = PyTuple_GetItem (py_userdata, 0);
args = Py_BuildValue("(NN)",
pygobject_new(G_OBJECT(bus)),
py_msg);
len = PyTuple_Size(py_userdata); /* Using N we give away our references to the args tuple */
args = Py_BuildValue ("(NN)",
pygobject_new (G_OBJECT (bus)),
py_msg);
/* add all *args to the args tuple object */
len = PyTuple_Size (py_userdata);
for (i = 1; i < len; ++i) { for (i = 1; i < len; ++i) {
PyObject *tuple = args; PyObject *tuple = args;
args = PySequence_Concat(tuple, PyTuple_GetItem(py_userdata, i)); args = PySequence_Concat (tuple, PyTuple_GetItem (py_userdata, i));
Py_DECREF(tuple); Py_DECREF (tuple);
} }
ret = PyObject_CallObject(callback, args); ret = PyObject_CallObject (callback, args);
if (!ret) { if (!ret) {
PyErr_Print(); PyErr_Print ();
res = GST_BUS_PASS; res = GST_BUS_PASS;
} else { } else {
if (ret == Py_None) { if (ret == Py_None) {
PyErr_SetString(PyExc_TypeError, "callback should return a BusSyncReply"); PyErr_SetString (PyExc_TypeError,
PyErr_Print(); "callback should return a BusSyncReply");
PyErr_Print ();
res = GST_BUS_PASS; res = GST_BUS_PASS;
} else if (pyg_enum_get_value(GST_TYPE_BUS_SYNC_REPLY, ret, (gint *) &res)) } else if (pyg_enum_get_value (GST_TYPE_BUS_SYNC_REPLY, ret,
(gint *) &res))
res = GST_BUS_PASS; res = GST_BUS_PASS;
Py_DECREF (ret); Py_DECREF (ret);
} }
Py_DECREF(py_msg); Py_DECREF (args);
Py_DECREF(args);
pyg_gil_state_release(state); pyg_gil_state_release (state);
return res; return res;
} }
@ -79,46 +84,49 @@ bus_handler (GstBus *bus, GstMessage *message, gpointer user_data)
PyGILState_STATE state; PyGILState_STATE state;
gboolean res; gboolean res;
PyObject *py_userdata; PyObject *py_userdata;
PyObject *py_msg; PyObject *py_msg;
PyObject *callback, *args; PyObject *callback, *args;
PyObject *ret; PyObject *ret;
gint i,len; gint i, len;
g_return_val_if_fail (user_data != NULL, TRUE); g_return_val_if_fail (user_data != NULL, TRUE);
state = pyg_gil_state_ensure(); state = pyg_gil_state_ensure ();
py_userdata = (PyObject *) user_data; py_userdata = (PyObject *) user_data;
py_msg = pygstminiobject_new(GST_MINI_OBJECT(message)); py_msg = pygstminiobject_new (GST_MINI_OBJECT (message));
callback = PyTuple_GetItem(py_userdata, 0); callback = PyTuple_GetItem (py_userdata, 0);
args = Py_BuildValue("(NN)",
pygobject_new(G_OBJECT(bus)),
py_msg);
len = PyTuple_Size(py_userdata); /* Using N we give away our references to the args tuple */
args = Py_BuildValue ("(NN)",
pygobject_new (G_OBJECT (bus)),
py_msg);
/* add all *args to the args tuple object */
len = PyTuple_Size (py_userdata);
for (i = 1; i < len; ++i) { for (i = 1; i < len; ++i) {
PyObject *tuple = args; PyObject *tuple = args;
args = PySequence_Concat(tuple, PyTuple_GetItem(py_userdata, i)); args = PySequence_Concat (tuple, PyTuple_GetItem (py_userdata, i));
Py_DECREF(tuple); Py_DECREF (tuple);
} }
ret = PyObject_CallObject(callback, args); ret = PyObject_CallObject(callback, args);
if (!ret) { if (!ret) {
PyErr_Print(); PyErr_Print ();
res = TRUE; res = TRUE;
} else { } else {
if (ret == Py_None) { if (ret == Py_None) {
PyErr_SetString(PyExc_TypeError, "callback should return True or False"); PyErr_SetString (PyExc_TypeError,
PyErr_Print(); "callback should return True or False");
PyErr_Print ();
res = TRUE; res = TRUE;
} else } else
res = PyObject_IsTrue(ret); res = PyObject_IsTrue (ret);
Py_DECREF(ret); Py_DECREF (ret);
} }
Py_DECREF(py_msg); Py_DECREF (args);
Py_DECREF(args);
pyg_gil_state_release(state); pyg_gil_state_release (state);
return res; return res;
} }