diff options
author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2006-05-01 13:45:37 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2006-05-01 13:45:37 +0000 |
commit | 16c1199412cd1b4b8206bf46b25cf9120e0a89af (patch) | |
tree | ddd8a2719129ed4a392c821cb149540247064735 | |
parent | 6896d50402332dcac8d079d48d22e30c3e0f7231 (diff) | |
download | pygobject-16c1199412cd1b4b8206bf46b25cf9120e0a89af.tar.gz |
Bug 340160 – g_spawn wrapper thinks GPid is an int
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gobject/gobjectmodule.c | 72 |
2 files changed, 77 insertions, 1 deletions
@@ -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"); |