1981 static gboolean
1982 type_iface_vtable_base_init_Wm (TypeNode *iface,
1983 TypeNode *node)
1984 {
1985 IFaceEntry *entry;
1986 IFaceHolder *iholder;
1987 GTypeInterface *vtable = NULL;
1988 TypeNode *pnode;
1989
1990 /* type_iface_retrieve_holder_info_Wm() doesn't modify write lock for returning NULL */
1991 iholder = type_iface_retrieve_holder_info_Wm (iface, NODE_TYPE (node), TRUE);
1992 if (!iholder)
1993 return FALSE; /* we don't modify write lock upon FALSE */
1994
1995 type_iface_ensure_dflt_vtable_Wm (iface);
1996
1997 entry = type_lookup_iface_entry_L (node, iface);
1998
1999 g_assert (iface->data && entry && entry->vtable == NULL && iholder && iholder->info);
2000
2001 entry->init_state = IFACE_INIT;
2002
2003 pnode = lookup_type_node_I (NODE_PARENT_TYPE (node));
2004 if (pnode) /* want to copy over parent iface contents */
2005 {
2006 IFaceEntry *pentry = type_lookup_iface_entry_L (pnode, iface);
2007
2008 if (pentry)
2009 vtable = g_memdup (pentry->vtable, iface->data->iface.vtable_size);
2010 }
2011 if (!vtable)
2012 vtable = g_memdup (iface->data->iface.dflt_vtable, iface->data->iface.vtable_size);
2013 entry->vtable = vtable;
2014 vtable->g_type = NODE_TYPE (iface);
2015 vtable->g_instance_type = NODE_TYPE (node);
2016
2017 if (iface->data->iface.vtable_init_base)
2018 {
2019 G_WRITE_UNLOCK (&type_rw_lock);
2020 iface->data->iface.vtable_init_base (vtable);
2024 }
2025
2026 /* Finishes what type_iface_vtable_base_init_Wm started by
2027 * calling the interface init function.
2028 * this function may only be called for types with their
2029 * own interface holder info, i.e. types for which
2030 * g_type_add_interface*() was called and not children thereof.
2031 */
2032 static void
2033 type_iface_vtable_iface_init_Wm (TypeNode *iface,
2034 TypeNode *node)
2035 {
2036 IFaceEntry *entry = type_lookup_iface_entry_L (node, iface);
2037 IFaceHolder *iholder = type_iface_peek_holder_L (iface, NODE_TYPE (node));
2038 GTypeInterface *vtable = NULL;
2039 guint i;
2040
2041 /* iholder->info should have been filled in by type_iface_vtable_base_init_Wm() */
2042 g_assert (iface->data && entry && iholder && iholder->info);
2043 g_assert (entry->init_state == IFACE_INIT); /* assert prior base_init() */
2044
2045 entry->init_state = INITIALIZED;
2046
2047 vtable = entry->vtable;
2048
2049 if (iholder->info->interface_init)
2050 {
2051 G_WRITE_UNLOCK (&type_rw_lock);
2052 if (iholder->info->interface_init)
2053 iholder->info->interface_init (vtable, iholder->info->interface_data);
2054 G_WRITE_LOCK (&type_rw_lock);
2055 }
2056
2057 for (i = 0; i < static_n_iface_check_funcs; i++)
2058 {
2059 GTypeInterfaceCheckFunc check_func = static_iface_check_funcs[i].check_func;
2060 gpointer check_data = static_iface_check_funcs[i].check_data;
2061
2062 G_WRITE_UNLOCK (&type_rw_lock);
2063 check_func (check_data, (gpointer)vtable);
|
1981 static gboolean
1982 type_iface_vtable_base_init_Wm (TypeNode *iface,
1983 TypeNode *node)
1984 {
1985 IFaceEntry *entry;
1986 IFaceHolder *iholder;
1987 GTypeInterface *vtable = NULL;
1988 TypeNode *pnode;
1989
1990 /* type_iface_retrieve_holder_info_Wm() doesn't modify write lock for returning NULL */
1991 iholder = type_iface_retrieve_holder_info_Wm (iface, NODE_TYPE (node), TRUE);
1992 if (!iholder)
1993 return FALSE; /* we don't modify write lock upon FALSE */
1994
1995 type_iface_ensure_dflt_vtable_Wm (iface);
1996
1997 entry = type_lookup_iface_entry_L (node, iface);
1998
1999 g_assert (iface->data && entry && entry->vtable == NULL && iholder && iholder->info);
2000
2001 #ifdef GSTREAMER_LITE
2002 if (entry == NULL)
2003 return FALSE;
2004 #endif // GSTREAMER_LITE
2005
2006 entry->init_state = IFACE_INIT;
2007
2008 pnode = lookup_type_node_I (NODE_PARENT_TYPE (node));
2009 if (pnode) /* want to copy over parent iface contents */
2010 {
2011 IFaceEntry *pentry = type_lookup_iface_entry_L (pnode, iface);
2012
2013 if (pentry)
2014 vtable = g_memdup (pentry->vtable, iface->data->iface.vtable_size);
2015 }
2016 if (!vtable)
2017 vtable = g_memdup (iface->data->iface.dflt_vtable, iface->data->iface.vtable_size);
2018 entry->vtable = vtable;
2019 vtable->g_type = NODE_TYPE (iface);
2020 vtable->g_instance_type = NODE_TYPE (node);
2021
2022 if (iface->data->iface.vtable_init_base)
2023 {
2024 G_WRITE_UNLOCK (&type_rw_lock);
2025 iface->data->iface.vtable_init_base (vtable);
2029 }
2030
2031 /* Finishes what type_iface_vtable_base_init_Wm started by
2032 * calling the interface init function.
2033 * this function may only be called for types with their
2034 * own interface holder info, i.e. types for which
2035 * g_type_add_interface*() was called and not children thereof.
2036 */
2037 static void
2038 type_iface_vtable_iface_init_Wm (TypeNode *iface,
2039 TypeNode *node)
2040 {
2041 IFaceEntry *entry = type_lookup_iface_entry_L (node, iface);
2042 IFaceHolder *iholder = type_iface_peek_holder_L (iface, NODE_TYPE (node));
2043 GTypeInterface *vtable = NULL;
2044 guint i;
2045
2046 /* iholder->info should have been filled in by type_iface_vtable_base_init_Wm() */
2047 g_assert (iface->data && entry && iholder && iholder->info);
2048 g_assert (entry->init_state == IFACE_INIT); /* assert prior base_init() */
2049
2050 #ifdef GSTREAMER_LITE
2051 if (entry == NULL)
2052 return;
2053 #endif // GSTREAMER_LITE
2054
2055 entry->init_state = INITIALIZED;
2056
2057 vtable = entry->vtable;
2058
2059 if (iholder->info->interface_init)
2060 {
2061 G_WRITE_UNLOCK (&type_rw_lock);
2062 if (iholder->info->interface_init)
2063 iholder->info->interface_init (vtable, iholder->info->interface_data);
2064 G_WRITE_LOCK (&type_rw_lock);
2065 }
2066
2067 for (i = 0; i < static_n_iface_check_funcs; i++)
2068 {
2069 GTypeInterfaceCheckFunc check_func = static_iface_check_funcs[i].check_func;
2070 gpointer check_data = static_iface_check_funcs[i].check_data;
2071
2072 G_WRITE_UNLOCK (&type_rw_lock);
2073 check_func (check_data, (gpointer)vtable);
|