[Xfce4-commits] r25071 - in squeeze/trunk: libsqueeze src

Peter de Ridder peter at xfce.org
Sat Mar 3 14:23:34 CET 2007


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;
 }



More information about the Xfce4-commits mailing list