[Goodies-commits] r6416 - ristretto/branches/ristretto-gio/src
Stephan Arts
stephan at xfce.org
Fri Jan 9 01:01:20 CET 2009
Author: stephan
Date: 2009-01-09 00:01:19 +0000 (Fri, 09 Jan 2009)
New Revision: 6416
Modified:
ristretto/branches/ristretto-gio/src/image.c
ristretto/branches/ristretto-gio/src/main.c
ristretto/branches/ristretto-gio/src/main_window.c
ristretto/branches/ristretto-gio/src/navigator.c
ristretto/branches/ristretto-gio/src/picture_viewer.c
Log:
Improve threading
Modified: ristretto/branches/ristretto-gio/src/image.c
===================================================================
--- ristretto/branches/ristretto-gio/src/image.c 2009-01-08 16:40:35 UTC (rev 6415)
+++ ristretto/branches/ristretto-gio/src/image.c 2009-01-09 00:01:19 UTC (rev 6416)
@@ -102,6 +102,8 @@
gint animation_timeout_id;
GList *transformations;
+
+ GThread *load_thread;
struct
{
@@ -197,6 +199,7 @@
image->priv->transformations;
}
+ g_mutex_free (image->priv->mutex.loader);
g_mutex_free (image->priv->mutex.exif);
g_mutex_free (image->priv->mutex.thumbnail);
g_mutex_free (image->priv->mutex.pixbuf);
@@ -278,6 +281,59 @@
}
+static gpointer
+cb_rstto_image_load (RsttoImage *image)
+{
+ GFileInputStream *input_stream = NULL;
+ gssize read_bytes = 0;
+ guchar buffer[1024];
+
+ input_stream = g_file_read (image->priv->file, FALSE, NULL);
+
+ while (1)
+ {
+
+ g_mutex_lock (image->priv->mutex.loader);
+ if (image->priv->loader == NULL)
+ {
+ g_mutex_unlock (image->priv->mutex.loader);
+ break;
+ }
+
+ read_bytes = g_input_stream_read (G_INPUT_STREAM (input_stream), &buffer, 1024, NULL, NULL);
+
+ if (read_bytes > 0)
+ {
+ if(gdk_pixbuf_loader_write(image->priv->loader, (const guchar *)buffer, read_bytes, NULL) == FALSE)
+ {
+ /* PARSE ERROR */
+ g_mutex_unlock (image->priv->mutex.loader);
+ break;
+ }
+ }
+ else
+ if (read_bytes == 0)
+ {
+ /* OK */
+ gdk_pixbuf_loader_close (image->priv->loader, NULL);
+ image->priv->loader = NULL;
+ g_mutex_unlock (image->priv->mutex.loader);
+ break;
+ }
+ else
+ {
+ /* I/O ERROR */
+ gdk_pixbuf_loader_close (image->priv->loader, NULL);
+ image->priv->loader = NULL;
+ g_mutex_unlock (image->priv->mutex.loader);
+ break;
+ }
+ g_mutex_unlock (image->priv->mutex.loader);
+ }
+}
+
+
+
/**
* rstto_image_load:
* @image : The image to load from disk.
@@ -299,10 +355,9 @@
rstto_image_load (RsttoImage *image, gboolean empty_cache, GError **error)
{
g_return_val_if_fail (image != NULL, FALSE);
+
RsttoImageCache *cache = rstto_image_cache_new ();
- gchar *file_path = g_file_get_path (image->priv->file);
-
/* Check if a GIOChannel is present, if so... the load is already in progress */
/* The image needs to be loaded if:
* a) The image is already loaded but there is
@@ -327,12 +382,14 @@
/*g_signal_connect(image->priv->loader, "area-updated", G_CALLBACK(cb_rstto_image_area_updated), image);*/
g_signal_connect(image->priv->loader, "closed", G_CALLBACK(cb_rstto_image_closed), image);
- g_file_read_async (image->priv->file, G_PRIORITY_DEFAULT, NULL, (GAsyncReadyCallback)cb_rstto_image_read_file_ready, image);
+ rstto_image_cache_push_image (cache, image);
+
+ image->priv->load_thread = g_thread_create ((GThreadFunc)cb_rstto_image_load, image, TRUE, NULL);
}
-
- rstto_image_cache_push_image (cache, image);
-
- g_free (file_path);
+ else
+ {
+ rstto_image_cache_push_image (cache, image);
+ }
}
@@ -346,19 +403,23 @@
rstto_image_unload (RsttoImage *image)
{
g_return_if_fail (image != NULL);
- if (image->priv->pixbuf)
- {
- g_object_unref (image->priv->pixbuf);
- image->priv->pixbuf = NULL;
- }
g_mutex_lock (image->priv->mutex.loader);
if (image->priv->loader)
{
- g_object_unref (image->priv->loader);
+ gdk_pixbuf_loader_close (image->priv->loader, NULL);
image->priv->loader = NULL;
}
g_mutex_unlock (image->priv->mutex.loader);
+
+ g_thread_join (image->priv->load_thread);
+
+ if (image->priv->pixbuf)
+ {
+ g_object_unref (image->priv->pixbuf);
+ image->priv->pixbuf = NULL;
+ }
+
}
@@ -560,6 +621,8 @@
transform_iter = g_list_previous (transform_iter);
}
+
+
g_signal_emit(G_OBJECT(image), rstto_image_signals[RSTTO_IMAGE_SIGNAL_UPDATED], 0, image, NULL);
}
}
@@ -617,63 +680,3 @@
}
return TRUE;
}
-
-/**
- * cb_rstto_image_read_file_ready:
- * @source_object:
- * @result:
- * @user_data:
- */
-static void
-cb_rstto_image_read_file_ready (GObject *source_object, GAsyncResult *result, gpointer user_data)
-{
- RsttoImage *image = RSTTO_IMAGE (user_data);
- gssize read_bytes = 0;
- guchar buffer[1024];
-
- GFileInputStream *input_stream = g_file_read_finish (G_FILE (source_object), result, NULL);
-
- /** TODO: put this in a thread */
-
- while (1)
- {
-
- g_mutex_lock (image->priv->mutex.loader);
- if (image->priv->loader == NULL)
- {
- g_mutex_unlock (image->priv->mutex.loader);
- break;
- }
-
- read_bytes = g_input_stream_read (G_INPUT_STREAM (input_stream), &buffer, 1024, NULL, NULL);
-
- if (read_bytes > 0)
- {
- if(gdk_pixbuf_loader_write(image->priv->loader, (const guchar *)buffer, read_bytes, NULL) == FALSE)
- {
- /* PARSE ERROR */
- g_mutex_unlock (image->priv->mutex.loader);
- break;
- }
- }
- else
- if (read_bytes == 0)
- {
- /* OK */
- gdk_pixbuf_loader_close (image->priv->loader, NULL);
- image->priv->loader = NULL;
- g_signal_emit (G_OBJECT(image), rstto_image_signals[RSTTO_IMAGE_SIGNAL_UPDATED], 0, image, NULL);
- g_mutex_unlock (image->priv->mutex.loader);
- break;
- }
- else
- {
- /* I/O ERROR */
- gdk_pixbuf_loader_close (image->priv->loader, NULL);
- image->priv->loader = NULL;
- g_mutex_unlock (image->priv->mutex.loader);
- break;
- }
- g_mutex_unlock (image->priv->mutex.loader);
- }
-}
Modified: ristretto/branches/ristretto-gio/src/main.c
===================================================================
--- ristretto/branches/ristretto-gio/src/main.c 2009-01-08 16:40:35 UTC (rev 6415)
+++ ristretto/branches/ristretto-gio/src/main.c 2009-01-09 00:01:19 UTC (rev 6416)
@@ -77,7 +77,11 @@
textdomain (GETTEXT_PACKAGE);
#endif
- if (!g_thread_supported ()) g_thread_init (NULL);
+ if (!g_thread_supported ())
+ {
+ g_debug ("Threading supported, initializing...");
+ g_thread_init (NULL);
+ }
if(!gtk_init_with_args(&argc, &argv, _(""), entries, PACKAGE, &cli_error))
Modified: ristretto/branches/ristretto-gio/src/main_window.c
===================================================================
--- ristretto/branches/ristretto-gio/src/main_window.c 2009-01-08 16:40:35 UTC (rev 6415)
+++ ristretto/branches/ristretto-gio/src/main_window.c 2009-01-09 00:01:19 UTC (rev 6416)
@@ -295,9 +295,24 @@
static void
cb_rstto_main_window_navigator_new_image (RsttoNavigator *navigator, RsttoImage *image, RsttoMainWindow *window)
{
- rstto_image_load (image, FALSE, 0);
- rstto_picture_viewer_set_image (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), image);
+ gchar *path, *basename, *title;
+ GFile *file = NULL;
+ RsttoImage *cur_image;
+
window->priv->iter = rstto_navigator_get_iter (window->priv->props.navigator);
+ cur_image = rstto_navigator_iter_get_image (window->priv->iter);
+ file = rstto_image_get_file (cur_image);
+
+ path = g_file_get_path (file);
+ basename = g_path_get_basename (path);
+
+ title = g_strdup_printf ("%s - %s [%d/%d]", RISTRETTO_APP_TITLE, basename, -1, -1);
+
+ gtk_window_set_title (GTK_WINDOW (window), title);
+ //rstto_picture_viewer_set_image (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), image);
+
+ g_free (basename);
+ g_free (path);
}
/**
@@ -436,7 +451,6 @@
image = rstto_navigator_iter_get_image (window->priv->iter);
file = rstto_image_get_file (image);
- rstto_image_load (image, TRUE, 0);
rstto_picture_viewer_set_image (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), image);
path = g_file_get_path (file);
@@ -470,7 +484,6 @@
image = rstto_navigator_iter_get_image (window->priv->iter);
file = rstto_image_get_file (image);
- rstto_image_load (image, TRUE, 0);
rstto_picture_viewer_set_image (RSTTO_PICTURE_VIEWER (window->priv->picture_viewer), image);
path = g_file_get_path (file);
Modified: ristretto/branches/ristretto-gio/src/navigator.c
===================================================================
--- ristretto/branches/ristretto-gio/src/navigator.c 2009-01-08 16:40:35 UTC (rev 6415)
+++ ristretto/branches/ristretto-gio/src/navigator.c 2009-01-09 00:01:19 UTC (rev 6416)
@@ -35,6 +35,8 @@
static void
rstto_navigator_dispose(GObject *object);
+static GStaticMutex rstto_navigator_image_mutex = G_STATIC_MUTEX_INIT;
+
static GObjectClass *parent_class = NULL;
enum
@@ -132,9 +134,9 @@
{
RsttoImage *image = rstto_image_new (file);
- g_mutex_lock (navigator->priv->images_mutex);
+ g_static_mutex_lock (&rstto_navigator_image_mutex);
navigator->priv->images = g_list_prepend (navigator->priv->images, image);
- g_mutex_unlock (navigator->priv->images_mutex);
+ g_static_mutex_unlock (&rstto_navigator_image_mutex);
g_signal_emit (G_OBJECT (navigator), rstto_navigator_signals[RSTTO_NAVIGATOR_SIGNAL_NEW_IMAGE], 0, image, NULL);
}
@@ -143,9 +145,10 @@
rstto_navigator_get_iter (RsttoNavigator *navigator)
{
RsttoNavigatorIter *iter = g_new0 (RsttoNavigatorIter, 1);
- g_mutex_lock (navigator->priv->images_mutex);
+
+ g_static_mutex_lock (&rstto_navigator_image_mutex);
iter->data = navigator->priv->images;
- g_mutex_unlock (navigator->priv->images_mutex);
+ g_static_mutex_unlock (&rstto_navigator_image_mutex);
return iter;
}
@@ -153,13 +156,31 @@
gboolean
rstto_navigator_iter_next (RsttoNavigatorIter *iter)
{
- iter->data = g_list_next (iter->data);
+ g_static_mutex_lock (&rstto_navigator_image_mutex);
+ if (g_list_next (iter->data))
+ {
+ iter->data = g_list_next (iter->data);
+ }
+ else
+ {
+ iter->data = g_list_first (iter->data);
+ }
+ g_static_mutex_unlock (&rstto_navigator_image_mutex);
}
gboolean
rstto_navigator_iter_previous (RsttoNavigatorIter *iter)
{
- iter->data = g_list_previous (iter->data);
+ g_static_mutex_lock (&rstto_navigator_image_mutex);
+ if (g_list_previous (iter->data))
+ {
+ iter->data = g_list_previous (iter->data);
+ }
+ else
+ {
+ iter->data = g_list_last (iter->data);
+ }
+ g_static_mutex_unlock (&rstto_navigator_image_mutex);
}
RsttoImage *
Modified: ristretto/branches/ristretto-gio/src/picture_viewer.c
===================================================================
--- ristretto/branches/ristretto-gio/src/picture_viewer.c 2009-01-08 16:40:35 UTC (rev 6415)
+++ ristretto/branches/ristretto-gio/src/picture_viewer.c 2009-01-09 00:01:19 UTC (rev 6416)
@@ -994,6 +994,7 @@
{
rstto_picture_viewer_refresh(viewer);
rstto_picture_viewer_paint(GTK_WIDGET(viewer));
+
g_source_remove(viewer->priv->refresh.idle_id);
viewer->priv->refresh.idle_id = -1;
return FALSE;
@@ -1248,6 +1249,9 @@
void
rstto_picture_viewer_set_image (RsttoPictureViewer *viewer, RsttoImage *image)
{
+ g_return_if_fail (image != NULL);
+ g_return_if_fail (RSTTO_IS_IMAGE (image));
+
if (viewer->priv->image)
{
g_signal_handlers_disconnect_by_func(viewer->priv->image, cb_rstto_picture_viewer_image_updated, viewer);
@@ -1258,6 +1262,7 @@
if (viewer->priv->image)
{
+ rstto_image_load (viewer->priv->image, TRUE, NULL);
g_object_ref (viewer->priv->image);
g_signal_connect (G_OBJECT (viewer->priv->image), "updated", G_CALLBACK (cb_rstto_picture_viewer_image_updated), viewer);
More information about the Goodies-commits
mailing list