mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 15:06:14 +01:00
placed a comment about not changing CArray until we have
Sun Mar 3 04:11:58 2002 Tim Janik <timj@gtk.org> * gobject.c: placed a comment about not changing CArray until we have g_object_list_watched_closures(). * gparam.h (struct _GParamSpecClass): added padding. * gobjectnotifyqueue.c (struct _GObjectNotifyQueue): abuse g_list_alloc() to allocate GObjectNotifyQueue to et rid of locking issues.
This commit is contained in:
parent
c2d49b8f7e
commit
d7dd9aefd8
@ -1,3 +1,14 @@
|
||||
Sun Mar 3 04:11:58 2002 Tim Janik <timj@gtk.org>
|
||||
|
||||
* gobject.c: placed a comment about not changing CArray until we have
|
||||
g_object_list_watched_closures().
|
||||
|
||||
* gparam.h (struct _GParamSpecClass): added padding.
|
||||
|
||||
* gobjectnotifyqueue.c (struct _GObjectNotifyQueue): abuse
|
||||
g_list_alloc() to allocate GObjectNotifyQueue to et rid
|
||||
of locking issues.
|
||||
|
||||
Tue Feb 26 10:51:00 2002 Owen Taylor <otaylor@redhat.com>
|
||||
|
||||
* Makefile.am (testgobject_LDADD): Rename testgruntime
|
||||
|
@ -233,7 +233,9 @@ g_object_notify_dispatcher (GObject *object,
|
||||
static void
|
||||
g_object_do_class_init (GObjectClass *class)
|
||||
{
|
||||
/* read the comment about typedef struct CArray; on why not to change this quark */
|
||||
quark_closure_array = g_quark_from_static_string ("GObject-closure-array");
|
||||
|
||||
quark_weak_refs = g_quark_from_static_string ("GObject-weak-references");
|
||||
pspec_pool = g_param_spec_pool_new (TRUE);
|
||||
property_notify_context.quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue");
|
||||
@ -1593,6 +1595,24 @@ typedef struct {
|
||||
guint n_closures;
|
||||
GClosure *closures[1]; /* flexible array */
|
||||
} CArray;
|
||||
/* don't change this structure without supplying an accessor for
|
||||
* watched closures, e.g.:
|
||||
* GSList* g_object_list_watched_closures (GObject *object)
|
||||
* {
|
||||
* CArray *carray;
|
||||
* g_return_val_if_fail (G_IS_OBJECT (object), NULL);
|
||||
* carray = g_object_get_data (object, "GObject-closure-array");
|
||||
* if (carray)
|
||||
* {
|
||||
* GSList *slist = NULL;
|
||||
* guint i;
|
||||
* for (i = 0; i < carray->n_closures; i++)
|
||||
* slist = g_slist_prepend (slist, carray->closures[i]);
|
||||
* return slist;
|
||||
* }
|
||||
* return NULL;
|
||||
* }
|
||||
*/
|
||||
|
||||
static void
|
||||
object_remove_closure (gpointer data,
|
||||
|
@ -38,14 +38,17 @@ struct _GObjectNotifyContext
|
||||
{
|
||||
GQuark quark_notify_queue;
|
||||
GObjectNotifyQueueDispatcher dispatcher;
|
||||
GTrashStack *nqueue_trash;
|
||||
GTrashStack *_nqueue_trash; /* unused */
|
||||
};
|
||||
struct _GObjectNotifyQueue
|
||||
{
|
||||
GObjectNotifyContext *context;
|
||||
GSList *pspecs;
|
||||
guint n_pspecs;
|
||||
guint freeze_count;
|
||||
guint16 n_pspecs;
|
||||
guint16 freeze_count;
|
||||
/* currently, this structure abuses the GList allocation chain and thus
|
||||
* must be <= sizeof (GList)
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
@ -56,7 +59,7 @@ g_object_notify_queue_free (gpointer data)
|
||||
GObjectNotifyQueue *nqueue = data;
|
||||
|
||||
g_slist_free (nqueue->pspecs);
|
||||
g_trash_stack_push (&nqueue->context->nqueue_trash, nqueue);
|
||||
g_list_free_1 ((void*) nqueue);
|
||||
}
|
||||
|
||||
static inline GObjectNotifyQueue*
|
||||
@ -68,20 +71,14 @@ g_object_notify_queue_freeze (GObject *object,
|
||||
nqueue = g_datalist_id_get_data (&object->qdata, context->quark_notify_queue);
|
||||
if (!nqueue)
|
||||
{
|
||||
nqueue = g_trash_stack_pop (&context->nqueue_trash);
|
||||
if (!nqueue)
|
||||
{
|
||||
guint i;
|
||||
|
||||
nqueue = g_new (GObjectNotifyQueue, 16);
|
||||
for (i = 0; i < 15; i++)
|
||||
g_trash_stack_push (&context->nqueue_trash, nqueue++);
|
||||
}
|
||||
nqueue = (void*) g_list_alloc ();
|
||||
memset (nqueue, 0, sizeof (*nqueue));
|
||||
nqueue->context = context;
|
||||
g_datalist_id_set_data_full (&object->qdata, context->quark_notify_queue,
|
||||
nqueue, g_object_notify_queue_free);
|
||||
}
|
||||
|
||||
g_return_val_if_fail (nqueue->freeze_count < 65535, nqueue);
|
||||
nqueue->freeze_count++;
|
||||
|
||||
return nqueue;
|
||||
@ -145,6 +142,8 @@ g_object_notify_queue_add (GObject *object,
|
||||
{
|
||||
if (pspec->flags & G_PARAM_READABLE)
|
||||
{
|
||||
g_return_if_fail (nqueue->n_pspecs < 65535);
|
||||
|
||||
/* we do the deduping in _thaw */
|
||||
nqueue->pspecs = g_slist_prepend (nqueue->pspecs, pspec);
|
||||
nqueue->n_pspecs++;
|
||||
|
@ -98,6 +98,7 @@ struct _GParamSpecClass
|
||||
gint (*values_cmp) (GParamSpec *pspec,
|
||||
const GValue *value1,
|
||||
const GValue *value2);
|
||||
gpointer dummy[4];
|
||||
};
|
||||
struct _GParameter /* auxillary structure for _setv() variants */
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user