mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
gst/pygstminiobject.c: thread safe handling of mini-objects
Original commit message from CVS: * gst/pygstminiobject.c: thread safe handling of mini-objects * codegen/codegen.py: (GstMiniObjectWrapper.constructor_tmpl): let's not forget to wrap the MiniObject :) * gst/gst-types.defs: * gst/gst.defs: Always keep up to date with the core * gst/gstelement.override: override for gst_element_query_position * gst/pygstminiobject.c: * gst/pygstminiobject.h: * gst/gst.override: PyGstMiniObject now properly wrap GstMiniObject and are referenced in a global hash table
This commit is contained in:
parent
835f29e2bb
commit
b35b212bf8
2 changed files with 27 additions and 2 deletions
|
@ -1,5 +1,8 @@
|
|||
2005-06-28 Edward Hervey <edward@fluendo.com>
|
||||
|
||||
* gst/pygstminiobject.c:
|
||||
thread safe handling of mini-objects
|
||||
|
||||
* codegen/codegen.py: (GstMiniObjectWrapper.constructor_tmpl):
|
||||
let's not forget to wrap the MiniObject :)
|
||||
|
||||
|
|
|
@ -132,12 +132,15 @@ void
|
|||
pygstminiobject_register_wrapper(PyObject *self)
|
||||
{
|
||||
GstMiniObject *obj = ((PyGstMiniObject *)self)->obj;
|
||||
PyGILState_STATE state;
|
||||
|
||||
if (!pygstminiobject_wrapper_key)
|
||||
pygstminiobject_wrapper_key=g_quark_from_static_string(pygstminiobject_wrapper_id);
|
||||
|
||||
Py_INCREF(self);
|
||||
state = pyg_gil_state_ensure();
|
||||
g_hash_table_insert (miniobjs, (gpointer) obj, (gpointer) self);
|
||||
pyg_gil_state_release(state);
|
||||
/* gst_mini_object_set_qdata_full(obj, pygstminiobject_wrapper_key, self, */
|
||||
/* pyg_destroy_notify); */
|
||||
}
|
||||
|
@ -157,6 +160,7 @@ pygstminiobject_register_wrapper(PyObject *self)
|
|||
PyObject *
|
||||
pygstminiobject_new(GstMiniObject *obj)
|
||||
{
|
||||
PyGILState_STATE state;
|
||||
PyGstMiniObject *self;
|
||||
|
||||
if (!pygstminiobject_wrapper_key)
|
||||
|
@ -168,7 +172,9 @@ pygstminiobject_new(GstMiniObject *obj)
|
|||
}
|
||||
|
||||
/* we already have a wrapper for this object -- return it. */
|
||||
state = pyg_gil_state_ensure();
|
||||
self = (PyGstMiniObject *)g_hash_table_lookup (miniobjs, (gpointer) obj);
|
||||
pyg_gil_state_release(state);
|
||||
/* self = (PyGstMiniObject *)gst_mini_object_get_qdata(obj, pygstminiobject_wrapper_key); */
|
||||
if (self != NULL) {
|
||||
Py_INCREF(self);
|
||||
|
@ -182,31 +188,40 @@ pygstminiobject_new(GstMiniObject *obj)
|
|||
self = PyObject_GC_New(PyGstMiniObject, tp);
|
||||
if (self == NULL)
|
||||
return NULL;
|
||||
self->obj = gst_mini_object_make_writable(obj);
|
||||
pyg_begin_allow_threads;
|
||||
self->obj = gst_mini_object_ref(obj);
|
||||
pyg_end_allow_threads;
|
||||
|
||||
self->inst_dict = NULL;
|
||||
self->weakreflist = NULL;
|
||||
/* save wrapper pointer so we can access it later */
|
||||
Py_INCREF(self);
|
||||
state = pyg_gil_state_ensure();
|
||||
g_hash_table_insert (miniobjs, (gpointer) obj, (gpointer) self);
|
||||
pyg_gil_state_release(state);
|
||||
/* gst_mini_object_set_qdata_full(obj, pygstminiobject_wrapper_key, self, */
|
||||
/* pyg_destroy_notify); */
|
||||
|
||||
PyObject_GC_Track((PyObject *)self);
|
||||
}
|
||||
|
||||
return (PyObject *)self;
|
||||
}
|
||||
|
||||
static void
|
||||
pygstminiobject_dealloc(PyGstMiniObject *self)
|
||||
{
|
||||
PyGILState_STATE state;
|
||||
|
||||
state = pyg_gil_state_ensure();
|
||||
|
||||
PyObject_ClearWeakRefs((PyObject *)self);
|
||||
|
||||
PyObject_GC_UnTrack((PyObject *)self);
|
||||
|
||||
if (self->obj) {
|
||||
pyg_begin_allow_threads;
|
||||
gst_mini_object_unref(self->obj);
|
||||
pyg_end_allow_threads;
|
||||
}
|
||||
self->obj = NULL;
|
||||
|
||||
|
@ -219,6 +234,7 @@ pygstminiobject_dealloc(PyGstMiniObject *self)
|
|||
/* self->ob_type->tp_free((PyObject *)self); */
|
||||
g_hash_table_remove (miniobjs, (gpointer) self);
|
||||
PyObject_GC_Del(self);
|
||||
pyg_gil_state_release(state);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -273,7 +289,9 @@ pygstminiobject_clear(PyGstMiniObject *self)
|
|||
self->inst_dict = NULL;
|
||||
|
||||
if (self->obj) {
|
||||
pyg_begin_allow_threads;
|
||||
gst_mini_object_unref(self->obj);
|
||||
pyg_end_allow_threads;
|
||||
}
|
||||
self->obj = NULL;
|
||||
|
||||
|
@ -283,7 +301,11 @@ pygstminiobject_clear(PyGstMiniObject *self)
|
|||
static void
|
||||
pygstminiobject_free(PyObject *op)
|
||||
{
|
||||
PyGILState_STATE state;
|
||||
|
||||
state = pyg_gil_state_ensure();
|
||||
g_hash_table_remove (miniobjs, (gpointer) op);
|
||||
pyg_gil_state_release(state);
|
||||
PyObject_GC_Del(op);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue