[Rawstudio-commit] r2990 - branches/rawstudio-ng-color/src

Anders Brander anders at brander.dk
Thu Jan 14 19:27:24 CET 2010


Author: abrander
Date: 2010-01-14 19:27:24 +0100 (Thu, 14 Jan 2010)
New Revision: 2990

Modified:
   branches/rawstudio-ng-color/src/rs-store.c
Log:
Ported RSStore to the new fancy io-abstraction layer.

Modified: branches/rawstudio-ng-color/src/rs-store.c
===================================================================
--- branches/rawstudio-ng-color/src/rs-store.c	2010-01-14 18:11:23 UTC (rev 2989)
+++ branches/rawstudio-ng-color/src/rs-store.c	2010-01-14 18:27:24 UTC (rev 2990)
@@ -33,7 +33,6 @@
 #include "rs-cache.h"
 #include "rs-pixbuf.h"
 #include "eog-pixbuf-cell-renderer.h"
-#include "rs-preload.h"
 #include "rs-photo.h"
 #include "rs-library.h"
 
@@ -86,6 +85,10 @@
 	GtkTreePath *tooltip_last_path;
 };
 
+/* Classes to user for io-system */ 
+#define PRELOAD_CLASS (82764283)
+#define METADATA_CLASS (542344)
+
 /* Define the boiler plate stuff using the predefined macro */
 G_DEFINE_TYPE (RSStore, rs_store, GTK_TYPE_HBOX);
 
@@ -107,9 +110,6 @@
 	GtkTreePath *path;
 } WORKER_JOB;
 
-static GAsyncQueue *loader_queue = NULL;
-static gpointer worker_thread(gpointer data);
-
 /* FIXME: Remember to remove stores from this too! */
 static GList *all_stores = NULL;
 
@@ -152,6 +152,7 @@
 void store_get_type(GtkListStore *store, GtkTreeIter *iter, gint *type);
 void store_get_fullname(GtkListStore *store, GtkTreeIter *iter, gchar **fullname);
 void store_set_members(GtkListStore *store, GtkTreeIter *iter, GList *members);
+void got_metadata(RSMetadata *metadata, gpointer user_data);
 
 /**
  * Class initializer
@@ -192,16 +193,6 @@
 		icon_priority_D = gdk_pixbuf_new_from_file(PACKAGE_DATA_DIR "/pixmaps/" PACKAGE "/overlay_deleted.png", NULL);
 		icon_exported = gdk_pixbuf_new_from_file(PACKAGE_DATA_DIR "/pixmaps/" PACKAGE "/overlay_exported.png", NULL);
 	}
-
-	if (!loader_queue)
-	{
-		gint i = (rs_get_number_of_processor_cores()*3)/2;
-		loader_queue = g_async_queue_new();
-		while(i--)
-		{
-			g_thread_create(worker_thread, NULL, FALSE, NULL);
-		}
-	}
 }
 
 /**
@@ -361,7 +352,7 @@
 	gchar *filename;
 	gtk_tree_model_get(model, iter, FULLNAME_COLUMN, &filename, -1);
 
-	rs_preload(filename);
+	rs_io_idle_prefetch_file(filename, PRELOAD_CLASS);
 }
 
 static void
@@ -374,7 +365,7 @@
 	GtkTreePath *path, *next, *prev;
 	GtkTreeModel *model = gtk_icon_view_get_model (iconview);
 
-	rs_preload_cancel_all();
+	rs_io_idle_cancel_class(PRELOAD_CLASS);
 
 	/* Get a list of selected icons */
 	selected = gtk_icon_view_get_selected_items(iconview);
@@ -1070,7 +1061,8 @@
 	job->exported = exported;
 	job->model = g_object_ref(GTK_TREE_MODEL(store->store));
 	job->path = gtk_tree_model_get_path(GTK_TREE_MODEL(store->store), &iter);
-	g_async_queue_push(loader_queue, job);
+
+	rs_io_idle_read_metadata(job->filename, METADATA_CLASS, got_metadata, job);
 }
 
 static gint
@@ -1132,9 +1124,7 @@
 	GtkTreeIter i;
 
 	/* Empty the loader queue */
-	g_async_queue_lock(loader_queue);
-	while(g_async_queue_try_pop_unlocked(loader_queue));
-	g_async_queue_unlock(loader_queue);
+	rs_io_idle_cancel_class(METADATA_CLASS);
 
 	/* If we got no store, iterate though all */
 	if (!store)
@@ -1212,7 +1202,11 @@
 
 	/* Block the priority count */
 	g_signal_handler_block(store->store, store->counthandler);
+
+	/* While we're loading, we keep the IO lock to ourself. We need to read very basic meta and directory data */
+	rs_io_lock();
 	items = load_directory(store, path, library, load_8bit, load_recursive);
+	rs_io_unlock();
 
 	/* unset model and make sure we have enough columns */
 	for (n=0;n<NUM_VIEWS;n++)
@@ -2392,63 +2386,53 @@
 						-1);
 }
 
-static gpointer
-worker_thread(gpointer data)
+void
+got_metadata(RSMetadata *metadata, gpointer user_data)
 {
-	WORKER_JOB *job;
+	WORKER_JOB *job = user_data;
 	GdkPixbuf *pixbuf, *pixbuf_clean;
 	GtkTreeIter iter;
-	RSMetadata *metadata;
 
-	while((job = g_async_queue_pop(loader_queue)))
-	{
-		metadata = rs_metadata_new_from_file(job->filename);
-		g_assert(RS_IS_METADATA(metadata));
+	pixbuf = rs_metadata_get_thumbnail(metadata);
 
-		pixbuf = rs_metadata_get_thumbnail(metadata);
+	if (pixbuf==NULL)
+		/* We will use this, if no thumbnail can be loaded */
+		pixbuf = gtk_widget_render_icon(GTK_WIDGET(job->store),
+			GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_DIALOG, NULL);
 
-		if (pixbuf==NULL)
-			/* We will use this, if no thumbnail can be loaded */
-			pixbuf = gtk_widget_render_icon(GTK_WIDGET(job->store),
-				GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_DIALOG, NULL);
+	pixbuf_clean = gdk_pixbuf_copy(pixbuf);
 
-		pixbuf_clean = gdk_pixbuf_copy(pixbuf);
+	/* Update thumbnail */
+	thumbnail_update(pixbuf, pixbuf_clean, job->priority, job->exported);
 
-		/* Update thumbnail */
-		thumbnail_update(pixbuf, pixbuf_clean, job->priority, job->exported);
+	g_assert(pixbuf != NULL);
+	g_assert(pixbuf_clean != NULL);
 
-		g_assert(pixbuf != NULL);
-		g_assert(pixbuf_clean != NULL);
+	/* Add the new thumbnail to the store */
+	gdk_threads_enter();
+	if (tree_find_filename(job->model, job->filename, &iter, NULL))
+	{
+		gtk_list_store_set(GTK_LIST_STORE(job->model), &iter,
+			METADATA_COLUMN, metadata,
+			TEXT_COLUMN, job->name,
+			PIXBUF_COLUMN, pixbuf,
+			PIXBUF_CLEAN_COLUMN, pixbuf_clean,
+			-1);
+	}
 
-		/* Add the new thumbnail to the store */
-		gdk_threads_enter();
-		if (tree_find_filename(job->model, job->filename, &iter, NULL))
-		{
-			gtk_list_store_set(GTK_LIST_STORE(job->model), &iter,
-				METADATA_COLUMN, metadata,
-				TEXT_COLUMN, job->name,
-				PIXBUF_COLUMN, pixbuf,
-				PIXBUF_CLEAN_COLUMN, pixbuf_clean,
-				-1);
-		}
+	gdk_threads_leave();
 
-		/* Add to library */
-		rs_library_add_photo_with_metadata(rs_library_get_singleton(), job->filename, metadata);
+	/* Add to library */
+	rs_library_add_photo_with_metadata(rs_library_get_singleton(), job->filename, metadata);
 
-		gdk_threads_leave();
+	/* The GtkListStore should have ref'ed these */
+	g_object_unref(pixbuf);
+	g_object_unref(pixbuf_clean);
 
-		/* The GtkListStore should have ref'ed these */
-		g_object_unref(pixbuf);
-		g_object_unref(pixbuf_clean);
-
-		/* Clean up the job */
-		g_free(job->filename);
-		gtk_tree_path_free(job->path);
-		g_object_unref(job->store);
-		g_object_unref(job->model);
-		g_free(job);
-	}
-
-	/* This is only to stop gcc from complaining, we will never return */
-	return NULL;
+	/* Clean up the job */
+	g_free(job->filename);
+	gtk_tree_path_free(job->path);
+	g_object_unref(job->store);
+	g_object_unref(job->model);
+	g_free(job);
 }




More information about the Rawstudio-commit mailing list