mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 15:06:14 +01:00
adapt to work with new CVS gtk-doc, leaving the old rules in place caused
Wed Jan 31 07:14:22 2001 Tim Janik <timj@gtk.org> * gobject/Makefile.am: adapt to work with new CVS gtk-doc, leaving the old rules in place caused bogus recursions. main changes: - add to conditionalized section: all-local: $(MAKE) scan $(MAKE) templates $(MAKE) sgml $(MAKE) html.stamp html.stamp: sgml.stamp $(EXTRA_SGML_FILES) $(MAKE) html DOC_STAMPS= html.stamp sgml.stamp - change: maintainer-clean-local: clean - cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt $(DOC_STAMPS) * glib/Makefile.am (maintainer-clean-local): dito. Wed Jan 31 06:21:32 2001 Tim Janik <timj@gtk.org> * gobject/tmpl/types.sgml: applied docu patch from Eric Lemings <eric.b.lemings@lmco.com>, did some more editing. Wed Jan 31 06:19:49 2001 Tim Janik <timj@gtk.org> * gparam.h: gtk-doc sucks for not dealing with #define inside enums. * gtype.[hc]: added G_TYPE_FLAG_RESERVED_ID_BIT, a bit in the type number that's supposed to be left untouched (preserved mainly for the signal code). * *.c: added thread safety code, based on an old patch from sebastian. the remaining thread safety issues are now datalists on pspecs (to be solved im gdataset.c) and gvalue.c where locking concerns value exchange functionality only, and that's soon to be revised.
This commit is contained in:
parent
f9dfcb27b7
commit
f0b9abe801
@ -1,7 +1,32 @@
|
||||
Wed Jan 31 07:14:22 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* gobject/Makefile.am: adapt to work with new CVS gtk-doc, leaving the old
|
||||
rules in place caused bogus recursions. main changes:
|
||||
- add to conditionalized section:
|
||||
all-local:
|
||||
$(MAKE) scan
|
||||
$(MAKE) templates
|
||||
$(MAKE) sgml
|
||||
$(MAKE) html.stamp
|
||||
html.stamp: sgml.stamp $(EXTRA_SGML_FILES)
|
||||
$(MAKE) html
|
||||
DOC_STAMPS= html.stamp sgml.stamp
|
||||
- change:
|
||||
maintainer-clean-local: clean
|
||||
- cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
|
||||
+ cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt $(DOC_STAMPS)
|
||||
|
||||
* glib/Makefile.am (maintainer-clean-local): dito.
|
||||
|
||||
Wed Jan 31 06:21:32 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* gobject/tmpl/types.sgml: applied docu patch from Eric Lemings
|
||||
<eric.b.lemings@lmco.com>, did some more editing.
|
||||
|
||||
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
|
||||
|
||||
* glib/glib-sections.txt, glib/tmpl/threads.sgml: Added
|
||||
g_static_mutex_free
|
||||
g_static_mutex_free().
|
||||
|
||||
Tue Jan 9 03:10:38 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
|
@ -96,19 +96,28 @@ EXTRA_DIST = \
|
||||
$(DOC_MODULE)-overrides.txt
|
||||
|
||||
if ENABLE_GTK_DOC
|
||||
all-local: html/index.html
|
||||
|
||||
$(DOC_MODULE)-decl.txt:
|
||||
all-local:
|
||||
$(MAKE) scan
|
||||
|
||||
$(tmpl_sources): $(DOC_MODULE)-decl.txt $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
|
||||
$(MAKE) templates
|
||||
|
||||
sgml/$(DOC_MODULE)-doc.bottom: $(tmpl_sources) $(DOC_MODULE)-decl.txt
|
||||
$(MAKE) sgml
|
||||
|
||||
html/index.html: sgml/$(DOC_MODULE)-doc.bottom $(DOC_MAIN_SGML_FILE)
|
||||
$(MAKE) html.stamp
|
||||
html.stamp: sgml.stamp $(EXTRA_SGML_FILES)
|
||||
$(MAKE) html
|
||||
DOC_STAMPS= html.stamp sgml.stamp
|
||||
|
||||
#all-local: html/index.html
|
||||
#
|
||||
#$(DOC_MODULE)-decl.txt:
|
||||
# $(MAKE) scan
|
||||
#
|
||||
#$(tmpl_sources): $(DOC_MODULE)-decl.txt $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
|
||||
# $(MAKE) templates
|
||||
#
|
||||
#sgml/$(DOC_MODULE)-doc.bottom: $(tmpl_sources) $(DOC_MODULE)-decl.txt
|
||||
# $(MAKE) sgml
|
||||
#
|
||||
#html/index.html: sgml/$(DOC_MODULE)-doc.bottom $(DOC_MAIN_SGML_FILE)
|
||||
# $(MAKE) html
|
||||
endif
|
||||
|
||||
scan:
|
||||
@ -133,7 +142,7 @@ clean-local:
|
||||
rm -f *~ *.bak *.signals *-unused.txt
|
||||
|
||||
maintainer-clean-local: clean
|
||||
cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
|
||||
cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt $(DOC_STAMPS)
|
||||
|
||||
install-data-local:
|
||||
$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
|
||||
|
@ -45,19 +45,28 @@ EXTRA_DIST = \
|
||||
$(DOC_MODULE)-overrides.txt
|
||||
|
||||
if ENABLE_GTK_DOC
|
||||
all-local: html/index.html
|
||||
|
||||
$(DOC_MODULE)-decl.txt:
|
||||
all-local:
|
||||
$(MAKE) scan
|
||||
|
||||
$(tmpl_sources): $(DOC_MODULE)-decl.txt $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
|
||||
$(MAKE) templates
|
||||
|
||||
sgml/$(DOC_MODULE)-doc.bottom: $(tmpl_sources) $(DOC_MODULE)-decl.txt
|
||||
$(MAKE) sgml
|
||||
|
||||
html/index.html: sgml/$(DOC_MODULE)-doc.bottom $(DOC_MAIN_SGML_FILE)
|
||||
$(MAKE) html.stamp
|
||||
html.stamp: sgml.stamp $(EXTRA_SGML_FILES)
|
||||
$(MAKE) html
|
||||
DOC_STAMPS= html.stamp sgml.stamp
|
||||
|
||||
#all-local: html/index.html
|
||||
#
|
||||
#$(DOC_MODULE)-decl.txt:
|
||||
# $(MAKE) scan
|
||||
#
|
||||
#$(tmpl_sources): $(DOC_MODULE)-decl.txt $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
|
||||
# $(MAKE) templates
|
||||
#
|
||||
#sgml/$(DOC_MODULE)-doc.bottom: $(tmpl_sources) $(DOC_MODULE)-decl.txt
|
||||
# $(MAKE) sgml
|
||||
#
|
||||
#html/index.html: sgml/$(DOC_MODULE)-doc.bottom $(DOC_MAIN_SGML_FILE)
|
||||
# $(MAKE) html
|
||||
endif
|
||||
|
||||
scan:
|
||||
@ -81,7 +90,7 @@ clean-local:
|
||||
rm -f *~ *.bak *.signals *-unused.txt
|
||||
|
||||
maintainer-clean-local: clean
|
||||
cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
|
||||
cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt $(DOC_STAMPS)
|
||||
|
||||
install-data-local:
|
||||
$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
|
||||
|
@ -39,6 +39,7 @@ G_TYPE_CHECK_CLASS_CAST
|
||||
G_TYPE_CHECK_CLASS_TYPE
|
||||
G_TYPE_CHECK_VALUE
|
||||
G_TYPE_CHECK_VALUE_TYPE
|
||||
G_TYPE_FLAG_RESERVED_ID_BIT
|
||||
g_type_init
|
||||
g_type_name
|
||||
g_type_qname
|
||||
@ -300,6 +301,7 @@ g_value_dup_param
|
||||
g_value_get_ccallback
|
||||
g_value_get_pointer
|
||||
g_value_set_pointer
|
||||
g_value_get_as_pointer
|
||||
g_value_set_ccallback
|
||||
g_value_set_instance
|
||||
</SECTION>
|
||||
@ -316,6 +318,9 @@ G_IS_PARAM_SPEC
|
||||
G_PARAM_SPEC_GET_CLASS
|
||||
G_PARAM_SPEC_VALUE_TYPE
|
||||
G_TYPE_IS_PARAM
|
||||
G_PARAM_READWRITE
|
||||
G_PARAM_MASK
|
||||
G_PARAM_USER_SHIFT
|
||||
GParamFlags
|
||||
g_param_spec_ref
|
||||
g_param_spec_unref
|
||||
@ -328,12 +333,14 @@ g_param_value_set_default
|
||||
g_param_value_defaults
|
||||
g_param_value_validate
|
||||
g_param_values_cmp
|
||||
g_param_spec_internal
|
||||
GParamSpecTypeInfo
|
||||
g_param_type_register_static
|
||||
GParamSpecPool
|
||||
g_param_spec_pool_new
|
||||
g_param_spec_pool_insert
|
||||
g_param_spec_pool_remove
|
||||
g_param_spec_pool_lookup
|
||||
g_param_type_register_static
|
||||
g_param_spec_internal
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
@ -462,18 +469,20 @@ g_signal_type_cclosure_new
|
||||
<SECTION>
|
||||
<TITLE>Closures</TITLE>
|
||||
<FILE>closures</FILE>
|
||||
GClosureMarshal
|
||||
GClosureNotify
|
||||
GClosure
|
||||
GCClosure
|
||||
GClosureNotifyData
|
||||
GCallback
|
||||
G_CLOSURE_NEEDS_MARSHAL
|
||||
G_CCLOSURE_SWAP_DATA
|
||||
G_CALLBACK
|
||||
GCallback
|
||||
GClosure
|
||||
GCClosure
|
||||
GClosureMarshal
|
||||
GClosureNotify
|
||||
GClosureNotifyData
|
||||
g_cclosure_new
|
||||
g_cclosure_new_swap
|
||||
g_cclosure_new_object
|
||||
g_cclosure_new_object_swap
|
||||
g_closure_new_object
|
||||
g_closure_ref
|
||||
g_closure_unref
|
||||
g_closure_invoke
|
||||
|
@ -14,6 +14,51 @@ Closures
|
||||
|
||||
</para>
|
||||
|
||||
<!-- ##### MACRO G_CLOSURE_NEEDS_MARSHAL ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@closure:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_CCLOSURE_SWAP_DATA ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@cclosure:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_CALLBACK ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@f:
|
||||
|
||||
|
||||
<!-- ##### TYPEDEF GCallback ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### STRUCT GClosure ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@is_invalid:
|
||||
|
||||
<!-- ##### STRUCT GCClosure ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@closure:
|
||||
@callback:
|
||||
|
||||
<!-- ##### USER_FUNCTION GClosureMarshal ##### -->
|
||||
<para>
|
||||
|
||||
@ -36,21 +81,6 @@ Closures
|
||||
@closure:
|
||||
|
||||
|
||||
<!-- ##### STRUCT GClosure ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@is_invalid:
|
||||
|
||||
<!-- ##### STRUCT GCClosure ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@closure:
|
||||
@callback:
|
||||
|
||||
<!-- ##### STRUCT GClosureNotifyData ##### -->
|
||||
<para>
|
||||
|
||||
@ -59,28 +89,6 @@ Closures
|
||||
@data:
|
||||
@notify:
|
||||
|
||||
<!-- ##### TYPEDEF GCallback ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### MACRO G_CLOSURE_NEEDS_MARSHAL ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@closure:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_CCLOSURE_SWAP_DATA ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@cclosure:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_cclosure_new ##### -->
|
||||
<para>
|
||||
|
||||
@ -123,6 +131,16 @@ Closures
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_closure_new_object ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@sizeof_closure:
|
||||
@object:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_closure_ref ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -88,6 +88,27 @@ Parameter Specifications
|
||||
@type:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PARAM_READWRITE ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PARAM_MASK ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PARAM_USER_SHIFT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### ENUM GParamFlags ##### -->
|
||||
<para>
|
||||
|
||||
@ -205,19 +226,36 @@ Parameter Specifications
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_internal ##### -->
|
||||
<!-- ##### STRUCT GParamSpecTypeInfo ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@instance_size:
|
||||
@n_preallocs:
|
||||
@instance_init:
|
||||
@value_type:
|
||||
@finalize:
|
||||
@value_set_default:
|
||||
@value_validate:
|
||||
@values_cmp:
|
||||
|
||||
<!-- ##### FUNCTION g_param_type_register_static ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@param_type:
|
||||
@name:
|
||||
@nick:
|
||||
@blurb:
|
||||
@flags:
|
||||
@pspec_info:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### STRUCT GParamSpecPool ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_param_spec_pool_new ##### -->
|
||||
<para>
|
||||
|
||||
@ -259,13 +297,16 @@ Parameter Specifications
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_param_type_register_static ##### -->
|
||||
<!-- ##### FUNCTION g_param_spec_internal ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@param_type:
|
||||
@name:
|
||||
@pspec_info:
|
||||
@nick:
|
||||
@blurb:
|
||||
@flags:
|
||||
@Returns:
|
||||
|
||||
|
||||
|
@ -2,11 +2,26 @@
|
||||
GType
|
||||
|
||||
<!-- ##### SECTION Short_Description ##### -->
|
||||
|
||||
The GLib Runtime type identification and management system
|
||||
|
||||
<!-- ##### SECTION Long_Description ##### -->
|
||||
<para>
|
||||
|
||||
The GType API is the foundation of the GObject system. It provides the
|
||||
facilities for registering and managing all fundamental data types,
|
||||
user-defined object and interface types. Before using any GType
|
||||
or GObject functions, g_type_init() must be called to initialize the
|
||||
type system.
|
||||
</para>
|
||||
<para>
|
||||
For type creation and registration purposes, all types fall into one of
|
||||
two categories: static or dynamic. Static types are never loaded or
|
||||
unloaded at run-time as dynamic types may be. Static types are created
|
||||
with g_type_register_static() that gets type specific information passed
|
||||
in via a #GTypeInfo structure.
|
||||
Dynamic types are created with g_type_register_dynamic() which takes a
|
||||
#GTypePlugin structure instead. The remaining type information (the
|
||||
#GTypeInfo structure) is retrived during runtime through #GTypePlugin
|
||||
and the g_type_plugin_*() API.
|
||||
</para>
|
||||
|
||||
<!-- ##### SECTION See_Also ##### -->
|
||||
@ -16,21 +31,25 @@ GType
|
||||
|
||||
<!-- ##### TYPEDEF GType ##### -->
|
||||
<para>
|
||||
|
||||
A numerical value which represents the unique identifier of a registered
|
||||
type.
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_FUNDAMENTAL ##### -->
|
||||
<para>
|
||||
|
||||
Returns #TRUE if @type is a fundamental data type such as #G_TYPE_INT or
|
||||
#G_TYPE_POINTER. Fundamental types are types that serve as fundaments for
|
||||
the derived types, thus they are the roots of distinct inheritance heirachies.
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: a #GType value
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_FUNDAMENTAL_MAX ##### -->
|
||||
<para>
|
||||
|
||||
An integer constant that represents the number of identifiers reserved
|
||||
for types that are assigned at compile-time.
|
||||
</para>
|
||||
|
||||
|
||||
@ -54,25 +73,32 @@ GType
|
||||
|
||||
<!-- ##### MACRO G_TYPE_FUNDAMENTAL_LAST ##### -->
|
||||
<para>
|
||||
|
||||
An integer that currently represents the highest value of all
|
||||
fundamental type identifiers. This is of interest for dynamic
|
||||
introduction of new fundamental types (a
|
||||
<emphasis>rarely</emphasis> needed feature).
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_ABSTRACT ##### -->
|
||||
<para>
|
||||
|
||||
Returns #TRUE if @type is an abstract type. An abstract type can not be
|
||||
instantiated and is normally used as an abstract base class for
|
||||
derived classes.
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_DERIVED ##### -->
|
||||
<para>
|
||||
|
||||
Returns #TRUE if @type is derived (or in object-oriented terminolgy:
|
||||
inherited) from another type (this holds true for all non-fundamental
|
||||
types).
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_FUNDAMENTAL ##### -->
|
||||
@ -80,7 +106,7 @@ GType
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_VALUE_TYPE ##### -->
|
||||
@ -88,7 +114,7 @@ GType
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_CLASSED ##### -->
|
||||
@ -96,15 +122,16 @@ GType
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_INSTANTIATABLE ##### -->
|
||||
<para>
|
||||
|
||||
Returns #TRUE if @type can be instantiated. Instantiation is the
|
||||
process of creating an instance (object) of this type.
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_DERIVABLE ##### -->
|
||||
@ -112,7 +139,7 @@ GType
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_DEEP_DERIVABLE ##### -->
|
||||
@ -120,15 +147,18 @@ GType
|
||||
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_IS_INTERFACE ##### -->
|
||||
<para>
|
||||
|
||||
Returns #TRUE if @type is an interface type.
|
||||
Interface types are types that provide pure APIs, the implementation
|
||||
of which is provided by another type (which is then said to conform
|
||||
to the interface).
|
||||
</para>
|
||||
|
||||
@type:
|
||||
@type: A #GType value.
|
||||
|
||||
|
||||
<!-- ##### ENUM GTypeFundamentals ##### -->
|
||||
@ -195,19 +225,27 @@ GType
|
||||
|
||||
<!-- ##### STRUCT GTypeInfo ##### -->
|
||||
<para>
|
||||
|
||||
This structure is used to provide the type system with the information
|
||||
required to initialize and destruct (finalize) a type's class and
|
||||
instances thereof.
|
||||
The initialized structure is passed to the g_type_register_static() function
|
||||
(or is copied into the provided #GTypeInfo structure in the
|
||||
g_type_plugin_complete_type_info()). The type system will perform a deep
|
||||
copy of this structure, so it's memory does not need to be persistent
|
||||
across invocation of g_type_register_static().
|
||||
</para>
|
||||
|
||||
@class_size:
|
||||
@base_init:
|
||||
@base_finalize:
|
||||
@class_init:
|
||||
@class_finalize:
|
||||
@class_data:
|
||||
@instance_size:
|
||||
@n_preallocs:
|
||||
@instance_init:
|
||||
@value_table:
|
||||
@class_size: Size of the class structure (required for interface, classed and instantiatable types).
|
||||
@base_init: Location of the base initialization function (optional).
|
||||
@base_finalize: Location of the base finalization function (optional).
|
||||
@class_init: Location of the class initialization function (optional, for classed and instantiatable types only).
|
||||
@class_finalize: Location of the class finalization function (optional).
|
||||
@class_data: User-supplied data passed to the class init/finalize functions.
|
||||
@instance_size: Size of the instance (object) structure (required for instantiatable types only).
|
||||
@n_preallocs: Number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching).
|
||||
@instance_init: The location of the instance initialization function (optional, for instantiatable types only).
|
||||
@value_table: Function table for generic handling of GValues of this type (usualy only usefull for
|
||||
fundamental types).
|
||||
|
||||
<!-- ##### STRUCT GTypeFundamentalInfo ##### -->
|
||||
<para>
|
||||
@ -346,6 +384,13 @@ GType
|
||||
@g_type:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_TYPE_FLAG_RESERVED_ID_BIT ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_type_init ##### -->
|
||||
<para>
|
||||
Prior to any use of the type system, g_type_init() has to be called to initialize
|
||||
|
@ -371,6 +371,15 @@ Standard value types
|
||||
@v_pointer:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_get_as_pointer ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@value:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_value_set_ccallback ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -1,3 +1,16 @@
|
||||
Wed Jan 31 06:19:49 2001 Tim Janik <timj@gtk.org>
|
||||
|
||||
* gparam.h: gtk-doc sucks for not dealing with #define inside enums.
|
||||
|
||||
* gtype.[hc]: added G_TYPE_FLAG_RESERVED_ID_BIT, a bit in the type
|
||||
number that's supposed to be left untouched (preserved mainly
|
||||
for the signal code).
|
||||
|
||||
* *.c: added thread safety code, based on an old patch from sebastian.
|
||||
the remaining thread safety issues are now datalists on pspecs (to be
|
||||
solved im gdataset.c) and gvalue.c where locking concerns value exchange
|
||||
functionality only, and that's soon to be revised.
|
||||
|
||||
2001-01-27 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* makefile.msc.in: Don't try to compile gmarshal.c on its own.
|
||||
|
@ -16,6 +16,7 @@
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "gclosure.h"
|
||||
|
||||
#include "gvalue.h"
|
||||
|
@ -17,6 +17,10 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "genums.h"
|
||||
|
@ -16,6 +16,11 @@
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include "gobject.h"
|
||||
|
||||
|
||||
@ -140,9 +145,10 @@ static gulong gobject_signals[LAST_SIGNAL] = { 0, };
|
||||
gboolean glib_debug_objects = FALSE;
|
||||
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
G_LOCK_DEFINE_STATIC (debug_objects);
|
||||
static volatile GObject *glib_trap_object_ref = NULL;
|
||||
static guint debug_objects_count = 0;
|
||||
static GHashTable *debug_objects_ht = NULL;
|
||||
static guint debug_objects_count = 0;
|
||||
static GHashTable *debug_objects_ht = NULL;
|
||||
static void
|
||||
debug_objects_foreach (gpointer key,
|
||||
gpointer value,
|
||||
@ -158,6 +164,7 @@ debug_objects_foreach (gpointer key,
|
||||
static void
|
||||
debug_objects_atexit (void)
|
||||
{
|
||||
G_LOCK (debug_objects);
|
||||
if (glib_debug_objects)
|
||||
{
|
||||
if (debug_objects_ht)
|
||||
@ -166,6 +173,7 @@ debug_objects_atexit (void)
|
||||
g_hash_table_foreach (debug_objects_ht, debug_objects_foreach, NULL);
|
||||
}
|
||||
}
|
||||
G_UNLOCK (debug_objects);
|
||||
}
|
||||
#endif /* G_ENABLE_DEBUG */
|
||||
|
||||
@ -433,6 +441,7 @@ g_object_init (GObject *object)
|
||||
object_freeze_notifies (object);
|
||||
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
G_LOCK (debug_objects);
|
||||
if (glib_debug_objects)
|
||||
{
|
||||
if (!debug_objects_ht)
|
||||
@ -440,6 +449,7 @@ g_object_init (GObject *object)
|
||||
debug_objects_count++;
|
||||
g_hash_table_insert (debug_objects_ht, object, object);
|
||||
}
|
||||
G_UNLOCK (debug_objects);
|
||||
#endif /* G_ENABLE_DEBUG */
|
||||
}
|
||||
|
||||
@ -522,8 +532,10 @@ g_object_last_unref (GObject *object)
|
||||
{
|
||||
G_OBJECT_GET_CLASS (object)->finalize (object);
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
G_LOCK (debug_objects);
|
||||
if (glib_debug_objects && debug_objects_ht)
|
||||
g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL);
|
||||
G_UNLOCK (debug_objects);
|
||||
#endif /* G_ENABLE_DEBUG */
|
||||
g_type_free_instance ((GTypeInstance*) object);
|
||||
}
|
||||
@ -545,6 +557,7 @@ g_object_finalize (GObject *object)
|
||||
g_datalist_clear (&object->qdata);
|
||||
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
G_LOCK (debug_objects);
|
||||
if (glib_debug_objects)
|
||||
{
|
||||
g_assert (g_hash_table_lookup (debug_objects_ht, object) == object);
|
||||
@ -552,6 +565,7 @@ g_object_finalize (GObject *object)
|
||||
g_hash_table_remove (debug_objects_ht, object);
|
||||
debug_objects_count--;
|
||||
}
|
||||
G_UNLOCK (debug_objects);
|
||||
#endif /* G_ENABLE_DEBUG */
|
||||
}
|
||||
|
||||
|
165
gobject/gparam.c
165
gobject/gparam.c
@ -16,6 +16,11 @@
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include "gparam.h"
|
||||
|
||||
|
||||
@ -25,8 +30,11 @@
|
||||
|
||||
|
||||
/* --- defines --- */
|
||||
#define G_PARAM_SPEC_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_PARAM, GParamSpecClass))
|
||||
#define PSPEC_APPLIES_TO_VALUE(pspec, value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
|
||||
#define G_PARAM_SPEC_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_PARAM, GParamSpecClass))
|
||||
#define G_PARAM_USER_MASK ((1 << G_PARAM_USER_SHIFT) - 1)
|
||||
#define PSPEC_APPLIES_TO_VALUE(pspec, value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
|
||||
#define G_SLOCK(mutex) g_static_mutex_lock (mutex)
|
||||
#define G_SUNLOCK(mutex) g_static_mutex_unlock (mutex)
|
||||
|
||||
|
||||
/* --- prototypes --- */
|
||||
@ -54,6 +62,7 @@ static gchar* value_param_lcopy_value (const GValue *value,
|
||||
|
||||
/* --- variables --- */
|
||||
static GQuark quark_floating = 0;
|
||||
G_LOCK_DEFINE_STATIC (pspec_ref_count);
|
||||
|
||||
|
||||
/* --- functions --- */
|
||||
@ -151,10 +160,19 @@ GParamSpec*
|
||||
g_param_spec_ref (GParamSpec *pspec)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL);
|
||||
g_return_val_if_fail (pspec->ref_count > 0, NULL);
|
||||
|
||||
pspec->ref_count += 1;
|
||||
|
||||
G_LOCK (pspec_ref_count);
|
||||
if (pspec->ref_count > 0)
|
||||
{
|
||||
pspec->ref_count += 1;
|
||||
G_UNLOCK (pspec_ref_count);
|
||||
}
|
||||
else
|
||||
{
|
||||
G_UNLOCK (pspec_ref_count);
|
||||
g_return_val_if_fail (pspec->ref_count > 0, NULL);
|
||||
}
|
||||
|
||||
return pspec;
|
||||
}
|
||||
|
||||
@ -162,27 +180,53 @@ void
|
||||
g_param_spec_unref (GParamSpec *pspec)
|
||||
{
|
||||
g_return_if_fail (G_IS_PARAM_SPEC (pspec));
|
||||
g_return_if_fail (pspec->ref_count > 0);
|
||||
|
||||
/* sync with _sink */
|
||||
pspec->ref_count -= 1;
|
||||
if (pspec->ref_count == 0)
|
||||
G_PARAM_SPEC_GET_CLASS (pspec)->finalize (pspec);
|
||||
G_LOCK (pspec_ref_count);
|
||||
if (pspec->ref_count > 0)
|
||||
{
|
||||
gboolean need_finalize;
|
||||
|
||||
/* sync with _sink */
|
||||
pspec->ref_count -= 1;
|
||||
need_finalize = pspec->ref_count == 0;
|
||||
G_UNLOCK (pspec_ref_count);
|
||||
if (need_finalize)
|
||||
G_PARAM_SPEC_GET_CLASS (pspec)->finalize (pspec);
|
||||
}
|
||||
else
|
||||
{
|
||||
G_UNLOCK (pspec_ref_count);
|
||||
g_return_if_fail (pspec->ref_count > 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
g_param_spec_sink (GParamSpec *pspec)
|
||||
{
|
||||
g_return_if_fail (G_IS_PARAM_SPEC (pspec));
|
||||
g_return_if_fail (pspec->ref_count > 0);
|
||||
|
||||
if (g_datalist_id_remove_no_notify (&pspec->qdata, quark_floating))
|
||||
G_LOCK (pspec_ref_count);
|
||||
if (pspec->ref_count > 0)
|
||||
{
|
||||
/* sync with _unref */
|
||||
if (pspec->ref_count > 1)
|
||||
pspec->ref_count -= 1;
|
||||
else
|
||||
g_param_spec_unref (pspec);
|
||||
if (g_datalist_id_remove_no_notify (&pspec->qdata, quark_floating))
|
||||
{
|
||||
/* sync with _unref */
|
||||
if (pspec->ref_count > 1)
|
||||
pspec->ref_count -= 1;
|
||||
else
|
||||
{
|
||||
G_UNLOCK (pspec_ref_count);
|
||||
g_param_spec_unref (pspec);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
G_UNLOCK (pspec_ref_count);
|
||||
}
|
||||
else
|
||||
{
|
||||
G_UNLOCK (pspec_ref_count);
|
||||
g_return_if_fail (pspec->ref_count > 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -405,8 +449,9 @@ value_param_lcopy_value (const GValue *value,
|
||||
/* --- param spec pool --- */
|
||||
struct _GParamSpecPool
|
||||
{
|
||||
gboolean type_prefixing;
|
||||
GHashTable *hash_table;
|
||||
GStaticMutex smutex;
|
||||
gboolean type_prefixing;
|
||||
GHashTable *hash_table;
|
||||
};
|
||||
|
||||
static guint
|
||||
@ -436,8 +481,10 @@ param_spec_pool_equals (gconstpointer key_spec_1,
|
||||
GParamSpecPool*
|
||||
g_param_spec_pool_new (gboolean type_prefixing)
|
||||
{
|
||||
static GStaticMutex init_smutex = G_STATIC_MUTEX_INIT;
|
||||
GParamSpecPool *pool = g_new (GParamSpecPool, 1);
|
||||
|
||||
memcpy (&pool->smutex, &init_smutex, sizeof (init_smutex));
|
||||
pool->type_prefixing = type_prefixing != FALSE;
|
||||
pool->hash_table = g_hash_table_new (param_spec_pool_hash, param_spec_pool_equals);
|
||||
|
||||
@ -450,37 +497,52 @@ g_param_spec_pool_insert (GParamSpecPool *pool,
|
||||
GType owner_type)
|
||||
{
|
||||
gchar *p;
|
||||
|
||||
g_return_if_fail (pool != NULL);
|
||||
g_return_if_fail (pspec);
|
||||
g_return_if_fail (owner_type > 0);
|
||||
g_return_if_fail (pspec->owner_type == 0);
|
||||
|
||||
for (p = pspec->name; *p; p++)
|
||||
|
||||
if (pool && pspec && owner_type > 0 && pspec->owner_type == 0)
|
||||
{
|
||||
if (!strchr (G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", *p))
|
||||
G_SLOCK (&pool->smutex);
|
||||
for (p = pspec->name; *p; p++)
|
||||
{
|
||||
g_warning (G_STRLOC ": pspec name \"%s\" contains invalid characters", pspec->name);
|
||||
return;
|
||||
if (!strchr (G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", *p))
|
||||
{
|
||||
g_warning (G_STRLOC ": pspec name \"%s\" contains invalid characters", pspec->name);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pspec->owner_type = owner_type;
|
||||
g_param_spec_ref (pspec);
|
||||
g_hash_table_insert (pool->hash_table, pspec, pspec);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_return_if_fail (pool != NULL);
|
||||
g_return_if_fail (pspec);
|
||||
g_return_if_fail (owner_type > 0);
|
||||
g_return_if_fail (pspec->owner_type == 0);
|
||||
}
|
||||
|
||||
pspec->owner_type = owner_type;
|
||||
g_param_spec_ref (pspec);
|
||||
g_hash_table_insert (pool->hash_table, pspec, pspec);
|
||||
}
|
||||
|
||||
void
|
||||
g_param_spec_pool_remove (GParamSpecPool *pool,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
g_return_if_fail (pool != NULL);
|
||||
g_return_if_fail (pspec);
|
||||
|
||||
if (g_hash_table_remove (pool->hash_table, pspec))
|
||||
g_param_spec_unref (pspec);
|
||||
if (pool && pspec)
|
||||
{
|
||||
G_SLOCK (&pool->smutex);
|
||||
if (g_hash_table_remove (pool->hash_table, pspec))
|
||||
g_param_spec_unref (pspec);
|
||||
else
|
||||
g_warning (G_STRLOC ": attempt to remove unknown pspec `%s' from pool", pspec->name);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
}
|
||||
else
|
||||
g_warning (G_STRLOC ": attempt to remove unknown pspec `%s' from pool", pspec->name);
|
||||
{
|
||||
g_return_if_fail (pool != NULL);
|
||||
g_return_if_fail (pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static inline GParamSpec*
|
||||
@ -542,8 +604,13 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
GParamSpec *pspec;
|
||||
gchar *delim;
|
||||
|
||||
g_return_val_if_fail (pool != NULL, NULL);
|
||||
g_return_val_if_fail (param_name, NULL);
|
||||
if (!pool || !param_name)
|
||||
{
|
||||
g_return_val_if_fail (pool != NULL, NULL);
|
||||
g_return_val_if_fail (param_name != NULL, NULL);
|
||||
}
|
||||
|
||||
G_SLOCK (&pool->smutex);
|
||||
|
||||
delim = strchr (param_name, ':');
|
||||
|
||||
@ -552,7 +619,10 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
{
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
return param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return pspec;
|
||||
}
|
||||
|
||||
/* strip type prefix */
|
||||
@ -574,6 +644,8 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
{
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
owner_type = type;
|
||||
@ -583,7 +655,10 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
{
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
return param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||
pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors);
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return pspec;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -601,12 +676,16 @@ g_param_spec_pool_lookup (GParamSpecPool *pool,
|
||||
g_free (buffer);
|
||||
if (trailer_p)
|
||||
*trailer_p = pspec ? delim + 2 : NULL;
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return pspec;
|
||||
}
|
||||
|
||||
/* malformed param_name */
|
||||
if (trailer_p)
|
||||
*trailer_p = NULL;
|
||||
G_SUNLOCK (&pool->smutex);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -48,12 +48,12 @@ typedef enum
|
||||
G_PARAM_WRITABLE = 1 << 1,
|
||||
G_PARAM_CONSTRUCT = 1 << 2,
|
||||
G_PARAM_CONSTRUCT_ONLY = 1 << 3,
|
||||
G_PARAM_PRIVATE = 1 << 4,
|
||||
#define G_PARAM_MASK (0x000000ff)
|
||||
/* bits in the range 0xffffff00 are reserved for 3rd party usage */
|
||||
#define G_PARAM_USER_MASK (0xffffff00)
|
||||
G_PARAM_PRIVATE = 1 << 4
|
||||
} GParamFlags;
|
||||
#define G_PARAM_READWRITE (G_PARAM_READABLE | G_PARAM_WRITABLE)
|
||||
#define G_PARAM_MASK (0x000000ff)
|
||||
/* bits in the range 0xffffff00 are reserved for 3rd party usage */
|
||||
#define G_PARAM_USER_SHIFT (8)
|
||||
|
||||
|
||||
/* --- typedefs & structures --- */
|
||||
|
@ -16,6 +16,11 @@
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include "gparamspecs.h"
|
||||
|
||||
#include "gvaluecollector.h"
|
||||
|
@ -19,11 +19,15 @@
|
||||
* this code is based on the original GtkSignal implementation
|
||||
* for the Gtk+ library by Peter Mattis <petm@xcf.berkeley.edu>
|
||||
*/
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include "gsignal.h"
|
||||
#include "gbsearcharray.h"
|
||||
#include "gvaluecollector.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/* pre allocation configurations
|
||||
@ -64,26 +68,10 @@ g_generic_node_alloc (GTrashStack **trash_stack_p,
|
||||
|
||||
return node;
|
||||
}
|
||||
static inline void
|
||||
g_generic_node_free (GTrashStack **trash_stack_p,
|
||||
gpointer node)
|
||||
{
|
||||
g_trash_stack_push (trash_stack_p, node);
|
||||
}
|
||||
#define g_generic_node_free(trash_stack_p, node) g_trash_stack_push (trash_stack_p, node)
|
||||
#else /* !DISABLE_MEM_POOLS */
|
||||
static inline gpointer
|
||||
g_generic_node_alloc (GTrashStack **trash_stack_p,
|
||||
guint sizeof_node,
|
||||
guint nodes_pre_alloc)
|
||||
{
|
||||
return g_malloc (sizeof_node);
|
||||
}
|
||||
static inline void
|
||||
g_generic_node_free (GTrashStack **trash_stack_p,
|
||||
gpointer node)
|
||||
{
|
||||
g_free (node);
|
||||
}
|
||||
#define g_generic_node_alloc(t,sizeof_node,p) g_malloc (sizeof_node)
|
||||
#define g_generic_node_free(t,node) g_free (node)
|
||||
#endif /* !DISABLE_MEM_POOLS */
|
||||
|
||||
|
||||
@ -2027,6 +2015,6 @@ signal_emit_R (SignalNode *node,
|
||||
}
|
||||
|
||||
|
||||
/* compile standard marshallers */
|
||||
/* --- compile standard marshallers --- */
|
||||
#include "gvaluetypes.h"
|
||||
#include "gmarshal.c"
|
||||
|
1401
gobject/gtype.c
1401
gobject/gtype.c
File diff suppressed because it is too large
Load Diff
@ -344,6 +344,7 @@ GTypeValueTable* g_type_value_table_peek (GType type);
|
||||
#define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl))
|
||||
#define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class))
|
||||
#define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt))
|
||||
#define G_TYPE_FLAG_RESERVED_ID_BIT (1 << 30)
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -17,6 +17,10 @@
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* FIXME: MT-safety
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "gvalue.h"
|
||||
|
@ -16,6 +16,11 @@
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
* MT safe
|
||||
*/
|
||||
|
||||
#include "gvaluetypes.h"
|
||||
|
||||
#include "gvaluecollector.h"
|
||||
|
Loading…
Reference in New Issue
Block a user