1
0
mirror of https://gitlab.xiph.org/xiph/icecast-common.git synced 2024-12-04 14:46:31 -05:00

Feature: support passing any object as instance and asking an instance for itself

This commit is contained in:
Philipp Schafft 2019-09-14 19:47:26 +00:00
parent e92b80ad46
commit bc46e9c976
3 changed files with 22 additions and 4 deletions

View File

@ -52,6 +52,9 @@ igloo_RO_PRIVATE_TYPE(igloo_instance_t,
igloo_RO_TYPEDECL_FREE(igloo_initialize__free) igloo_RO_TYPEDECL_FREE(igloo_initialize__free)
); );
/* Internal forwarding */
const igloo_ro_type_t **igloo_instance_type = &igloo_ro__type__igloo_instance_t;
igloo_ro_t igloo_initialize(void) igloo_ro_t igloo_initialize(void)
{ {
igloo_instance_t *ret; igloo_instance_t *ret;

View File

@ -36,6 +36,10 @@ void igloo_resolver_shutdown(void);
void igloo_log_initialize(void); void igloo_log_initialize(void);
void igloo_log_shutdown(void); void igloo_log_shutdown(void);
/* Instance type internal forwarding */
const igloo_ro_type_t **igloo_instance_type;
#define igloo_IS_INSTANCE(x) (igloo_RO_GET_TYPE((x)) == *igloo_instance_type)
/* Basic interface */ /* Basic interface */
#define igloo_interface_base(type) \ #define igloo_interface_base(type) \
/* The base object. */ \ /* The base object. */ \

View File

@ -102,9 +102,14 @@ igloo_ro_t igloo_ro_new__raw(const igloo_ro_type_t *type, const char *name,
} }
if (!igloo_RO_IS_NULL(instance)) { if (!igloo_RO_IS_NULL(instance)) {
if (igloo_ro_ref(instance) != igloo_ERROR_NONE) { if (!igloo_IS_INSTANCE(instance)) {
igloo_ro_unref(base); /* In this case we're fine if this returns igloo_RO_NULL. */
return igloo_RO_NULL; instance = igloo_ro_get_instance(instance);
} else {
if (igloo_ro_ref(instance) != igloo_ERROR_NONE) {
igloo_ro_unref(base);
return igloo_RO_NULL;
}
} }
base->instance = instance; base->instance = instance;
@ -335,7 +340,13 @@ igloo_ro_t igloo_ro_get_instance(igloo_ro_t self)
igloo_thread_mutex_unlock(&(base->lock)); igloo_thread_mutex_unlock(&(base->lock));
return igloo_RO_NULL; return igloo_RO_NULL;
} }
ret = base->instance;
if (igloo_IS_INSTANCE(base)) {
ret = (igloo_ro_t)base;
} else {
ret = base->instance;
}
if (!igloo_RO_IS_NULL(ret)) { if (!igloo_RO_IS_NULL(ret)) {
if (igloo_ro_ref(ret) != igloo_ERROR_NONE) { if (igloo_ro_ref(ret) != igloo_ERROR_NONE) {
igloo_thread_mutex_unlock(&(base->lock)); igloo_thread_mutex_unlock(&(base->lock));