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