Convert external links to markdown syntax
[platform/upstream/glib.git] / gobject / gclosure.c
index 4cee41c..fa1c1a9 100644 (file)
@@ -13,9 +13,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
@@ -34,7 +32,7 @@
 #include "genums.h"
 #include "gvalue.h"
 #include "gvaluetypes.h"
-#include  "gtype-private.h"
+#include "gtype-private.h"
 
 
 /**
  * A #GClosure represents a callback supplied by the programmer. It
  * will generally comprise 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
+ * convert the arguments for the invocation from #GValues into
  * a suitable form, perform the callback on the converted arguments,
  * and transform the return value back into a #GValue.
  *
  * In the case of C programs, a closure usually just holds a pointer
  * to a function and maybe a data argument, and the marshaller
- * converts between #GValue<!-- --> and native C types. The GObject
+ * converts between #GValue and native C types. The GObject
  * library provides the #GCClosure type for this purpose. Bindings for
  * other languages need marshallers which convert between #GValue<!--
  * -->s and suitable representations in the runtime of the language in
  *
  * Using closures has a number of important advantages over a simple
  * callback 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 its parameters won't be freed until the invocation finishes.
- * </para></listitem>
- * <listitem><para>
- * g_closure_invalidate() and invalidation notifiers allow callbacks to be
- * automatically removed when the objects they point to go away.
- * </para></listitem>
- * </itemizedlist>
+ * 
+ * - 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.
+ *
+ * - 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 its parameters won't be freed until the invocation finishes.
+ *
+ * - g_closure_invalidate() and invalidation notifiers allow callbacks to be
+ *   automatically removed when the objects they point to go away.
  */
 
 #define        CLOSURE_MAX_REF_COUNT           ((1 << 15) - 1)
@@ -158,12 +151,12 @@ enum {
  * part as a #GClosure. This function is mainly useful when
  * implementing new types of closures.
  *
- * |[
+ * |[<!-- language="C" --> 
  * typedef struct _MyClosure MyClosure;
  * struct _MyClosure
  * {
  *   GClosure closure;
- *   // extra data goes here
+ *   /&ast; extra data goes here &ast;/
  * };
  *
  * static void
@@ -172,7 +165,7 @@ enum {
  * {
  *   MyClosure *my_closure = (MyClosure *)closure;
  *
- *   // free extra data here
+ *   /&ast; free extra data here &ast;/
  * }
  *
  * MyClosure *my_closure_new (gpointer data)
@@ -183,7 +176,7 @@ enum {
  *   closure = g_closure_new_simple (sizeof (MyClosure), data);
  *   my_closure = (MyClosure *) closure;
  *
- *   // initialize extra data here
+ *   /&ast; initialize extra data here &ast;/
  *
  *   g_closure_add_finalize_notifier (closure, notify_data,
  *                                    my_closure_finalize);
@@ -615,20 +608,20 @@ g_closure_unref (GClosure *closure)
  * count. If the closure is not floating, g_closure_sink() does
  * nothing. The reason for the existence of the floating state is to
  * prevent cumbersome code sequences like:
- * |[
+ * |[<!-- language="C" --> 
  * 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
+ * g_closure_unref (closure); /&ast; GObject doesn't really need this &ast;/
  * ]|
  * Because g_source_set_closure() (and similar functions) take ownership of the
  * initial reference count, if it is unowned, we instead can write:
- * |[
+ * |[<!-- language="C" --> 
  * g_source_set_closure (source, g_cclosure_new (cb_func, cb_data));
  * ]|
  *
  * Generally, this function is used together with g_closure_ref(). Ane example
  * of storing a closure for later notification looks like:
- * |[
+ * |[<!-- language="C" --> 
  * static GClosure *notify_closure = NULL;
  * void
  * foo_notify_set_closure (GClosure *closure)
@@ -733,7 +726,7 @@ g_closure_remove_finalize_notifier (GClosure      *closure,
  *                doesn't return a value.
  * @n_param_values: the length of the @param_values array
  * @param_values: (array length=n_param_values): an array of
- *                #GValue<!-- -->s holding the arguments on which to
+ *                #GValues holding the arguments on which to
  *                invoke the callback of @closure
  * @invocation_hint: (allow-none): a context-dependent invocation hint
  *
@@ -1231,7 +1224,7 @@ value_from_ffi_type (GValue *gvalue, gpointer *value)
       g_value_set_boolean (gvalue, (gboolean) *int_val);
       break;
     case G_TYPE_STRING:
-      g_value_set_string (gvalue, *(gchar**)value);
+      g_value_take_string (gvalue, *(gchar**)value);
       break;
     case G_TYPE_CHAR:
       g_value_set_schar (gvalue, (gint8) *int_val);
@@ -1258,7 +1251,7 @@ value_from_ffi_type (GValue *gvalue, gpointer *value)
       g_value_set_uint64 (gvalue, (guint64) *int_val);
       break;
     case G_TYPE_BOXED:
-      g_value_set_boxed (gvalue, *(gpointer*)value);
+      g_value_take_boxed (gvalue, *(gpointer*)value);
       break;
     case G_TYPE_ENUM:
       g_value_set_enum (gvalue, (gint) *int_val);
@@ -1267,10 +1260,13 @@ value_from_ffi_type (GValue *gvalue, gpointer *value)
       g_value_set_flags (gvalue, (guint) *int_val);
       break;
     case G_TYPE_PARAM:
-      g_value_set_param (gvalue, *(gpointer*)value);
+      g_value_take_param (gvalue, *(gpointer*)value);
       break;
     case G_TYPE_OBJECT:
-      g_value_set_object (gvalue, *(gpointer*)value);
+      g_value_take_object (gvalue, *(gpointer*)value);
+      break;
+    case G_TYPE_VARIANT:
+      g_value_take_variant (gvalue, *(gpointer*)value);
       break;
     default:
       g_warning ("value_from_ffi_type: Unsupported fundamental type: %s",
@@ -1364,7 +1360,7 @@ va_to_ffi_type (GType gtype,
  * @return_gvalue: 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
+ * @param_values: An array of #GValues holding the arguments
  *   on which to invoke the callback of closure.
  * @invocation_hint: The invocation hint given as the last argument to
  *   g_closure_invoke().
@@ -1372,8 +1368,8 @@ va_to_ffi_type (GType gtype,
  *   marshaller, see g_closure_set_marshal() and
  *   g_closure_set_meta_marshal()
  *
- * A generic marshaller function implemented via <ulink
- * url="http://sourceware.org/libffi/">libffi</ulink>.
+ * A generic marshaller function implemented via
+ * [libffi](http://sourceware.org/libffi/).
  *
  * Since: 2.30
  */
@@ -1511,7 +1507,7 @@ g_cclosure_marshal_generic_va (GClosure *closure,
       args[n_args-1] = &closure->data;
     }
 
-  va_copy (args_copy, args_list);
+  G_VA_COPY (args_copy, args_list);
 
   /* Box non-primitive arguments */
   for (i = 0; i < n_params; i++)