📄 gclosure.sgml
字号:
<!-- ##### SECTION Title ##### -->Closures<!-- ##### SECTION Short_Description ##### -->Functions as first-class objects<!-- ##### SECTION Long_Description ##### --><para>A #GClosure represents a callback supplied by the programmer. It will generallycomprise a function of some kind and a marshaller used to call it. It is the reponsibility of the marshaller to convert the arguments for the invocation from #GValue<!-- -->s into a suitable form, perform the callback on the converted arguments, and transform the return value back into a #GValue.</para><para>In the case of C programs, a closure usually just holds a pointer to a functionand maybe a data argument, and the marshaller converts between #GValue<!-- -->and native C types. The GObject library provides the #GCClosure type for thispurpose. Bindings for other languages need marshallers which convert between #GValue<!-- -->s and suitable representations in the runtimeof the language in order to use functions written in that languages as callbacks.</para><para>Within GObject, closures play an important role in the implementation of signals. When a signal is registered, the @c_marshaller argument to g_signal_new() specifies the default C marshaller for any closure which is connected to this signal. GObject provides a number of C marshallers for this purpose, see the g_cclosure_marshal_*() functions. AdditionalC marshallers can be generated with the <link linkend="glib-genmarshal">glib-genmarshal</link> utility.Closures can be explicitly connected to signals with g_signal_connect_closure(), but it usually more convenient to let GObject create a closure automatically by using one of the g_signal_connect_*() functions which take a callback function/user data pair.</para><para>Using closures has a number of important advantages over a simplecallback function/data pointer combination:<itemizedlist><listitem><para>Closures allow the callee to get the types of the callback parameters, which means that language bindings don't have to write individual glue for each callback type.</para></listitem><listitem><para>The reference counting of #GClosure makes it easy to handle reentrancy right; if a callback is removed while it is being invoked, the closure and it's parameters won't be freed until the invocation finishes. </para></listitem><listitem><para>g_closure_invalidate() and invalidation notifiers allow callbacks to beautomatically removed when the objects they point to go away.</para></listitem></itemizedlist></para><!-- ##### SECTION See_Also ##### --><para></para><!-- ##### SECTION Stability_Level ##### --><!-- ##### MACRO G_CLOSURE_NEEDS_MARSHAL ##### --><para>Returns %TRUE if a #GClosureMarshal marshaller has not yet been set on @closure. See g_closure_set_marshal().</para>@closure: a #GClosure<!-- ##### MACRO G_CLOSURE_N_NOTIFIERS ##### --><para>Returns the total number of notifiers connected with the closure @cl. The count includes the meta marshaller, the finalize and invalidate notifiers and the marshal guards. Note that each guard counts as two notifiers. See g_closure_set_meta_marshal(), g_closure_add_finalize_notifier(),g_closure_add_invalidate_notifier() and g_closure_add_marshal_guards().</para>@cl: a #GClosure<!-- ##### MACRO G_CCLOSURE_SWAP_DATA ##### --><para>Returns whether the user data of the #GCClosure should be passed as thefirst parameter to the callback. See g_cclosure_new_swap().</para>@cclosure: a #GCClosure<!-- ##### MACRO G_CALLBACK ##### --><para>Cast a function pointer to a #GCallback.</para>@f: a function pointer.<!-- ##### USER_FUNCTION GCallback ##### --><para>The type used for callback functions in structure definitions and function signatures. This doesn't mean that all callback functions must take no parameters and return void. The required signature of a callback function is determined by the context in which is used (e.g. the signal to which it is connected). Use G_CALLBACK() to cast the callback function to a #GCallback. </para><!-- ##### STRUCT GClosure ##### --><para>A #GClosure represents a callback supplied by the programmer.</para>@in_marshal: Indicates whether the closure is currently being invoked with g_closure_invoke()@is_invalid: Indicates whether the closure has been invalidated by g_closure_invalidate()<!-- ##### MACRO G_TYPE_CLOSURE ##### --><para>The #GType for #GClosure.</para><!-- ##### STRUCT GCClosure ##### --><para>A #GCClosure is a specialization of #GClosure for C function callbacks.</para>@closure: the #GClosure@callback: the callback function<!-- ##### USER_FUNCTION GClosureMarshal ##### --><para>The type used for marshaller functions.</para>@closure: the #GClosure to which the marshaller belongs@return_value: a #GValue to store the return value. May be %NULL if the callback of @closure doesn't return a value.@n_param_values: the length of the @param_values array@param_values: an array of #GValue<!-- -->s holding the arguments on which to invoke the callback of @closure@invocation_hint: the invocation hint given as the the last argument to g_closure_invoke()@marshal_data: additional data specified when registering the marshaller, see g_closure_set_marshal() and g_closure_set_meta_marshal()<!-- ##### USER_FUNCTION GClosureNotify ##### --><para>The type used for the various notification callbacks which can be registeredon closures.</para>@data: data specified when registering the notification callback@closure: the #GClosure on which the notification is emitted<!-- ##### FUNCTION g_cclosure_new ##### --><para>Creates a new closure which invokes @callback_func with @user_data as the last parameter. </para>@callback_func: the function to invoke@user_data: user data to pass to @callback_func@destroy_data: destroy notify to be called when @user_data is no longer used@Returns: a new #GCClosure<!-- ##### FUNCTION g_cclosure_new_swap ##### --><para>Creates a new closure which invokes @callback_func with @user_data as the first parameter. </para>@callback_func: the function to invoke@user_data: user data to pass to @callback_func@destroy_data: destroy notify to be called when @user_data is no longer used@Returns: a new #GCClosure<!-- ##### FUNCTION g_cclosure_new_object ##### --><para>A variant of g_cclosure_new() which uses @object as @user_data and calls g_object_watch_closure() on @object and the created closure. This function is useful when you have a callback closely associated with a #GObject,and want the callback to no longer run after the object is is freed.</para>@callback_func: the function to invoke@object: a #GObject pointer to pass to @callback_func@Returns: a new #GCClosure<!-- ##### FUNCTION g_cclosure_new_object_swap ##### --><para>A variant of g_cclosure_new_swap() which uses @object as @user_data and calls g_object_watch_closure() on @object and the created closure. This function is useful when you have a callback closely associated with a #GObject,and want the callback to no longer run after the object is is freed.</para>@callback_func: the function to invoke@object: a #GObject pointer to pass to @callback_func@Returns: a new #GCClosure<!-- ##### FUNCTION g_closure_new_object ##### --><para>A variant of g_closure_new_simple() which stores @object in the @datafield of the closure and calls g_object_watch_closure() on @object and the created closure. This function is mainly useful when implementing new types of closures.</para>@sizeof_closure: the size of the structure to allocate, must be at least <literal>sizeof (GClosure)</literal>@object: a #GObject pointer to store in the @data field of the newly allocated #GClosure@Returns: a newly allocated #GClosure<!-- ##### FUNCTION g_closure_ref ##### --><para>Increments the reference count on a closure to force it stayingalive while the caller holds a pointer to it.</para>@closure: #GClosure to increment the reference count on@Returns: The @closure passed in, for convenience<!-- ##### FUNCTION g_closure_sink ##### --><para>Takes over the initial ownership of a closure.Each closure is initially created in a <firstterm>floating</firstterm> state, which means that the initial reference count is not owned by any caller. g_closure_sink() checks to see if the object is still floating, and if so, unsets the floating state and decreases the reference count. If the closure is not floating, g_closure_sink() does nothing. The reason for the existance of the floating state is to prevent cumbersome code sequences like: <programlisting>closure = g_cclosure_new (cb_func, cb_data); g_source_set_closure (source, closure); g_closure_unref (closure); /* XXX GObject doesn't really need this */</programlisting>Because g_source_set_closure() (and similar functions) take ownership of the initial reference count, if it is unowned, we instead can write: <programlisting>g_source_set_closure (source, g_cclosure_new (cb_func, cb_data));</programlisting></para><para>Generally, this function is used together with g_closure_ref(). Ane example of storing a closure for later notification looks like:<informalexample><programlisting>static GClosure *notify_closure = NULL;voidfoo_notify_set_closure (GClosure *closure){ if (notify_closure) g_closure_unref (notify_closure); notify_closure = closure; if (notify_closure) { g_closure_ref (notify_closure); g_closure_sink (notify_closure); }}</programlisting></informalexample></para><para>Because g_closure_sink() may decrement the reference count of a closure(if it hasn't been called on @closure yet) just like g_closure_unref(),g_closure_ref() should be called prior to this function.</para>@closure: #GClosure to decrement the initial reference count on, if it's still being held<!-- ##### FUNCTION g_closure_unref ##### --><para>Decrements the reference count of a closure after it was previously incremented by the same caller. If no other callers are using the closure,then the closure will be destroyed and freed.</para>@closure: #GClosure to decrement the reference count on<!-- ##### FUNCTION g_closure_invoke ##### --><para>Invokes the closure, i.e. executes the callback represented by the @closure.</para>@closure: a #GClosure@return_value: a #GValue to store the return value. May be %NULL if the callback of @closure doesn't return a value.@n_param_values: the length of the @param_values array@param_values: an array of #GValue<!-- -->s holding the arguments on which to invoke the callback of @closure@invocation_hint: a context-dependent invocation hint<!-- ##### FUNCTION g_closure_invalidate ##### --><para>Sets a flag on the closure to indicate that it's calling environment has become invalid, and thus causes any future invocations of g_closure_invoke() on this @closure to be ignored. Also, invalidation notifiers installed on the closure will be called at this point. Note that unless you are holding a reference to the closure yourself, the invalidation notifiers may unref the closure and cause it to be destroyed, so if you need to access the closure after calling g_closure_invalidate(), make sure that you've previously called g_closure_ref().</para><para>Note that g_closure_invalidate() will also be called when the reference countof a closure drops to zero (unless it has already been invalidated before).</para>@closure: GClosure to invalidate<!-- ##### FUNCTION g_closure_add_finalize_notifier ##### --><para>Registers a finalization notifier which will be called when the referencecount of @closure goes down to 0. Multiple finalization notifiers on a single closure are invoked in unspecified order. If a single call to g_closure_unref() results in the closure being both invalidated and finalized, then the invalidate notifiers will be run before the finalize notifiers.</para>@closure: a #GClosure@notify_data: data to pass to @notify_func@notify_func: the callback function to register<!-- ##### FUNCTION g_closure_add_invalidate_notifier ##### --><para>Registers an invalidation notifier which will be called when the @closureis invalidated with g_closure_invalidate(). Invalidation notifiers are invoked before finalization notifiers, in an unspecified order.</para>@closure: a #GClosure@notify_data: data to pass to @notify_func@notify_func: the callback function to register<!-- ##### FUNCTION g_closure_remove_finalize_notifier ##### --><para>Removes a finalization notifier.</para><para>Notice that notifiers are automatically removed after they are run.</para>@closure: a #GClosure@notify_data: data which was passed to g_closure_add_finalize_notifier() when registering @notify_func@notify_func: the callback function to remove<!-- ##### FUNCTION g_closure_remove_invalidate_notifier ##### --><para>Removes an invalidation notifier.</para><para>Notice that notifiers are automatically removed after they are run.</para>@closure: a #GClosure@notify_data: data which was passed to g_closure_add_invalidate_notifier() when registering @notify_func@notify_func: the callback function to remove<!-- ##### FUNCTION g_closure_new_simple ##### --><para>Allocates a struct of the given size and initializes the initial partas a #GClosure. This function is mainly useful when implementing new types of closures.</para><informalexample><programlisting>typedef struct _MyClosure MyClosure;struct _MyClosure { GClosure closure; /* extra data goes here */}; static voidmy_closure_finalize (gpointer notify_data, GClosure *closure){ MyClosure *my_closure = (MyClosure *)closure; /* free extra data here */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -