From c5b2a96bc9bf8332dc9026de7713e448df75e987 Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Thu, 26 Aug 2010 12:09:31 +0200 Subject: [PATCH] plugin: refactor the initialization code. Remove references to global python objects from the initialization code. This makes it possible to avoid linking to libpython. --- plugin/gstpythonplugin.c | 60 +++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/plugin/gstpythonplugin.c b/plugin/gstpythonplugin.c index f8b0d0d..0134f19 100644 --- a/plugin/gstpythonplugin.c +++ b/plugin/gstpythonplugin.c @@ -25,6 +25,7 @@ /* include this first, before NO_IMPORT_PYGOBJECT is defined */ #include #include +#include PyTypeObject *_PyGstElement_Type; #define PyGstElement_Type (*_PyGstElement_Type) @@ -40,35 +41,46 @@ static PyObject *element; static inline gboolean np_init_pygobject (void) { - PyObject *gobject = PyImport_ImportModule ("gobject"); - gboolean res = TRUE; - - if (gobject != NULL) { - PyObject *mdict = PyModule_GetDict (gobject); - PyObject *cobject = PyDict_GetItemString (mdict, "_PyGObject_API"); - if (PyCObject_Check (cobject)) { - _PyGObject_API = - (struct _PyGObject_Functions *) PyCObject_AsVoidPtr (cobject); - } else { - PyErr_SetString (PyExc_RuntimeError, - "could not find _PyGObject_API object"); - PyErr_Print (); - res = FALSE; - goto beach; - } - if (!(PyObject_CallMethod (gobject, "threads_init", NULL, NULL))) { - PyErr_SetString (PyExc_RuntimeError, "Could not initialize threads"); - PyErr_Print (); - res = FALSE; - goto beach; - } - } else { + gboolean res = FALSE; + PyObject *gobject = NULL; + PyObject *main_module = NULL; + PyObject *mdict = NULL; + + gobject = PyImport_ImportModule ("gobject"); + if (gobject == NULL) { PyErr_Print (); GST_WARNING ("could not import gobject"); - res = FALSE; + goto beach; + } + + main_module = PyImport_AddModule ("__main__"); + mdict = PyModule_GetDict (gobject); + + PyObject *cobject = PyDict_GetItemString (mdict, "_PyGObject_API"); + if (cobject == NULL) { + GST_WARNING ("could not find _PyGObject_API"); + goto beach; } + _PyGObject_API = + (struct _PyGObject_Functions *) PyCObject_AsVoidPtr (cobject); + if (_PyGObject_API == NULL) { + PyErr_Print (); + GST_WARNING ("_PyGObject_API is not a valid CObject"); + goto beach; + } + + if (!(PyObject_CallMethod (gobject, "threads_init", NULL, NULL))) { + PyErr_Print (); + GST_WARNING ("could not initialize threads"); + goto beach; + } + + res = TRUE; + beach: + Py_XDECREF (gobject); + return res; } -- 2.7.4