[balsa/gtk3] Ref count LibBalsaMailboxSearchIter



commit 7c3f93e03850941a7c32aef822fc2111464e528c
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Mon Jun 11 18:07:42 2012 -0400

    Ref count LibBalsaMailboxSearchIter
    
    	* libbalsa/mailbox.c (libbalsa_mailbox_run_filters_on_reception),
    	(libbalsa_mailbox_msgno_filt_check),
    	(libbalsa_mailbox_search_iter_new),
    	(libbalsa_mailbox_search_iter_ref),
    	(libbalsa_mailbox_search_iter_unref),
    	(libbalsa_mailbox_messages_change_flags): ref count
    	LibBalsaMailboxSearchIter, and unref it instead of free.
    	* libbalsa/mailbox.h: new member ref_count.
    	* libbalsa/mailbox_local.c (lbm_local_update_view_filter): unref
    	LibBalsaMailboxSearchIter instead of free.
    	* src/balsa-index.c (bndx_destroy),
    	(bndx_select_next_with_flag): ditto.
    	* src/filter-run-callbacks.c (run_filters_on_mailbox): ditto.
    	* src/main-window.c: ditto.

 ChangeLog                  |   19 +++++++++++++++++++
 libbalsa/mailbox.c         |   30 +++++++++++++++++++++++-------
 libbalsa/mailbox.h         |   17 ++++++++++-------
 libbalsa/mailbox_local.c   |    2 +-
 src/balsa-index.c          |    4 ++--
 src/filter-run-callbacks.c |    2 +-
 src/main-window.c          |    2 +-
 7 files changed, 57 insertions(+), 19 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index c684b5f..fce7b28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2012-06-11  Peter Bloomfield
+
+	Ref count LibBalsaMailboxSearchIter
+
+	* libbalsa/mailbox.c (libbalsa_mailbox_run_filters_on_reception),
+	(libbalsa_mailbox_msgno_filt_check),
+	(libbalsa_mailbox_search_iter_new),
+	(libbalsa_mailbox_search_iter_ref),
+	(libbalsa_mailbox_search_iter_unref),
+	(libbalsa_mailbox_messages_change_flags): ref count
+	LibBalsaMailboxSearchIter, and unref it instead of free.
+	* libbalsa/mailbox.h: new member ref_count.
+	* libbalsa/mailbox_local.c (lbm_local_update_view_filter): unref
+	LibBalsaMailboxSearchIter instead of free.
+	* src/balsa-index.c (bndx_destroy),
+	(bndx_select_next_with_flag): ditto.
+	* src/filter-run-callbacks.c (run_filters_on_mailbox): ditto.
+	* src/main-window.c: ditto.
+
 2012-06-10  Peter Bloomfield
 
 	* libbalsa/libbalsa.c (libbalsa_scanner_error_quark),
diff --git a/libbalsa/mailbox.c b/libbalsa/mailbox.c
index 4519693..50e43f5 100644
--- a/libbalsa/mailbox.c
+++ b/libbalsa/mailbox.c
@@ -898,7 +898,7 @@ libbalsa_mailbox_run_filters_on_reception(LibBalsaMailbox * mailbox)
                                                /
                                                ((gdouble) progress_total));
         }
-        libbalsa_mailbox_search_iter_free(search_iter);
+        libbalsa_mailbox_search_iter_unref(search_iter);
 
         libbalsa_mailbox_register_msgnos(mailbox, msgnos);
         libbalsa_filter_mailbox_messages(filter, mailbox, msgnos);
@@ -1780,7 +1780,7 @@ libbalsa_mailbox_msgno_filt_check(LibBalsaMailbox * mailbox, guint seqno,
         info = g_slice_new(LbmMsgnoFiltCheckInfo);
         info->mailbox = g_object_ref(mailbox);
         info->seqno = seqno;
-        info->search_iter = search_iter;
+        info->search_iter = libbalsa_mailbox_search_iter_ref(search_iter);
         info->hold_selected = hold_selected;
         g_idle_add((GSourceFunc) lbm_msgno_filt_check_idle_cb, info);
     } else
@@ -1799,11 +1799,12 @@ libbalsa_mailbox_search_iter_new(LibBalsaCondition * condition)
     if (!condition)
         return NULL;
 
-    iter = g_new(LibBalsaMailboxSearchIter, 1);
+    iter = g_slice_new(LibBalsaMailboxSearchIter);
     iter->mailbox = NULL;
     iter->stamp = 0;
     iter->condition = libbalsa_condition_ref(condition);
     iter->user_data = NULL;
+    iter->ref_count = 1;
 
     return iter;
 }
@@ -1817,12 +1818,27 @@ libbalsa_mailbox_search_iter_view(LibBalsaMailbox * mailbox)
     return libbalsa_mailbox_search_iter_new(mailbox->view_filter);
 }
 
+/* Increment reference count of a LibBalsaMailboxSearchIter, if it is
+ * valid */
+LibBalsaMailboxSearchIter *
+libbalsa_mailbox_search_iter_ref(LibBalsaMailboxSearchIter * search_iter)
+{
+    g_return_val_if_fail(search_iter != NULL, NULL);
+    g_return_val_if_fail(search_iter->ref_count > 0, NULL);
+
+    ++search_iter->ref_count;
+
+    return search_iter;
+}
+
+/* Decrement reference count of a LibBalsaMailboxSearchIter, if it is
+ * non-NULL and validi, and free it if it goes to zero */
 void
-libbalsa_mailbox_search_iter_free(LibBalsaMailboxSearchIter * search_iter)
+libbalsa_mailbox_search_iter_unref(LibBalsaMailboxSearchIter * search_iter)
 {
     LibBalsaMailbox *mailbox;
 
-    if (!search_iter)
+    if (!search_iter || --search_iter->ref_count > 0)
         return;
 
     mailbox = search_iter->mailbox;
@@ -1830,7 +1846,7 @@ libbalsa_mailbox_search_iter_free(LibBalsaMailboxSearchIter * search_iter)
         LIBBALSA_MAILBOX_GET_CLASS(mailbox)->search_iter_free(search_iter);
 
     libbalsa_condition_unref(search_iter->condition);
-    g_free(search_iter);
+    g_slice_free(LibBalsaMailboxSearchIter, search_iter);
 }
 
 /* GNode iterators; they return the root node when they run out of nodes,
@@ -2224,7 +2240,7 @@ libbalsa_mailbox_messages_change_flags(LibBalsaMailbox * mailbox,
             libbalsa_mailbox_msgno_filt_check(mailbox, msgno, iter_view,
                                               TRUE);
         }
-        libbalsa_mailbox_search_iter_free(iter_view);
+        libbalsa_mailbox_search_iter_unref(iter_view);
     }
 
     if (real_flag)
diff --git a/libbalsa/mailbox.h b/libbalsa/mailbox.h
index 43f9230..109a40a 100644
--- a/libbalsa/mailbox.h
+++ b/libbalsa/mailbox.h
@@ -264,9 +264,10 @@ struct _LibBalsaMailbox {
 
 /* Search iter */
 struct _LibBalsaMailboxSearchIter {
-    LibBalsaMailbox *mailbox;
+    gint ref_count;
     gint stamp;
-    LibBalsaCondition *condition;	
+    LibBalsaMailbox *mailbox;
+    LibBalsaCondition *condition;
     gpointer user_data;		/* private backend info */
 };
 
@@ -443,17 +444,19 @@ gboolean libbalsa_mailbox_message_match(LibBalsaMailbox  *mailbox,
 					LibBalsaMailboxSearchIter *search_iter);
 
 /* Search iter */
-LibBalsaMailboxSearchIter *libbalsa_mailbox_search_iter_new(LibBalsaCondition
-							    * condition);
-LibBalsaMailboxSearchIter *libbalsa_mailbox_search_iter_view(LibBalsaMailbox
-							     * mailbox);
+LibBalsaMailboxSearchIter
+    *libbalsa_mailbox_search_iter_new(LibBalsaCondition * condition);
+LibBalsaMailboxSearchIter
+    *libbalsa_mailbox_search_iter_view(LibBalsaMailbox * mailbox);
+LibBalsaMailboxSearchIter
+    *libbalsa_mailbox_search_iter_ref(LibBalsaMailboxSearchIter * iter);
+void libbalsa_mailbox_search_iter_unref(LibBalsaMailboxSearchIter * iter);
 gboolean libbalsa_mailbox_search_iter_step(LibBalsaMailbox * mailbox,
 					   LibBalsaMailboxSearchIter 
 					   * search_iter,
 					   GtkTreeIter * iter,
 					   gboolean forward,
 					   guint stop_msgno);
-void libbalsa_mailbox_search_iter_free(LibBalsaMailboxSearchIter * iter);
 
 /* Default filtering function (on reception)
    It is ONLY FOR INTERNAL USE
diff --git a/libbalsa/mailbox_local.c b/libbalsa/mailbox_local.c
index 62733e1..8eccfa6 100644
--- a/libbalsa/mailbox_local.c
+++ b/libbalsa/mailbox_local.c
@@ -1208,7 +1208,7 @@ lbm_local_update_view_filter(LibBalsaMailbox * mailbox,
                                        ((gdouble) total));
     }
     libbalsa_progress_set_text(&progress, NULL, 0);
-    libbalsa_mailbox_search_iter_free(iter_view);
+    libbalsa_mailbox_search_iter_unref(iter_view);
 
     /* If this is not a flags-only filter, the new mailbox tree is
      * temporary, so we don't want to save it. */
diff --git a/src/balsa-index.c b/src/balsa-index.c
index 40bdb6f..18ed789 100644
--- a/src/balsa-index.c
+++ b/src/balsa-index.c
@@ -239,7 +239,7 @@ bndx_destroy(GObject * obj)
     }
 
     if (index->search_iter) {
-        libbalsa_mailbox_search_iter_free(index->search_iter);
+        libbalsa_mailbox_search_iter_unref(index->search_iter);
         index->search_iter = NULL;
     }
 
@@ -1398,7 +1398,7 @@ bndx_select_next_with_flag(BalsaIndex * index, LibBalsaMessageFlag flag)
                                          BNDX_SEARCH_START_ANY,
                                          BNDX_SEARCH_WRAP_YES);
 
-    libbalsa_mailbox_search_iter_free(search_iter);
+    libbalsa_mailbox_search_iter_unref(search_iter);
 
     return retval;
 }
diff --git a/src/filter-run-callbacks.c b/src/filter-run-callbacks.c
index a69cd58..fca6266 100644
--- a/src/filter-run-callbacks.c
+++ b/src/filter-run-callbacks.c
@@ -121,7 +121,7 @@ run_filters_on_mailbox(GSList * filters, LibBalsaMailbox * mbox)
 	     msgno++)
 	    if (libbalsa_mailbox_message_match(mbox, msgno, search_iter))
 		g_array_append_val(messages, msgno);
-	libbalsa_mailbox_search_iter_free(search_iter);
+	libbalsa_mailbox_search_iter_unref(search_iter);
 
 	libbalsa_mailbox_register_msgnos(mbox, messages);
 	sent_to_trash +=
diff --git a/src/main-window.c b/src/main-window.c
index 5074bc8..fc0b1fe 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -4452,7 +4452,7 @@ bw_find_real(BalsaWindow * window, BalsaIndex * bindex, gboolean again)
 	    return;
 	cnd->type = CONDITION_STRING;
 
-	libbalsa_mailbox_search_iter_free(search_iter);
+	libbalsa_mailbox_search_iter_unref(search_iter);
 	search_iter = NULL;
 
         if(ok == FIND_RESPONSE_FILTER) {



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