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