cogl: Drop no longer used user data helpers
This also drops the test-object conform test as it doesn't do anything interesting and the gobject qdata functionnality is already well tested across the platform Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3193>
This commit is contained in:
parent
9b9e12edb2
commit
b044e26e62
@ -58,14 +58,6 @@ typedef struct _CoglObjectClass
|
|||||||
void *virt_unref;
|
void *virt_unref;
|
||||||
} CoglObjectClass;
|
} CoglObjectClass;
|
||||||
|
|
||||||
#define COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES 2
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
CoglUserDataKey *key;
|
|
||||||
void *user_data;
|
|
||||||
CoglUserDataDestroyInternalCallback destroy;
|
|
||||||
} CoglUserDataEntry;
|
|
||||||
|
|
||||||
/* All Cogl objects inherit from this base object by adding a member:
|
/* All Cogl objects inherit from this base object by adding a member:
|
||||||
*
|
*
|
||||||
@ -78,11 +70,6 @@ struct _CoglObject
|
|||||||
{
|
{
|
||||||
CoglObjectClass *klass; /* equivalent to GTypeInstance */
|
CoglObjectClass *klass; /* equivalent to GTypeInstance */
|
||||||
|
|
||||||
CoglUserDataEntry user_data_entry[
|
|
||||||
COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES];
|
|
||||||
GArray *user_data_array;
|
|
||||||
int n_user_data_entries;
|
|
||||||
|
|
||||||
unsigned int ref_count;
|
unsigned int ref_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -176,8 +163,6 @@ _cogl_##type_name##_object_new (Cogl##TypeName *new_obj) \
|
|||||||
CoglObject *obj = (CoglObject *)&new_obj->_parent; \
|
CoglObject *obj = (CoglObject *)&new_obj->_parent; \
|
||||||
obj->ref_count = 0; \
|
obj->ref_count = 0; \
|
||||||
cogl_object_ref (obj); \
|
cogl_object_ref (obj); \
|
||||||
obj->n_user_data_entries = 0; \
|
|
||||||
obj->user_data_array = NULL; \
|
|
||||||
\
|
\
|
||||||
obj->klass = &_cogl_##type_name##_class; \
|
obj->klass = &_cogl_##type_name##_class; \
|
||||||
if (!obj->klass->virt_free) \
|
if (!obj->klass->virt_free) \
|
||||||
@ -244,11 +229,5 @@ _cogl_is_##type_name (void *object) \
|
|||||||
#define COGL_OBJECT_INTERNAL_DEFINE(TypeName, type_name) \
|
#define COGL_OBJECT_INTERNAL_DEFINE(TypeName, type_name) \
|
||||||
COGL_OBJECT_INTERNAL_DEFINE_WITH_CODE (TypeName, type_name, (void) 0)
|
COGL_OBJECT_INTERNAL_DEFINE_WITH_CODE (TypeName, type_name, (void) 0)
|
||||||
|
|
||||||
void
|
|
||||||
_cogl_object_set_user_data (CoglObject *object,
|
|
||||||
CoglUserDataKey *key,
|
|
||||||
void *user_data,
|
|
||||||
CoglUserDataDestroyInternalCallback destroy);
|
|
||||||
|
|
||||||
COGL_EXPORT void
|
COGL_EXPORT void
|
||||||
_cogl_object_default_unref (void *obj);
|
_cogl_object_default_unref (void *obj);
|
||||||
|
@ -64,34 +64,6 @@ _cogl_object_default_unref (void *object)
|
|||||||
{
|
{
|
||||||
void (*free_func)(void *obj);
|
void (*free_func)(void *obj);
|
||||||
|
|
||||||
if (obj->n_user_data_entries)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int count = MIN (obj->n_user_data_entries,
|
|
||||||
COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry *entry = &obj->user_data_entry[i];
|
|
||||||
if (entry->destroy)
|
|
||||||
entry->destroy (entry->user_data, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj->user_data_array != NULL)
|
|
||||||
{
|
|
||||||
for (i = 0; i < obj->user_data_array->len; i++)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry *entry =
|
|
||||||
&g_array_index (obj->user_data_array,
|
|
||||||
CoglUserDataEntry, i);
|
|
||||||
|
|
||||||
if (entry->destroy)
|
|
||||||
entry->destroy (entry->user_data, obj);
|
|
||||||
}
|
|
||||||
g_array_free (obj->user_data_array, TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
COGL_OBJECT_DEBUG_FREE (obj);
|
COGL_OBJECT_DEBUG_FREE (obj);
|
||||||
free_func = obj->klass->virt_free;
|
free_func = obj->klass->virt_free;
|
||||||
free_func (obj);
|
free_func (obj);
|
||||||
@ -109,142 +81,6 @@ cogl_object_unref (void *obj)
|
|||||||
unref_func (obj);
|
unref_func (obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: Unlike for cogl_object_get_user_data this code will return
|
|
||||||
* an empty entry if available and no entry for the given key can be
|
|
||||||
* found. */
|
|
||||||
static CoglUserDataEntry *
|
|
||||||
_cogl_object_find_entry (CoglObject *object, CoglUserDataKey *key)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry *entry = NULL;
|
|
||||||
int count;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
count = MIN (object->n_user_data_entries,
|
|
||||||
COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry *current = &object->user_data_entry[i];
|
|
||||||
if (current->key == key)
|
|
||||||
return current;
|
|
||||||
if (current->user_data == NULL)
|
|
||||||
entry = current;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (G_UNLIKELY (object->user_data_array != NULL))
|
|
||||||
{
|
|
||||||
for (i = 0; i < object->user_data_array->len; i++)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry *current =
|
|
||||||
&g_array_index (object->user_data_array, CoglUserDataEntry, i);
|
|
||||||
|
|
||||||
if (current->key == key)
|
|
||||||
return current;
|
|
||||||
if (current->user_data == NULL)
|
|
||||||
entry = current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_cogl_object_set_user_data (CoglObject *object,
|
|
||||||
CoglUserDataKey *key,
|
|
||||||
void *user_data,
|
|
||||||
CoglUserDataDestroyInternalCallback destroy)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry new_entry;
|
|
||||||
CoglUserDataEntry *entry;
|
|
||||||
|
|
||||||
if (user_data)
|
|
||||||
{
|
|
||||||
new_entry.key = key;
|
|
||||||
new_entry.user_data = user_data;
|
|
||||||
new_entry.destroy = destroy;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
memset (&new_entry, 0, sizeof (new_entry));
|
|
||||||
|
|
||||||
entry = _cogl_object_find_entry (object, key);
|
|
||||||
if (entry)
|
|
||||||
{
|
|
||||||
if (G_LIKELY (entry->destroy))
|
|
||||||
entry->destroy (entry->user_data, object);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* NB: Setting a value of NULL is documented to delete the
|
|
||||||
* corresponding entry so we can return immediately in this
|
|
||||||
* case. */
|
|
||||||
if (user_data == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (G_LIKELY (object->n_user_data_entries <
|
|
||||||
COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES))
|
|
||||||
entry = &object->user_data_entry[object->n_user_data_entries++];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (G_UNLIKELY (object->user_data_array == NULL))
|
|
||||||
{
|
|
||||||
object->user_data_array =
|
|
||||||
g_array_new (FALSE, FALSE, sizeof (CoglUserDataEntry));
|
|
||||||
}
|
|
||||||
|
|
||||||
g_array_set_size (object->user_data_array,
|
|
||||||
object->user_data_array->len + 1);
|
|
||||||
entry =
|
|
||||||
&g_array_index (object->user_data_array, CoglUserDataEntry,
|
|
||||||
object->user_data_array->len - 1);
|
|
||||||
|
|
||||||
object->n_user_data_entries++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*entry = new_entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cogl_object_set_user_data (CoglObject *object,
|
|
||||||
CoglUserDataKey *key,
|
|
||||||
void *user_data,
|
|
||||||
CoglUserDataDestroyCallback destroy)
|
|
||||||
{
|
|
||||||
_cogl_object_set_user_data (object, key, user_data,
|
|
||||||
(CoglUserDataDestroyInternalCallback)destroy);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
cogl_object_get_user_data (CoglObject *object, CoglUserDataKey *key)
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
count = MIN (object->n_user_data_entries,
|
|
||||||
COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry *entry = &object->user_data_entry[i];
|
|
||||||
if (entry->key == key)
|
|
||||||
return entry->user_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (object->user_data_array != NULL)
|
|
||||||
{
|
|
||||||
for (i = 0; i < object->user_data_array->len; i++)
|
|
||||||
{
|
|
||||||
CoglUserDataEntry *entry =
|
|
||||||
&g_array_index (object->user_data_array, CoglUserDataEntry, i);
|
|
||||||
|
|
||||||
if (entry->key == key)
|
|
||||||
return entry->user_data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_debug_object_foreach_type (CoglDebugObjectForeachTypeCallback func,
|
cogl_debug_object_foreach_type (CoglDebugObjectForeachTypeCallback func,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
|
@ -89,41 +89,6 @@ cogl_object_unref (void *object);
|
|||||||
*/
|
*/
|
||||||
#define cogl_clear_object(object_ptr) g_clear_pointer ((object_ptr), cogl_object_unref)
|
#define cogl_clear_object(object_ptr) g_clear_pointer ((object_ptr), cogl_object_unref)
|
||||||
|
|
||||||
/**
|
|
||||||
* CoglUserDataKey:
|
|
||||||
* @unused: ignored.
|
|
||||||
*
|
|
||||||
* A #CoglUserDataKey is used to declare a key for attaching data to a
|
|
||||||
* #CoglObject using cogl_object_set_user_data. The typedef only exists as a
|
|
||||||
* formality to make code self documenting since only the unique address of a
|
|
||||||
* #CoglUserDataKey is used.
|
|
||||||
*
|
|
||||||
* Typically you would declare a static #CoglUserDataKey and set private data
|
|
||||||
* on an object something like this:
|
|
||||||
*
|
|
||||||
* |[
|
|
||||||
* static CoglUserDataKey path_private_key;
|
|
||||||
*
|
|
||||||
* static void
|
|
||||||
* destroy_path_private_cb (void *data)
|
|
||||||
* {
|
|
||||||
* g_free (data);
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* static void
|
|
||||||
* my_path_set_data (CoglPipeline *pipeline, void *data)
|
|
||||||
* {
|
|
||||||
* cogl_object_set_user_data (COGL_OBJECT (pipeline),
|
|
||||||
* &private_key,
|
|
||||||
* data,
|
|
||||||
* destroy_pipeline_private_cb);
|
|
||||||
* }
|
|
||||||
* ]|
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
int unused;
|
|
||||||
} CoglUserDataKey;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CoglUserDataDestroyCallback:
|
* CoglUserDataDestroyCallback:
|
||||||
* @user_data: The data whose association with a #CoglObject has been
|
* @user_data: The data whose association with a #CoglObject has been
|
||||||
@ -160,45 +125,6 @@ typedef void
|
|||||||
(* CoglDebugObjectForeachTypeCallback) (const CoglDebugObjectTypeInfo *info,
|
(* CoglDebugObjectForeachTypeCallback) (const CoglDebugObjectTypeInfo *info,
|
||||||
void *user_data);
|
void *user_data);
|
||||||
|
|
||||||
/**
|
|
||||||
* cogl_object_set_user_data: (skip)
|
|
||||||
* @object: The object to associate private data with
|
|
||||||
* @key: The address of a #CoglUserDataKey which provides a unique value
|
|
||||||
* with which to index the private data.
|
|
||||||
* @user_data: The data to associate with the given object,
|
|
||||||
* or %NULL to remove a previous association.
|
|
||||||
* @destroy: A #CoglUserDataDestroyCallback to call if the object is
|
|
||||||
* destroyed or if the association is removed by later setting
|
|
||||||
* %NULL data for the same key.
|
|
||||||
*
|
|
||||||
* Associates some private @user_data with a given #CoglObject. To
|
|
||||||
* later remove the association call cogl_object_set_user_data() with
|
|
||||||
* the same @key but NULL for the @user_data.
|
|
||||||
*/
|
|
||||||
COGL_EXPORT void
|
|
||||||
cogl_object_set_user_data (CoglObject *object,
|
|
||||||
CoglUserDataKey *key,
|
|
||||||
void *user_data,
|
|
||||||
CoglUserDataDestroyCallback destroy);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cogl_object_get_user_data: (skip)
|
|
||||||
* @object: The object with associated private data to query
|
|
||||||
* @key: The address of a #CoglUserDataKey which provides a unique value
|
|
||||||
* with which to index the private data.
|
|
||||||
*
|
|
||||||
* Finds the user data previously associated with @object using
|
|
||||||
* the given @key. If no user data has been associated with @object
|
|
||||||
* for the given @key this function returns NULL.
|
|
||||||
*
|
|
||||||
* Returns: (transfer none): The user data previously associated
|
|
||||||
* with @object using the given @key; or %NULL if no associated
|
|
||||||
* data is found.
|
|
||||||
*/
|
|
||||||
COGL_EXPORT void *
|
|
||||||
cogl_object_get_user_data (CoglObject *object,
|
|
||||||
CoglUserDataKey *key);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cogl_debug_object_foreach_type:
|
* cogl_debug_object_foreach_type:
|
||||||
* @func: (scope call): A callback function for each type
|
* @func: (scope call): A callback function for each type
|
||||||
|
@ -45,7 +45,6 @@ cogl_tests = [
|
|||||||
#unported = [
|
#unported = [
|
||||||
# "test-multitexture",
|
# "test-multitexture",
|
||||||
# "test-npot-texture",
|
# "test-npot-texture",
|
||||||
# "test-object",
|
|
||||||
# "test-readpixels",
|
# "test-readpixels",
|
||||||
# "test-texture-mipmaps",
|
# "test-texture-mipmaps",
|
||||||
# "test-texture-pixmap-x11",
|
# "test-texture-pixmap-x11",
|
||||||
|
@ -1,90 +0,0 @@
|
|||||||
|
|
||||||
#include <clutter/clutter.h>
|
|
||||||
#include <cogl/cogl.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "test-conform-common.h"
|
|
||||||
|
|
||||||
static GQuark private_key0 = 0;
|
|
||||||
static GQuark private_key1 = 0;
|
|
||||||
static GQuark private_key2 = 0;
|
|
||||||
|
|
||||||
static int user_data0;
|
|
||||||
static int user_data1;
|
|
||||||
static int user_data2;
|
|
||||||
|
|
||||||
static int destroy0_count = 0;
|
|
||||||
static int destroy1_count = 0;
|
|
||||||
static int destroy2_count = 0;
|
|
||||||
|
|
||||||
static void
|
|
||||||
destroy0_cb (void *user_data)
|
|
||||||
{
|
|
||||||
g_assert (user_data == &user_data0);
|
|
||||||
destroy0_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
destroy1_cb (void *user_data)
|
|
||||||
{
|
|
||||||
g_assert (user_data == &user_data1);
|
|
||||||
destroy1_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
destroy2_cb (void *user_data)
|
|
||||||
{
|
|
||||||
g_assert (user_data == &user_data2);
|
|
||||||
destroy2_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_object (TestUtilsGTestFixture *fixture,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
CoglPipeline *pipeline;
|
|
||||||
|
|
||||||
/* Assuming that COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES == 2
|
|
||||||
* test associating 2 pointers to private data with an object */
|
|
||||||
cogl_pipeline_new ();
|
|
||||||
pipeline = cogl_pipeline_path ();
|
|
||||||
|
|
||||||
private_key0 = g_quark_from_static_string ("test-object-private_key0");
|
|
||||||
private_key1 = g_quark_from_static_string ("test-object-private_key1");
|
|
||||||
private_key2 = g_quark_from_static_string ("test-object-private_key2");
|
|
||||||
|
|
||||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
|
||||||
private_key0,
|
|
||||||
&user_data0,
|
|
||||||
destroy0_cb);
|
|
||||||
|
|
||||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
|
||||||
private_key1,
|
|
||||||
&user_data1,
|
|
||||||
destroy1_cb);
|
|
||||||
|
|
||||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
|
||||||
private_key2,
|
|
||||||
&user_data2,
|
|
||||||
destroy2_cb);
|
|
||||||
|
|
||||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
|
||||||
private_key1,
|
|
||||||
NULL,
|
|
||||||
destroy1_cb);
|
|
||||||
|
|
||||||
g_object_set_qdata_full (G_OBJECT (pipeline),
|
|
||||||
private_key1,
|
|
||||||
&user_data1,
|
|
||||||
destroy1_cb);
|
|
||||||
|
|
||||||
g_object_unref (pipeline);
|
|
||||||
|
|
||||||
g_assert_cmpint (destroy0_count, ==, 1);
|
|
||||||
g_assert_cmpint (destroy1_count, ==, 2);
|
|
||||||
g_assert_cmpint (destroy2_count, ==, 1);
|
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
|
||||||
g_print ("OK\n");
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user