summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2006-05-01 13:45:37 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2006-05-01 13:45:37 +0000
commit16c1199412cd1b4b8206bf46b25cf9120e0a89af (patch)
treeddd8a2719129ed4a392c821cb149540247064735
parent6896d50402332dcac8d079d48d22e30c3e0f7231 (diff)
downloadpygobject-16c1199412cd1b4b8206bf46b25cf9120e0a89af.tar.gz
Bug 340160 – g_spawn wrapper thinks GPid is an int
-rw-r--r--ChangeLog6
-rw-r--r--gobject/gobjectmodule.c72
2 files changed, 77 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index f4944204..40d6f7cd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-05-01 Gustavo J. A. M. Carneiro <gjc@gnome.org>
+
+ * gobject/gobjectmodule.c (pyg_pid_free, pyg_pid_new),
+ (pyg_spawn_async, init_gobject): Wrap GPid in an object whose
+ destructor calls g_spawn_close_pid. Fixes #340160.
+
2006-04-29 Johannes Hölzl <johannes.hoelzl@gmx.de>
reviewed by: Johan Dahlin <jdahlin@async.com.br>
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index eb958b30..135e468f 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -2135,6 +2135,74 @@ pyg_child_watch_add(PyObject *unused, PyObject *args, PyObject *kwargs)
return PyInt_FromLong(id);
}
+static void
+pyg_pid_free(PyIntObject *gpid)
+{
+ g_spawn_close_pid((GPid) gpid->ob_ival);
+ PyInt_Type.tp_free((void *) gpid);
+}
+
+static int
+pyg_pid_tp_init(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ PyErr_SetString(PyExc_TypeError, "gobject.Pid cannot be manually instantiated");
+ return -1;
+}
+
+static PyTypeObject PyGPid_Type = {
+ PyObject_HEAD_INIT(NULL)
+ 0,
+ "gobject.Pid",
+ sizeof(PyIntObject),
+ 0,
+ 0, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ pyg_pid_tp_init, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+ (freefunc)pyg_pid_free, /* tp_free */
+ 0, /* tp_is_gc */
+};
+
+static PyObject *
+pyg_pid_new(GPid pid)
+{
+ PyIntObject *pygpid;
+ pygpid = PyObject_NEW(PyIntObject, &PyGPid_Type);
+
+ pygpid->ob_ival = pid;
+ return (PyObject *) pygpid;
+}
+
struct _PyGChildSetupData {
PyObject *func;
PyObject *data;
@@ -2303,7 +2371,7 @@ pyg_spawn_async(PyObject *unused, PyObject *args, PyObject *kwargs)
pystderr = Py_None;
}
- return Py_BuildValue("iNNN", child_pid, pystdin, pystdout, pystderr);
+ return Py_BuildValue("NNNN", pyg_pid_new(child_pid), pystdin, pystdout, pystderr);
}
@@ -3090,6 +3158,8 @@ init_gobject(void)
REGISTER_GTYPE(d, PyGEnum_Type, "GEnum", G_TYPE_ENUM);
PyGFlags_Type.tp_base = &PyInt_Type;
REGISTER_GTYPE(d, PyGFlags_Type, "GFlags", G_TYPE_FLAGS);
+ PyGPid_Type.tp_base = &PyInt_Type;
+ REGISTER_TYPE(d, PyGPid_Type, "Pid");
REGISTER_TYPE(d, PyGMainLoop_Type, "MainLoop");
REGISTER_TYPE(d, PyGMainContext_Type, "MainContext");