Author: peter
Date: 2007-03-03 13:23:34 +0000 (Sat, 03 Mar 2007)
New Revision: 25071

Modified:
   squeeze/trunk/libsqueeze/archive-iter.c
   squeeze/trunk/libsqueeze/archive-support-gnu-tar.c
   squeeze/trunk/libsqueeze/archive-support-zip.c
   squeeze/trunk/libsqueeze/libsqueeze-archive.h
   squeeze/trunk/libsqueeze/libsqueeze-view.h
   squeeze/trunk/src/archive_store.c
Log:
archive store and archive iter ref now correctly


Modified: squeeze/trunk/libsqueeze/archive-iter.c
===================================================================
--- squeeze/trunk/libsqueeze/archive-iter.c     2007-03-03 12:11:20 UTC (rev 
25070)
+++ squeeze/trunk/libsqueeze/archive-iter.c     2007-03-03 13:23:34 UTC (rev 
25071)
@@ -115,11 +115,12 @@
 /**************
  * Init stuff *
  **************/
+volatile LSQArchiveIterPool* pool;
 
 void
 lsq_archive_init_iter(LSQArchive *archive)
 {
-       archive->pool = g_new0(LSQArchiveIterPool, 1);
+       pool = archive->pool = g_new0(LSQArchiveIterPool, 1);
        archive->root_entry = g_new0(LSQArchiveEntry, 1);
 }
 
@@ -134,6 +135,20 @@
  * LSQArchiveIterPool stuff *
  ****************************/
 
+#ifdef DEBUG
+void lsq_archive_iter_pool_print()
+{
+       guint i;
+       for(i = 0; i < pool->size; ++i)
+       {
+               if(pool->pool[i]->parent)
+                       printf("%d %d %p %s\t%p %s\n", i, 
pool->pool[i]->ref_count, pool->pool[i]->entry, 
pool->pool[i]->entry?pool->pool[i]->entry->filename:"(no entry)", 
pool->pool[i]->parent->entry, 
pool->pool[i]->parent->entry?pool->pool[i]->parent->entry->filename:"(no 
parent)");
+               else
+                       printf("%d %d %p %s\t(no parent)\n", i, 
pool->pool[i]->ref_count, pool->pool[i]->entry, 
pool->pool[i]->entry?pool->pool[i]->entry->filename:"(no entry)");
+       }
+}
+#endif
+
 inline static void
 lsq_archive_iter_pool_free(LSQArchiveIterPool *pool)
 {
@@ -161,7 +176,7 @@
        while(size)
        {
                pos = size / 2;
-               cmp = entry - pool[off+pos]->entry;
+               cmp = (gint)entry - (gint)pool[off+pos]->entry;
                if(cmp == 0)
                {
                        if(ret_iter)
@@ -255,8 +270,7 @@
        /* iter has been found */
        if(lsq_archive_iter_pool_find_iter(archive->pool, entry, &iter, &pos))
        {
-               lsq_archive_iter_ref(iter);
-               return iter;
+               return lsq_archive_iter_ref(iter);
        }
 
 #ifdef DEBUG
@@ -268,7 +282,7 @@
        iter = g_new(LSQArchiveIter, 1);
        iter->archive = archive;
        iter->entry = entry;
-       iter->parent = parent;
+       iter->parent = parent?lsq_archive_iter_ref(parent):NULL;
        iter->ref_count = 1;
 
        lsq_archive_iter_pool_insert_iter(archive->pool, iter, pos);
@@ -295,11 +309,14 @@
        iter = g_new(LSQArchiveIter, 1);
        iter->archive = archive;
        iter->entry = path->data;
-       iter->parent = lsq_archive_iter_get_for_path(archive, path->next);
+       iter->parent = NULL;
        iter->ref_count = 1;
 
        lsq_archive_iter_pool_insert_iter(archive->pool, iter, pos);
 
+       /* must be done here, otherwise the pool gets currupted */
+       iter->parent = lsq_archive_iter_get_for_path(archive, path->next);
+
        return iter;
 }
 
@@ -327,7 +344,7 @@
        iter = g_new(LSQArchiveIter, 1);
        iter->archive = parent->archive;
        iter->entry = entry;
-       iter->parent = parent;
+       iter->parent = lsq_archive_iter_ref(parent);
        iter->ref_count = 1;
 
        lsq_archive_iter_pool_insert_iter(parent->archive->pool, iter, pos);
@@ -349,11 +366,32 @@
                lsq_archive_entry_free(iter->archive, iter->entry);
 
        /* free the iter */
-       lsq_archive_iter_unref(iter->parent);
+       if(iter->parent)
+               lsq_archive_iter_unref(iter->parent);
        g_free(iter);
 }
 
+#ifdef DEBUG
 void
+_lsq_archive_iter_unref(LSQArchiveIter* iter, const gchar *file, int line)
+{
+       if(!iter || !iter->ref_count)
+               g_debug("unref: %p file: %s line: %d", iter, file, line);
+
+       g_return_if_fail(iter);
+       g_return_if_fail(iter->ref_count);
+       
+       iter->ref_count--;
+
+       /* free the iter if there are no ref's left */
+       if(!iter->ref_count)
+       {
+               lsq_archive_iter_free(iter);
+       }
+}
+#endif
+
+void
 lsq_archive_iter_unref(LSQArchiveIter* iter)
 {
 #ifdef DEBUG
@@ -370,7 +408,23 @@
        }
 }
 
+#ifdef DEBUG
 LSQArchiveIter *
+_lsq_archive_iter_ref(LSQArchiveIter* iter, const gchar *file, int line)
+{
+       if(!iter || !iter->ref_count)
+               g_debug("ref: %p file: %s line: %d", iter, file, line);
+
+       g_return_val_if_fail(iter, NULL);
+       g_return_val_if_fail(iter->ref_count, NULL);
+
+       iter->ref_count++;
+
+       return iter;
+}
+#endif
+
+LSQArchiveIter *
 lsq_archive_iter_ref(LSQArchiveIter* iter)
 {
 #ifdef DEBUG
@@ -484,7 +538,10 @@
 LSQArchiveIter *
 lsq_archive_iter_get_parent(LSQArchiveIter *iter)
 {
-       return lsq_archive_iter_ref(iter->parent);
+#ifdef DEBUG
+       g_return_val_if_fail(iter, NULL);
+#endif
+       return iter->parent?lsq_archive_iter_ref(iter->parent):NULL;
 }
 
 guint

Modified: squeeze/trunk/libsqueeze/archive-support-gnu-tar.c
===================================================================
--- squeeze/trunk/libsqueeze/archive-support-gnu-tar.c  2007-03-03 12:11:20 UTC 
(rev 25070)
+++ squeeze/trunk/libsqueeze/archive-support-gnu-tar.c  2007-03-03 13:23:34 UTC 
(rev 25071)
@@ -638,6 +638,7 @@
        }
 
        lsq_archive_iter_set_propsv(entry, (gconstpointer*)props);
+       lsq_archive_iter_unref(entry);
        g_free(line);
        return TRUE;
 }

Modified: squeeze/trunk/libsqueeze/archive-support-zip.c
===================================================================
--- squeeze/trunk/libsqueeze/archive-support-zip.c      2007-03-03 12:11:20 UTC 
(rev 25070)
+++ squeeze/trunk/libsqueeze/archive-support-zip.c      2007-03-03 13:23:34 UTC 
(rev 25071)
@@ -471,6 +471,7 @@
 
        entry = lsq_archive_add_file(archive, temp_filename);
        lsq_archive_iter_set_propsv(entry, (gconstpointer*)props);
+       lsq_archive_iter_unref(entry);
        g_free(line);
 
        return TRUE;

Modified: squeeze/trunk/libsqueeze/libsqueeze-archive.h
===================================================================
--- squeeze/trunk/libsqueeze/libsqueeze-archive.h       2007-03-03 12:11:20 UTC 
(rev 25070)
+++ squeeze/trunk/libsqueeze/libsqueeze-archive.h       2007-03-03 13:23:34 UTC 
(rev 25071)
@@ -51,14 +51,18 @@
 
 GType lsq_archive_get_type(void);
 
+#ifdef DEBUG
+LSQArchiveIter *_lsq_archive_iter_ref(LSQArchiveIter *iter, const gchar*, int);
+void            _lsq_archive_iter_unref(LSQArchiveIter *iter, const gchar*, 
int);
+/*
+#define lsq_archive_iter_ref(iter) _lsq_archive_iter_ref(iter, __FILE__, 
__LINE__)
+#define lsq_archive_iter_unref(iter) _lsq_archive_iter_unref(iter, __FILE__, 
__LINE__)
+*/
+#endif
+
 LSQArchiveIter *lsq_archive_iter_ref(LSQArchiveIter *iter);
 void            lsq_archive_iter_unref(LSQArchiveIter *iter);
 
-gboolean        lsq_archive_can_stop(const LSQArchive *archive);
-gboolean        lsq_archive_stop(const LSQArchive *archive);
-
-const gchar    *lsq_archive_get_status(const LSQArchive *archive);
-
 G_END_DECLS
 
 #endif /* __LIBSQUEEZE_ARCHIVE_H__ */

Modified: squeeze/trunk/libsqueeze/libsqueeze-view.h
===================================================================
--- squeeze/trunk/libsqueeze/libsqueeze-view.h  2007-03-03 12:11:20 UTC (rev 
25070)
+++ squeeze/trunk/libsqueeze/libsqueeze-view.h  2007-03-03 13:23:34 UTC (rev 
25071)
@@ -42,6 +42,11 @@
 const gchar        *lsq_archive_get_entry_property_name(LSQArchive *archive, 
guint n);
 guint               lsq_archive_n_entry_properties(LSQArchive *archive);
 
+gboolean        lsq_archive_can_stop(const LSQArchive *archive);
+gboolean        lsq_archive_stop(const LSQArchive *archive);
+
+const gchar    *lsq_archive_get_status(const LSQArchive *archive);
+
 G_END_DECLS
 
 #endif /* __LIBSQUEEZE_VIEW_H__ */

Modified: squeeze/trunk/src/archive_store.c
===================================================================
--- squeeze/trunk/src/archive_store.c   2007-03-03 12:11:20 UTC (rev 25070)
+++ squeeze/trunk/src/archive_store.c   2007-03-03 13:23:34 UTC (rev 25071)
@@ -14,9 +14,6 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/* archive iter referencing needs testing */
-/* TODO: archive signaling                */
-
 #include <config.h>
 #include <string.h>
 #include <glib.h>
@@ -95,10 +92,6 @@
 sq_archive_store_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *parent, gint n);
 static gboolean
 sq_archive_store_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *child);
-static void
-sq_archive_store_ref_node (GtkTreeModel *tree_model, GtkTreeIter *iter);
-static void
-sq_archive_store_unref_node (GtkTreeModel *tree_model, GtkTreeIter *iter);
 
 static void
 sq_archive_store_refresh(SQArchiveStore *store);
@@ -207,8 +200,6 @@
        iface->iter_n_children = sq_archive_store_iter_n_children;
        iface->iter_nth_child  = sq_archive_store_iter_nth_child;
        iface->iter_parent     = sq_archive_store_iter_parent;
-       iface->ref_node        = sq_archive_store_ref_node;
-       iface->unref_node      = sq_archive_store_unref_node;
 }
 
 static void
@@ -442,17 +433,12 @@
        {
                /* as long as it is a list depth is 0 other wise current_entry 
should be synced ? */
                if(store->sort_list)
-                       entry = lsq_archive_iter_ref(store->sort_list[index]);
+                       entry = store->sort_list[index];
                else
-                       entry = lsq_archive_iter_nth_child(entry, index);
+                       entry = NULL;
 
                if(!entry)
-               {
-#ifdef DEBUG
-                       g_debug("iter %d not found", index);
-#endif
                        return FALSE;
-               }
        }
 
        iter->stamp = store->stamp;
@@ -547,22 +533,14 @@
                return FALSE;
 
        LSQArchiveIter *entry = iter->user_data;
-       LSQArchiveIter *parent;
        gint pos = GPOINTER_TO_INT(iter->user_data3);
        pos++;
 
        if(store->sort_list)
-               entry = lsq_archive_iter_ref(store->sort_list[pos]);
+               entry = store->sort_list[pos];
        else
-       {
-               parent = lsq_archive_iter_get_parent(entry);
-               entry = lsq_archive_iter_nth_child(parent, pos);
-               lsq_archive_iter_unref(parent);
-       }
+               entry = NULL;
 
-       /* is this correct? */
-       lsq_archive_iter_unref(iter->user_data);
-
        if(!entry)
                return FALSE;
 
@@ -606,9 +584,9 @@
        else
        {
                if(store->sort_list)
-                       entry = lsq_archive_iter_ref(store->sort_list[0]);
+                       entry = store->sort_list[0];
                else
-                       entry = lsq_archive_iter_nth_child(entry, 0);
+                       entry = NULL;
        
                g_return_val_if_fail(entry, FALSE);
        
@@ -652,7 +630,7 @@
        /* only support lists: iter is always NULL */
        g_return_val_if_fail(iter == NULL, FALSE);
 
-       return lsq_archive_iter_n_children(entry) + 
(lsq_archive_iter_has_parent(entry)?1:0);
+       return store->list_size + (lsq_archive_iter_has_parent(entry)?1:0);
 }
 
 static gboolean 
@@ -691,17 +669,12 @@
        else
        {
                if(store->sort_list)
-                       entry = lsq_archive_iter_ref(store->sort_list[n]);
+                       entry = store->sort_list[n];
                else
-                       entry = lsq_archive_iter_nth_child(entry, n);
+                       entry = NULL;
        
                if(!entry)
-               {
-#ifdef DEBUG
-                       g_debug("iter %d not found", n);
-#endif
                        return FALSE;
-               }
        }
 
        iter->stamp = store->stamp;
@@ -717,19 +690,7 @@
        return FALSE;
 }
 
-static void
-sq_archive_store_ref_node (GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
-       lsq_archive_iter_ref(iter->user_data);
-}
 
-static void
-sq_archive_store_unref_node (GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
-       lsq_archive_iter_unref(iter->user_data);
-}
-
-
 static gboolean
 sq_archive_store_get_sort_column_id(GtkTreeSortable *sortable, gint 
*sort_col_id, GtkSortType *order)
 {
@@ -870,29 +831,26 @@
                store->sort_list = NULL;
        }
 
-       if(store->sort_column < 0)
-               return;
-
 #ifdef DEBUG
        g_return_if_fail(store->navigation.present);
        g_return_if_fail(store->navigation.present->data);
 #endif
 
        LSQArchiveIter *pentry = store->navigation.present->data;
-       gint psize = lsq_archive_iter_n_children(pentry);
-       gint i = 0;
+       guint psize = lsq_archive_iter_n_children(pentry);
+       guint i = 0;
 
-       if(psize <= 1)
-               return;
-
        store->sort_list = g_new(LSQArchiveIter*, psize+1);
 
        for(i = 0; i < psize; ++i)
        {
                store->sort_list[i] = lsq_archive_iter_nth_child(pentry, i);
        }
-       sq_archive_quicksort(store, 0, psize-1);
-       sq_archive_insertionsort(store, 0, psize-1);
+       if(psize && store->sort_column > 0)
+       {
+               sq_archive_quicksort(store, 0, psize-1);
+               sq_archive_insertionsort(store, 0, psize-1);
+       }
        store->sort_list[psize] = NULL;
 }
 
@@ -1021,7 +979,7 @@
        GtkTreePath *path_ = NULL;
        GtkTreeIter iter;
 
-       if(store->treeview)
+       /* if(store->treeview) */
        {
                /* we need to add up dir .. */
                if(store->props._show_up_dir && 
lsq_archive_iter_has_parent(entry))
@@ -1043,27 +1001,25 @@
                        new_size++;
                }
 
-               /* notify the tree view that we have rows */
-               for(; i < new_size; ++i)
+               if(store->sort_list)
                {
-                       path_ = gtk_tree_path_new();
-                       gtk_tree_path_append_index(path_, i);
+                       /* notify the tree view that we have rows */
+                       for(; i < new_size; ++i)
+                       {
+                               path_ = gtk_tree_path_new();
+                               gtk_tree_path_append_index(path_, i);
 
-                       iter.stamp = store->stamp;
-                       if(store->sort_list)
-                               iter.user_data = 
lsq_archive_iter_ref(store->sort_list[i]);
-                       else
-                               iter.user_data = 
lsq_archive_iter_nth_child(entry, i);
-                       iter.user_data3 = GINT_TO_POINTER(i);
+                               iter.stamp = store->stamp;
+                               iter.user_data = store->sort_list[i];
+                               iter.user_data3 = GINT_TO_POINTER(i);
 
-                       if(i < prev_size)
-                               
gtk_tree_model_row_changed(GTK_TREE_MODEL(store), path_, &iter);
-                       else
-                               
gtk_tree_model_row_inserted(GTK_TREE_MODEL(store), path_, &iter);
+                               if(i < prev_size)
+                                       
gtk_tree_model_row_changed(GTK_TREE_MODEL(store), path_, &iter);
+                               else
+                                       
gtk_tree_model_row_inserted(GTK_TREE_MODEL(store), path_, &iter);
 
-                       lsq_archive_iter_unref(iter.user_data);
-
-                       gtk_tree_path_free(path_);
+                               gtk_tree_path_free(path_);
+                       }
                }
   
                /* notify tree view we romeved all the remaining rows */
@@ -1120,9 +1076,9 @@
        else
        {
                if(store->sort_list)
-                       entry = lsq_archive_iter_ref(store->sort_list[index]);
+                       entry = store->sort_list[index];
                else
-                       entry = lsq_archive_iter_nth_child(entry, index);
+                       entry = NULL;
 
                g_return_if_fail(entry);
 
@@ -1133,11 +1089,10 @@
                        g_debug("file clicked");
 #endif
                        g_signal_emit(store, 
sq_archive_store_signals[SQ_ARCHIVE_STORE_SIGNAL_FILE_ACTIVATED], 0, 
lsq_archive_iter_get_filename(entry), NULL); 
-                       lsq_archive_iter_unref(entry);
                        return;
                }
 
-               sq_archive_store_append_history(store, entry);
+               sq_archive_store_append_history(store, 
lsq_archive_iter_ref(entry));
        }
 
        sq_archive_store_sort(store);
@@ -1254,23 +1209,21 @@
                /* lets notify the tree view we have new rows */
                store->list_size = lsq_archive_iter_n_children(root_entry);
 
-               for(i = 0; i < store->list_size; ++i)
+               if(store->sort_list)
                {
-                       path_ = gtk_tree_path_new();
-                       gtk_tree_path_append_index(path_, i);
+                       for(i = 0; i < store->list_size; ++i)
+                       {
+                               path_ = gtk_tree_path_new();
+                               gtk_tree_path_append_index(path_, i);
 
-                       iter.stamp = store->stamp;
-                       if(store->sort_list)
-                               iter.user_data = 
lsq_archive_iter_ref(store->sort_list[i]);
-                       else
-                               iter.user_data = 
lsq_archive_iter_nth_child(root_entry, i);
-                       iter.user_data3 = GINT_TO_POINTER(i);
+                               iter.stamp = store->stamp;
+                               iter.user_data = store->sort_list[i];
+                               iter.user_data3 = GINT_TO_POINTER(i);
 
-                       gtk_tree_model_row_inserted(GTK_TREE_MODEL(store), 
path_, &iter);
+                               
gtk_tree_model_row_inserted(GTK_TREE_MODEL(store), path_, &iter);
 
-                       lsq_archive_iter_unref(iter.user_data);
-
-                       gtk_tree_path_free(path_);
+                               gtk_tree_path_free(path_);
+                       }
                }
        }
 
@@ -1319,12 +1272,12 @@
                basename = lsq_archive_iter_get_filename(iter);
                path = g_slist_prepend(path, g_strdup(basename));
                iter = lsq_archive_iter_get_parent(iter);
-               child = iter;
                if(child)
                        lsq_archive_iter_unref(child);
-               else
-                       break;
+               child = iter;
        }
+       if(child)
+               lsq_archive_iter_unref(child);
 
        return path;
 }
@@ -1510,7 +1463,7 @@
                if(store->navigation.present->next)
                        store->navigation.present->next->prev = NULL;
 
-               while((gboolean)(iter = iter->next))
+               while((iter = iter->next))
                        lsq_archive_iter_unref(iter->data);
 
                g_list_free(store->navigation.present->next);
@@ -1523,7 +1476,7 @@
 
        while(g_list_length(store->navigation.history) > 
store->navigation.maxhistory)
        {
-               g_slist_free(g_list_first(store->navigation.history)->data);
+               
lsq_archive_iter_unref(g_list_first(store->navigation.history)->data);
                store->navigation.history = 
g_list_delete_link(store->navigation.history, 
g_list_first(store->navigation.history));
        }
 
@@ -1555,11 +1508,10 @@
                }
                if(child)
                        lsq_archive_iter_unref(child);
-       }
-       if(store->navigation.trailing)
+
                lsq_archive_iter_unref(store->navigation.trailing);
-       lsq_archive_iter_ref(piter);
-       store->navigation.trailing = piter;
+       }
+       store->navigation.trailing = lsq_archive_iter_ref(piter);
 }
 
 GSList *
@@ -1582,12 +1534,12 @@
                basename = lsq_archive_iter_get_filename(iter);
                path = g_slist_prepend(path, &basename);
                iter = lsq_archive_iter_get_parent(iter);
-               child = iter;
                if(child)
                        lsq_archive_iter_unref(child);
-               else
-                       break;
+               child = iter;
        }
+       if(child)
+               lsq_archive_iter_unref(child);
 
        return path;
 }

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to