[tracker] TrackerDecoratorInfo: register as boxed type



commit d8f5e8553f99e13dec2d13182fc10491b7176c11
Author: Xavier Claessens <xavier claessens collabora co uk>
Date:   Thu Jan 30 14:20:15 2014 -0500

    TrackerDecoratorInfo: register as boxed type
    
    Introspection needs a boxed type to work. Also this fix ref-counting issue,
    tracker_decorator_next_finish() returns the ref but caller couldn't unref it
    because the unref function wasn't public. The other solution would be to make
    _next_finish() transfer none and remove the destroy func in
    g_task_return_pointer(), but that's unusual for finish functions.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=719802

 .../libtracker-miner/libtracker-miner-sections.txt |    3 +++
 src/libtracker-miner/tracker-decorator.c           |   15 +++++++++++----
 src/libtracker-miner/tracker-decorator.h           |    5 +++++
 src/tracker-extract/tracker-extract-decorator.c    |    2 ++
 4 files changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/docs/reference/libtracker-miner/libtracker-miner-sections.txt 
b/docs/reference/libtracker-miner/libtracker-miner-sections.txt
index a20c295..2dd3b89 100644
--- a/docs/reference/libtracker-miner/libtracker-miner-sections.txt
+++ b/docs/reference/libtracker-miner/libtracker-miner-sections.txt
@@ -279,6 +279,9 @@ tracker_decorator_get_class_names
 tracker_decorator_get_data_source
 tracker_decorator_get_n_items
 tracker_decorator_get_type
+tracker_decorator_info_get_type
+tracker_decorator_info_ref
+tracker_decorator_info_unref
 tracker_decorator_info_get_mimetype
 tracker_decorator_info_get_sparql
 tracker_decorator_info_get_task
diff --git a/src/libtracker-miner/tracker-decorator.c b/src/libtracker-miner/tracker-decorator.c
index b0c6934..7401e8a 100644
--- a/src/libtracker-miner/tracker-decorator.c
+++ b/src/libtracker-miner/tracker-decorator.c
@@ -119,14 +119,14 @@ tracker_decorator_info_new (TrackerSparqlCursor *cursor)
        return info;
 }
 
-static TrackerDecoratorInfo *
+TrackerDecoratorInfo *
 tracker_decorator_info_ref (TrackerDecoratorInfo *info)
 {
        g_atomic_int_inc (&info->ref_count);
        return info;
 }
 
-static void
+void
 tracker_decorator_info_unref (TrackerDecoratorInfo *info)
 {
        if (!g_atomic_int_dec_and_test (&info->ref_count))
@@ -140,6 +140,11 @@ tracker_decorator_info_unref (TrackerDecoratorInfo *info)
        g_slice_free (TrackerDecoratorInfo, info);
 }
 
+G_DEFINE_BOXED_TYPE (TrackerDecoratorInfo,
+                     tracker_decorator_info,
+                     tracker_decorator_info_ref,
+                     tracker_decorator_info_unref)
+
 static void
 decorator_update_state (TrackerDecorator *decorator,
                         const gchar      *message,
@@ -1115,7 +1120,8 @@ complete_tasks_or_query (TrackerDecorator *decorator)
                if (!node->info->task) {
                        task = g_queue_pop_head (&priv->next_elem_queue);
                        element_ensure_task (node, decorator);
-                       g_task_return_pointer (task, node->info,
+                       g_task_return_pointer (task,
+                                              tracker_decorator_info_ref (node->info),
                                               (GDestroyNotify) tracker_decorator_info_unref);
                        g_object_unref (task);
 
@@ -1194,7 +1200,8 @@ tracker_decorator_next (TrackerDecorator    *decorator,
  * tracker_decorator_next() to return the result of the task be it an
  * error or not.
  *
- * Returns: (transfer full): (boxed): a #TrackerDecoratorInfo on success or #NULL on error.
+ * Returns: (transfer full) (boxed): a #TrackerDecoratorInfo on success or
+ *  #NULL on error. Free with tracker_decorator_info_unref().
  *
  * Since: 0.18
  **/
diff --git a/src/libtracker-miner/tracker-decorator.h b/src/libtracker-miner/tracker-decorator.h
index b32d0bd..5317555 100644
--- a/src/libtracker-miner/tracker-decorator.h
+++ b/src/libtracker-miner/tracker-decorator.h
@@ -88,6 +88,11 @@ TrackerDecoratorInfo *
                                                    GAsyncResult         *result,
                                                    GError              **error);
 
+GType         tracker_decorator_info_get_type     (void) G_GNUC_CONST;
+
+TrackerDecoratorInfo *
+              tracker_decorator_info_ref          (TrackerDecoratorInfo *info);
+void          tracker_decorator_info_unref        (TrackerDecoratorInfo *info);
 const gchar * tracker_decorator_info_get_urn      (TrackerDecoratorInfo *info);
 const gchar * tracker_decorator_info_get_url      (TrackerDecoratorInfo *info);
 const gchar * tracker_decorator_info_get_mimetype (TrackerDecoratorInfo *info);
diff --git a/src/tracker-extract/tracker-extract-decorator.c b/src/tracker-extract/tracker-extract-decorator.c
index 195535b..ce3fdb0 100644
--- a/src/tracker-extract/tracker-extract-decorator.c
+++ b/src/tracker-extract/tracker-extract-decorator.c
@@ -180,6 +180,8 @@ get_metadata_cb (TrackerExtract *extract,
        }
 
        decorator_get_next_file (data->decorator);
+
+       tracker_decorator_info_unref (data->decorator_info);
        g_free (data);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]