[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