[gegl] buffer: always rely on having GIO



commit 29d3df614bb58b67702d1730e7cd4b01d2a57120
Author: �yvind Kolås <pippin gimp org>
Date:   Wed Apr 27 18:12:08 2011 +0100

    buffer: always rely on having GIO
    
    Use GIO only for monitoring, but plain read/write calls for regular operation.
    The regular read/write code will be easier to make into a mmaped region. Also
    removed unneeded seek calls (a lot of calls are avoided, but these might be
    short-circuited on the system level anyways.)

 configure.ac                         |   14 --
 gegl/buffer/Makefile.am              |    8 +-
 gegl/buffer/gegl-buffer-access.c     |    2 -
 gegl/buffer/gegl-buffer-index.h      |   11 +-
 gegl/buffer/gegl-buffer-load.c       |   85 ----------
 gegl/buffer/gegl-buffer-save.c       |   33 ----
 gegl/buffer/gegl-buffer.c            |    2 -
 gegl/buffer/gegl-tile-backend-file.c |  300 +++++++++-------------------------
 gegl/buffer/gegl-tile-storage.c      |    2 -
 gegl/gegl-init.c                     |    4 -
 10 files changed, 80 insertions(+), 381 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 9f5d9e4..824e7e0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -424,19 +424,6 @@ PKG_CHECK_MODULES(DEP,
         *** Errors follow:
             $DEP_PKG_ERRORS]))
 
-AC_ARG_WITH(gio, [  --without-gio           build without gio support])
-
-have_gio="no"
-if test "x$with_gio" != "xno"; then
-PKG_CHECK_MODULES(GIO, gio-2.0, 
-	have_gio="yes"
-	AC_DEFINE(HAVE_GIO, 1, [Define to 1 to compile with gio support.])
-	GLIB_PACKAGES="$GLIB_PACKAGES gio-2.0",
-	have_gio="no (gio not found)")
-fi
-
-AM_CONDITIONAL(HAVE_GIO, test "x$have_gio" = "xyes")
-
 # Rerun PKG_CONFIG to add gthread-2.0 cflags and libs
 DEP_CFLAGS=`$PKG_CONFIG --cflags $GLIB_PACKAGES gthread-2.0`
 DEP_LIBS=`$PKG_CONFIG --libs $GLIB_PACKAGES gthread-2.0`
@@ -1138,7 +1125,6 @@ Optional features:
 Optional dependencies:
   asciidoc:        $have_asciidoc
   enscript:        $have_enscript
-  GIO:             $have_gio
   GTK+:            $have_gtk
   Ruby:            $have_ruby
   Lua:             $have_lua
diff --git a/gegl/buffer/Makefile.am b/gegl/buffer/Makefile.am
index 9fe52ba..5419d99 100644
--- a/gegl/buffer/Makefile.am
+++ b/gegl/buffer/Makefile.am
@@ -11,14 +11,8 @@ AM_CFLAGS = $(DEP_CFLAGS) $(BABL_CFLAGS)
 
 noinst_LTLIBRARIES = libbuffer.la
 
-if HAVE_GIO
-GIO_SUPPORT_SOURCES=\
-    gegl-tile-backend-tiledir.c	\
-    $(null__)
-endif
-
 libbuffer_la_SOURCES = \
-    $(GIO_SUPPORT_SOURCES)      \
+    gegl-tile-backend-tiledir.c	\
     gegl-buffer.c		\
     gegl-buffer-access.c	\
     gegl-buffer-share.c		\
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index 9ba0be3..9440ee4 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -22,9 +22,7 @@
 
 #include <glib-object.h>
 #include <glib/gprintf.h>
-#if HAVE_GIO
 #include <gio/gio.h>
-#endif
 
 #include "gegl.h"
 #include "gegl-types-internal.h"
diff --git a/gegl/buffer/gegl-buffer-index.h b/gegl/buffer/gegl-buffer-index.h
index 01c5d12..e8475f7 100644
--- a/gegl/buffer/gegl-buffer-index.h
+++ b/gegl/buffer/gegl-buffer-index.h
@@ -78,7 +78,9 @@ typedef struct {
   guint32  flags;  /* flags (can be used to handle different block types
                     * differently
                     */
-  guint64  next;   /*next block element in file */
+  guint64  next;   /*next block element in file, this is the offset in the
+                    *file that the next block in the chain resides at
+                    */
 } GeglBufferBlock;
 
 /* The header is followed by entries describing tiles stored in the swap,
@@ -122,17 +124,10 @@ void gegl_buffer_header_init (GeglBufferHeader *header,
 
 void gegl_tile_entry_destroy (GeglBufferTile *entry);
 
-#if HAVE_GIO
-GeglBufferItem *gegl_buffer_read_header(GInputStream *i,
-                                        goffset      *offset);
-GList          *gegl_buffer_read_index (GInputStream *i,
-                                        goffset      *offset);
-#else
 GeglBufferItem *gegl_buffer_read_header(int i,
                                         goffset      *offset);
 GList          *gegl_buffer_read_index (int i,
                                         goffset      *offset);
-#endif
 
 #define struct_check_padding(type, size) \
   if (sizeof (type) != size) \
diff --git a/gegl/buffer/gegl-buffer-load.c b/gegl/buffer/gegl-buffer-load.c
index 6916ee2..8a7300b 100644
--- a/gegl/buffer/gegl-buffer-load.c
+++ b/gegl/buffer/gegl-buffer-load.c
@@ -21,14 +21,10 @@
 #include <string.h>
 #include <errno.h>
 
-#if HAVE_GIO
-#include <gio/gio.h>
-#else
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
-#endif
 #include <glib-object.h>
 
 #include "gegl.h"
@@ -57,12 +53,7 @@ typedef struct
   GeglBufferHeader header;
   GList           *tiles;
   gchar           *path;
-#if HAVE_GIO
-  GFile           *file;
-  GInputStream    *i;
-#else
   int              i;
-#endif
   gint             tile_size;
   Babl            *format;
   goffset          offset;
@@ -74,11 +65,7 @@ static void seekto(LoadInfo *info, gint offset)
 {
   info->offset = offset;
   GEGL_NOTE (GEGL_DEBUG_BUFFER_LOAD, "seek to %i", offset);
-#if HAVE_GIO
-  if(!g_seekable_seek (G_SEEKABLE (info->i), info->offset, G_SEEK_SET, NULL, NULL))
-#else
   if(lseek (info->i, info->offset, SEEK_SET) == -1)
-#endif
     {
       g_warning ("failed seeking");
     }
@@ -91,15 +78,8 @@ load_info_destroy (LoadInfo *info)
     return;
   if (info->path)
     g_free (info->path);
-#if HAVE_GIO
-  if (info->i)
-    g_object_unref (info->i);
-  if (info->file)
-    g_object_unref (info->file);
-#else
   if (info->i != -1)
     close (info->i);
-#endif
   if (info->tiles != NULL)
     {
       GList *iter;
@@ -113,42 +93,25 @@ load_info_destroy (LoadInfo *info)
   g_slice_free (LoadInfo, info);
 }
 
-#if HAVE_GIO
-GeglBufferItem *
-gegl_buffer_read_header (GInputStream *i,
-                         goffset      *offset)
-#else
 GeglBufferItem *
 gegl_buffer_read_header (int i,
                          goffset      *offset)
-#endif
 {
   goffset         placeholder;
   GeglBufferItem *ret;
   if (offset==0)
     offset = &placeholder;
 
-#if HAVE_GIO
-  if(!g_seekable_seek (G_SEEKABLE (i), 0, G_SEEK_SET, NULL, NULL))
-#else
   if(lseek(i, 0, SEEK_SET) == -1)
-#endif
     g_warning ("failed seeking to %i", 0);
   *offset = 0;
 
   ret = g_malloc (sizeof (GeglBufferHeader));
-#if HAVE_GIO
-  *offset += g_input_stream_read (i,
-                   ((gchar*)ret),
-                   sizeof(GeglBufferHeader),
-                   NULL, NULL);
-#else
   {
     ssize_t sz_read = read(i, ret, sizeof(GeglBufferHeader));
     if (sz_read != -1)
       *offset += sz_read;
   }
-#endif
 
   GEGL_NOTE (GEGL_DEBUG_BUFFER_LOAD, "read header: tile-width: %i tile-height: %i next:%i  %ix%i\n",
                    ret->header.tile_width,
@@ -173,13 +136,8 @@ gegl_buffer_read_header (int i,
  * is passed in the offset stored at the location is used as the initial seeking
  * point and will be updated with the offset after the read is completed.
  */
-#if HAVE_GIO
-static GeglBufferItem *read_block (GInputStream *i,
-                                   goffset      *offset)
-#else
 static GeglBufferItem *read_block (int           i,
                                    goffset      *offset)
-#endif
 {
   GeglBufferBlock block;
   GeglBufferItem *ret;
@@ -190,22 +148,14 @@ static GeglBufferItem *read_block (int           i,
     return NULL;
 
   if (offset)
-#if HAVE_GIO
-    if(!g_seekable_seek (G_SEEKABLE (i), *offset, G_SEEK_SET, NULL, NULL))
-#else
     if(lseek(i, *offset, SEEK_SET) == -1)
-#endif
       g_warning ("failed seeking to %i", (gint)*offset);
 
-#if HAVE_GIO
-  byte_read += g_input_stream_read (i, &block, sizeof (GeglBufferBlock), NULL, NULL);
-#else
   {
 	ssize_t sz_read = read (i, &block,  sizeof (GeglBufferBlock));
     if(sz_read != -1)
       byte_read += sz_read;
   }
-#endif
   GEGL_NOTE (GEGL_DEBUG_BUFFER_LOAD, "read block: length:%i next:%i",
                           block.length, (guint)block.next);
 
@@ -234,36 +184,24 @@ static GeglBufferItem *read_block (int           i,
        */
       ret = g_malloc (own_size);
       memcpy (ret, &block, sizeof (GeglBufferBlock));
-#if HAVE_GIO
-      byte_read += g_input_stream_read (i, ((gchar*)ret) + sizeof(GeglBufferBlock),
-                                       own_size - sizeof(GeglBufferBlock),
-                                       NULL, NULL);
-#else
       {
         ssize_t sz_read = read (i, ((gchar*)ret) + sizeof(GeglBufferBlock),
                                 own_size - sizeof(GeglBufferBlock));
         if(sz_read != -1)
           byte_read += sz_read;
       }
-#endif
       ret->block.length = own_size;
     }
   else if (block.length < own_size)
     {
       ret = g_malloc (own_size);
       memcpy (ret, &block, sizeof (GeglBufferBlock));
-#if HAVE_GIO
-      byte_read += g_input_stream_read (i, ((gchar*)ret) + sizeof(GeglBufferBlock),
-                                       block.length - sizeof (GeglBufferBlock),
-                                       NULL, NULL);
-#else
       {
         ssize_t sz_read = read (i, ret + sizeof(GeglBufferBlock),
 								block.length - sizeof (GeglBufferBlock));
 		if(sz_read != -1)
 		  byte_read += sz_read;
       }
-#endif
       ret->block.length = own_size;
     }
   else
@@ -276,15 +214,9 @@ static GeglBufferItem *read_block (int           i,
   return ret;
 }
 
-#if HAVE_GIO
-GList *
-gegl_buffer_read_index (GInputStream *i,
-                        goffset      *offset)
-#else
 GList *
 gegl_buffer_read_index (int           i,
                         goffset      *offset)
-#endif
 /* load the index */
 {
   GList          *ret = NULL;
@@ -325,23 +257,11 @@ gegl_buffer_load (const gchar *path)
   LoadInfo *info = g_slice_new0 (LoadInfo);
 
   info->path = g_strdup (path);
-#if HAVE_GIO
-  info->file = g_file_new_for_commandline_arg (info->path);
-  info->i = G_INPUT_STREAM (g_file_read (info->file, NULL, NULL));
-#else
   info->i = open (info->path, O_RDONLY);
-#endif
   GEGL_NOTE (GEGL_DEBUG_BUFFER_LOAD, "starting to load buffer %s", path);
-#if HAVE_GIO
-  if (!info->i)
-#else
   if (info->i == -1)
-#endif
     {
       GEGL_NOTE (GEGL_DEBUG_BUFFER_LOAD, "failed top open %s for reading", path);
-#if HAVE_GIO
-      g_object_unref (info->file);
-#endif
       return NULL;
     }
 
@@ -405,16 +325,11 @@ gegl_buffer_load (const gchar *path)
         data = gegl_tile_get_data (tile);
         g_assert (data);
 
-#if HAVE_GIO
-        info->offset += g_input_stream_read (info->i, data, info->tile_size,
-                                          NULL, NULL);
-#else
         {
           ssize_t sz_read = read (info->i, data, info->tile_size);
           if(sz_read != -1)
             info->offset += sz_read;
         }
-#endif
         /*g_assert (info->offset == entry->offset + info->tile_size);*/
 
         gegl_tile_unlock (tile);
diff --git a/gegl/buffer/gegl-buffer-save.c b/gegl/buffer/gegl-buffer-save.c
index 1529594..179a712 100644
--- a/gegl/buffer/gegl-buffer-save.c
+++ b/gegl/buffer/gegl-buffer-save.c
@@ -20,14 +20,10 @@
 
 #include <string.h>
 
-#if HAVE_GIO
-#include <gio/gio.h>
-#else
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
-#endif
 
 #include <glib-object.h>
 
@@ -55,12 +51,7 @@ typedef struct
   GeglBufferHeader header;
   GList           *tiles;
   gchar           *path;
-#if HAVE_GIO
-  GFile           *file;
-  GOutputStream   *o;
-#else
   int             o;
-#endif
 
   gint             tile_size;
   gint             offset;
@@ -106,13 +97,9 @@ static gsize write_block (SaveInfo        *info,
        if (block == NULL)
          info->in_holding->next = 0;
 
-#if HAVE_GIO
-       ret = g_output_stream_write (info->o, info->in_holding, info->in_holding->length, NULL, NULL);
-#else
        ret = write (info->o, info->in_holding, info->in_holding->length);
 	   if (ret == -1)
          ret = 0;
-#endif
        info->offset += ret;
        g_assert (allocated_pos == info->offset);
      }
@@ -130,15 +117,8 @@ save_info_destroy (SaveInfo *info)
     return;
   if (info->path)
     g_free (info->path);
-#if HAVE_GIO
-  if (info->o)
-    g_object_unref (info->o);
-  if (info->file)
-    g_object_unref (info->file);
-#else
   if (info->o != -1)
     close (info->o);
-#endif
   if (info->tiles != NULL)
     {
       GList *iter;
@@ -243,12 +223,7 @@ gegl_buffer_save (GeglBuffer          *buffer,
    */
 
   info->path = g_strdup (path);
-#if HAVE_GIO
-  info->file = g_file_new_for_commandline_arg (info->path);
-  info->o    = G_OUTPUT_STREAM (g_file_replace (info->file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL));
-#else
   info->o    = open (info->path, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
-#endif
   tile_width  = buffer->tile_storage->tile_width;
   tile_height = buffer->tile_storage->tile_height;
   g_object_get (buffer, "px-size", &bpp, NULL);
@@ -334,15 +309,11 @@ gegl_buffer_save (GeglBuffer          *buffer,
   }
 
   /* save the header */
-#if HAVE_GIO
-  info->offset += g_output_stream_write (info->o, &info->header, sizeof (GeglBufferHeader), NULL, NULL);
-#else
   {
     ssize_t ret = write (info->o, &info->header, sizeof (GeglBufferHeader));
 	if (ret != -1)
       info->offset += ret;
   }
-#endif
   g_assert (info->offset == info->header.next);
 
   /* save the index */
@@ -381,15 +352,11 @@ gegl_buffer_save (GeglBuffer          *buffer,
         g_assert (data);
 
         g_assert (info->offset == entry->offset);
-#if HAVE_GIO
-        info->offset += g_output_stream_write (info->o, data, info->tile_size, NULL, NULL);
-#else
         {
           ssize_t ret = write (info->o, data, info->tile_size);
 	      if (ret != -1)
             info->offset += ret;
         }
-#endif
         gegl_tile_unref (tile);
         i++;
       }
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index 94f2cf6..3e54417 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -42,9 +42,7 @@
 #include <glib-object.h>
 #include <glib/gstdio.h>
 #include <glib/gprintf.h>
-#if HAVE_GIO
 #include <gio/gio.h>
-#endif
 
 #include "gegl.h"
 #include "gegl-types-internal.h"
diff --git a/gegl/buffer/gegl-tile-backend-file.c b/gegl/buffer/gegl-tile-backend-file.c
index 0d97151..e5748be 100644
--- a/gegl/buffer/gegl-tile-backend-file.c
+++ b/gegl/buffer/gegl-tile-backend-file.c
@@ -18,14 +18,11 @@
 
 #include "config.h"
 
-#if HAVE_GIO
 #include <gio/gio.h>
-#else
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
-#endif
 #include <string.h>
 #include <errno.h>
 
@@ -80,6 +77,8 @@ struct _GeglTileBackendFile
    */
   GeglBufferHeader header;
 
+  gint            foffset;
+
   /* current offset, used when writing the index */
   gint             offset;
 
@@ -92,32 +91,15 @@ struct _GeglTileBackendFile
   /* loading buffer */
   GList           *tiles;
 
-#if HAVE_GIO
   /* GFile refering to our buffer */
   GFile           *file;
 
-  /* for reading/writing */
-  GIOStream       *io;
-
-  /* for reading */
-  GInputStream    *i;
-
-  /* for writing */
-  GOutputStream   *o;
-
-
-  /* Before using mmap we'll use GIO's infrastructure for monitoring
-   * the file for changes, this should also be more portable. This is
-   * used for for cooperated sharing of a buffer file
-   */
   GFileMonitor    *monitor;
-#else
   /* for writing */
   int              o;
 
   /* for reading */
   int              i;
-#endif
 };
 
 
@@ -137,45 +119,40 @@ gegl_tile_backend_file_file_entry_read (GeglTileBackendFile *self,
   gboolean success;
   gint     tile_size = gegl_tile_backend_get_tile_size (GEGL_TILE_BACKEND (self));
   goffset  offset = entry->offset;
+  guchar  *tdest = dest;
 
   gegl_tile_backend_file_ensure_exist (self);
 
-#if HAVE_GIO
-  success = g_seekable_seek (G_SEEKABLE (self->i),
-                             offset, G_SEEK_SET,
-                             NULL, NULL);
-#else
-  success = (lseek (self->i, offset, SEEK_SET) >= 0);
-#endif
-  if (success == FALSE)
+  if (self->foffset != offset)
     {
-      g_warning ("unable to seek to tile in buffer: %s", g_strerror (errno));
-      return;
+      success = (lseek (self->i, offset, SEEK_SET) >= 0);
+
+      if (success == FALSE)
+        {
+          g_warning ("unable to seek to tile in buffer: %s", g_strerror (errno));
+          return;
+        }
+      self->foffset = offset;
     }
   to_be_read = tile_size;
 
   while (to_be_read > 0)
     {
+      GError *error = NULL;
       gint byte_read;
 
-#if HAVE_GIO
-      byte_read = g_input_stream_read (G_INPUT_STREAM (self->i),
-                                       dest + tile_size - to_be_read, to_be_read,
-                                       NULL, NULL);
-#else
-      byte_read = read (self->i, dest + tile_size - to_be_read, to_be_read);
-#endif
+      byte_read = read (self->i, tdest + tile_size - to_be_read, to_be_read);
       if (byte_read <= 0)
         {
           g_message ("unable to read tile data from self: "
-                     "%s (%d/%d bytes read)",
-                     g_strerror (errno), byte_read, to_be_read);
+                     "%s (%d/%d bytes read) %s",
+                     g_strerror (errno), byte_read, to_be_read, error?error->message:"--");
           return;
         }
       to_be_read -= byte_read;
+      self->foffset += byte_read;
     }
 
-
   GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "read entry %i,%i,%i at %i", entry->x, entry->y, entry->z, (gint)offset);
 }
 
@@ -186,37 +163,32 @@ gegl_tile_backend_file_file_entry_write (GeglTileBackendFile *self,
 {
   gint     to_be_written;
   gboolean success;
-  gint     tile_size = gegl_tile_backend_get_tile_size (GEGL_TILE_BACKEND (self));
   goffset  offset = entry->offset;
+  gint     tile_size;
 
   gegl_tile_backend_file_ensure_exist (self);
 
-#if HAVE_GIO
-  success = g_seekable_seek (G_SEEKABLE (self->o),
-                             offset, G_SEEK_SET,
-                             NULL, NULL);
-#else
-  success = (lseek (self->o, offset, SEEK_SET) >= 0);
-#endif
-  if (success == FALSE)
+  if (self->foffset != offset)
     {
-      g_warning ("unable to seek to tile in buffer: %s", g_strerror (errno));
-      return;
+      success = (lseek (self->o, offset, SEEK_SET) >= 0);
+      if (success == FALSE)
+        {
+          g_warning ("unable to seek to tile in buffer: %s", g_strerror (errno));
+          return;
+        }
+      self->foffset = offset;
     }
+
+  tile_size = gegl_tile_backend_get_tile_size (GEGL_TILE_BACKEND (self));
+
   to_be_written = tile_size;
 
   while (to_be_written > 0)
     {
       gint wrote;
-#if HAVE_GIO
-      wrote = g_output_stream_write (self->o,
-                                     source + tile_size - to_be_written,
-                                     to_be_written, NULL, NULL);
-#else
       wrote = write (self->o,
                      source + tile_size - to_be_written,
                      to_be_written);
-#endif
       if (wrote <= 0)
         {
           g_message ("unable to write tile data to self: "
@@ -225,6 +197,7 @@ gegl_tile_backend_file_file_entry_write (GeglTileBackendFile *self,
           return;
         }
       to_be_written -= wrote;
+      self->foffset += wrote;
     }
   GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "wrote entry %i,%i,%i at %i", entry->x, entry->y, entry->z, (gint)offset);
 }
@@ -240,7 +213,10 @@ gegl_tile_backend_file_file_entry_new (GeglTileBackendFile *self)
 
   if (self->free_list)
     {
-      /* XXX: losing precision ? */
+      /* XXX: losing precision ?
+       * the free list seems to operate with fixed size datums and
+       * only keep track of offsets.
+       */
       gint offset = GPOINTER_TO_INT (self->free_list->data);
       entry->offset = offset;
       self->free_list = g_slist_remove (self->free_list, self->free_list->data);
@@ -255,18 +231,16 @@ gegl_tile_backend_file_file_entry_new (GeglTileBackendFile *self)
       GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "  set offset %i (next allocation)", (gint)entry->offset);
       self->next_pre_alloc += tile_size;
 
-      if (self->next_pre_alloc >= self->total)
+      if (self->next_pre_alloc >= self->total) /* automatic growing ensuring that
+                                                  we have room for next allocation..
+                                                */
         {
           self->total = self->total + 32 * tile_size;
 
           GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "growing file to %i bytes", (gint)self->total);
 
-#if HAVE_GIO
-          g_assert (g_seekable_truncate (G_SEEKABLE (self->o),
-                                         self->total, NULL,NULL));
-#else
-          g_assert (ftruncate (self->o, self->total) == 0);
-#endif
+          ftruncate (self->o, self->total);
+          self->foffset = -1;
         }
     }
   gegl_tile_backend_file_dbg_alloc (gegl_tile_backend_get_tile_size (GEGL_TILE_BACKEND (self)));
@@ -294,22 +268,14 @@ gegl_tile_backend_file_write_header (GeglTileBackendFile *self)
 
   gegl_tile_backend_file_ensure_exist (self);
 
-#if HAVE_GIO
-  success = g_seekable_seek (G_SEEKABLE (self->o), 0, G_SEEK_SET,
-                             NULL, NULL);
-#else
   success = (lseek (self->o, 0, SEEK_SET) != -1);
-#endif
   if (success == FALSE)
     {
       g_warning ("unable to seek in buffer");
       return FALSE;
     }
-#if HAVE_GIO
-  g_output_stream_write (self->o, &(self->header), 256, NULL, NULL);
-#else
   write (self->o, &(self->header), 256);
-#endif
+  self->foffset = 256;
   GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "Wrote header, next=%i", (gint)self->header.next);
   return TRUE;
 }
@@ -323,40 +289,41 @@ gegl_tile_backend_file_write_block (GeglTileBackendFile *self,
     {
       guint64 next_allocation = self->offset + self->in_holding->length;
 
-      /* update the next offset pointer in the previous block */
-      self->in_holding->next = next_allocation;
 
-      if (block == NULL) /* the previous block was the last block */
-        {
+      /* update the next offset pointer in the previous block */
+      if (block == NULL)
+          /* the previous block was the last block */
           self->in_holding->next = 0;
-        }
+      else
+          self->in_holding->next = next_allocation;
+
+      if (self->foffset != self->offset)
+      {
+        if(lseek (self->o, self->offset, G_SEEK_SET) == -1)
+          goto fail;
 
-#if HAVE_GIO
-      if(!g_seekable_seek (G_SEEKABLE (self->o),
-                           self->offset, G_SEEK_SET,
-                           NULL, NULL))
-#else
-      if(lseek (self->o, self->offset, G_SEEK_SET) == -1)
-#endif
-        goto fail;
+        self->foffset = self->offset;
+      }
+
+      printf ("write block: %i\n", block->flags);
+      /* XXX: should promiscuosuly try to compress here as well,. if revisions
+              are not matching..
+       */
 
       GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "Wrote block: length:%i flags:%i next:%i at offset %i",
                  self->in_holding->length,
                  self->in_holding->flags,
                  (gint)self->in_holding->next,
                  (gint)self->offset);
-#if HAVE_GIO
-      self->offset += g_output_stream_write (self->o, self->in_holding,
-                                             self->in_holding->length,
-                                             NULL, NULL);
-#else
       {
         ssize_t written = write (self->o, self->in_holding,
                                  self->in_holding->length);
         if(written != -1)
-          self->offset += written;
+          {
+            self->offset += written;
+            self->foffset += written;
+          }
       }
-#endif
 
       g_assert (next_allocation == self->offset); /* true as long as
                                                      the simple allocation
@@ -372,14 +339,13 @@ gegl_tile_backend_file_write_block (GeglTileBackendFile *self,
                                             * of file, worry about writing
                                             * header inside free list later
                                             */
-#if HAVE_GIO
-      if(!g_seekable_seek (G_SEEKABLE (self->o),
-                           (goffset) self->offset, G_SEEK_SET,
-                           NULL, NULL))
-#else
-      if(lseek (self->o, self->offset, G_SEEK_SET) == -1)
-#endif
-        goto fail;
+      if (self->foffset != self->offset)
+      {
+        if(lseek (self->o, self->offset, G_SEEK_SET) == -1)
+          goto fail;
+
+        self->foffset = self->offset;
+      }
     }
   self->in_holding = block;
 
@@ -585,11 +551,7 @@ gegl_tile_backend_file_flush (GeglTileSource *source,
     }
 
   gegl_tile_backend_file_write_header (self);
-#if HAVE_GIO
-  g_output_stream_flush (self->o, NULL, NULL);
-#else
   fsync (self->o);
-#endif
 
   GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "flushed %s", self->path);
 
@@ -692,17 +654,6 @@ gegl_tile_backend_file_finalize (GObject *object)
     {
       GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "finalizing buffer %s", self->path);
 
-#if HAVE_GIO
-      if (self->io)
-        {
-          g_io_stream_close (self->io, NULL, NULL);
-          g_object_unref (self->io);
-          self->io = NULL;
-        }
-
-      if (self->file)
-        g_file_delete  (self->file, NULL, NULL);
-#else
       if (self->i != -1)
         {
           close (self->i);
@@ -713,19 +664,16 @@ gegl_tile_backend_file_finalize (GObject *object)
           close (self->o);
           self->o = -1;
         }
-#endif
     }
 
   if (self->path)
     g_free (self->path);
 
-#if HAVE_GIO
   if (self->monitor)
     g_object_unref (self->monitor);
 
   if (self->file)
     g_object_unref (self->file);
-#endif
 
   (*G_OBJECT_CLASS (parent_class)->finalize)(object);
 }
@@ -788,11 +736,13 @@ gegl_tile_backend_file_load_index (GeglTileBackendFile *self,
    */
   /* reload header */
   new_header = gegl_buffer_read_header (self->i, &offset)->header;
+  self->foffset = 256;
 
   while (new_header.flags & GEGL_FLAG_LOCKED)
     {
       g_usleep (50000);
       new_header = gegl_buffer_read_header (self->i, &offset)->header;
+      self->foffset = 256;
     }
 
   if (new_header.rev == self->header.rev)
@@ -806,10 +756,10 @@ gegl_tile_backend_file_load_index (GeglTileBackendFile *self,
       GEGL_NOTE(GEGL_DEBUG_TILE_BACKEND, "loading index: %s", self->path);
     }
 
-
   tile_size = gegl_tile_backend_get_tile_size (GEGL_TILE_BACKEND (self));
   offset      = self->header.next;
   self->tiles = gegl_buffer_read_index (self->i, &offset);
+  self->foffset = -1;
   backend     = GEGL_TILE_BACKEND (self);
 
   for (iter = self->tiles; iter; iter=iter->next)
@@ -869,7 +819,6 @@ gegl_tile_backend_file_load_index (GeglTileBackendFile *self,
   self->tiles          = NULL;
 }
 
-#if HAVE_GIO
 static void
 gegl_tile_backend_file_file_changed (GFileMonitor        *monitor,
               GFile               *file,
@@ -880,9 +829,9 @@ gegl_tile_backend_file_file_changed (GFileMonitor        *monitor,
   if (event_type == G_FILE_MONITOR_EVENT_CHANGED /*G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT*/ )
     {
       gegl_tile_backend_file_load_index (self, TRUE);
+      self->foffset = -1;
     }
 }
-#endif
 
 static GObject *
 gegl_tile_backend_file_constructor (GType                  type,
@@ -898,24 +847,17 @@ gegl_tile_backend_file_constructor (GType                  type,
   backend = GEGL_TILE_BACKEND (object);
 
   GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "constructing file backend: %s", self->path);
-#if HAVE_GIO
+
   self->file = g_file_new_for_commandline_arg (self->path);
-#else
   self->i = self->o = -1;
-#endif
   self->index = g_hash_table_new (gegl_tile_backend_file_hashfunc, gegl_tile_backend_file_equalfunc);
 
 
   /* If the file already exists open it, assuming it is a GeglBuffer. */
-#if HAVE_GIO
-  if (g_file_query_exists (self->file, NULL))
-#else
   if (access (self->path, F_OK) != -1)
-#endif
     {
       goffset offset = 0;
 
-#if HAVE_GIO
       /* Install a monitor for changes to the file in case other applications
        * might be writing to the buffer
        */
@@ -925,39 +867,9 @@ gegl_tile_backend_file_constructor (GType                  type,
                         G_CALLBACK (gegl_tile_backend_file_file_changed),
                         self);
 
-      {
-        GError *error = NULL;
-        self->io = G_IO_STREAM (g_file_open_readwrite (self->file, NULL, &error));
-        if (error)
-          {
-            /* Try again but this time with only read access. This is
-             * a quick-fix for make distcheck, where img_cmp fails
-             * when it opens a GeglBuffer file in the source tree
-             * (which is read-only).
-             */
-            g_error_free (error);
-            error = NULL;
-            self->i = G_INPUT_STREAM (g_file_read (self->file, NULL, &error));
-
-            if (error)
-              {
-                g_warning ("%s: %s", G_STRLOC, error->message);
-                g_error_free (error);
-                error = NULL;
-              }
-          }
-        else
-          {
-            self->o = g_io_stream_get_output_stream (self->io);
-            self->i = g_io_stream_get_input_stream (self->io);
-          }
-      }
-
-#else
       self->o = open (self->path, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
       self->i = dup (self->o);
-#endif
-      /*self->i = G_INPUT_STREAM (g_file_read (self->file, NULL, NULL));*/
+
       self->header = gegl_buffer_read_header (self->i, &offset)->header;
       self->header.rev = self->header.rev -1;
 
@@ -975,15 +887,8 @@ gegl_tile_backend_file_constructor (GType                  type,
       /* insert each of the entries into the hash table */
       gegl_tile_backend_file_load_index (self, TRUE);
       self->exist = TRUE;
-#if HAVE_GIO
-      /* We can only assert input stream, we won't have an output
-       * stream on read-only files
-       */
-      g_assert (self->i);
-#else
       g_assert (self->i != -1);
       g_assert (self->o != -1);
-#endif
 
       /* to autoflush gegl_buffer_set */
 
@@ -995,9 +900,7 @@ gegl_tile_backend_file_constructor (GType                  type,
       self->exist = FALSE; /* this is also the default, the file will be created on demand */
     }
 
-#if HAVE_GIO
   g_assert (self->file);
-#endif
 
   backend->priv->header = &self->header;
 
@@ -1010,45 +913,17 @@ gegl_tile_backend_file_ensure_exist (GeglTileBackendFile *self)
   if (!self->exist)
     {
       GeglTileBackend *backend;
-#if HAVE_GIO
-      GError *error = NULL;
-
-      if (self->io)
-        {
-          g_print ("we already existed\n");
-          return;
-        }
-#endif
       self->exist = TRUE;
 
       backend = GEGL_TILE_BACKEND (self);
 
       GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "creating swapfile  %s", self->path);
 
-#if HAVE_GIO
-      self->o = G_OUTPUT_STREAM (g_file_replace (self->file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL));
-      g_output_stream_flush (self->o, NULL, NULL);
-      g_output_stream_close (self->o, NULL, NULL);
-
-      self->io = G_IO_STREAM (g_file_open_readwrite (self->file, NULL, &error));
-      if (error)
-        {
-          g_warning ("%s: %s", G_STRLOC, error->message);
-          g_error_free (error);
-          error = NULL;
-        }
-      self->o = g_io_stream_get_output_stream (self->io);
-      self->i = g_io_stream_get_input_stream (self->io);
-
-#else
       self->o = open (self->path, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
-#endif
 
       self->next_pre_alloc = 256;  /* reserved space for header */
       self->total          = 256;  /* reserved space for header */
-#if HAVE_GIO
-      g_assert(g_seekable_seek (G_SEEKABLE (self->o), 256, G_SEEK_SET, NULL, NULL));
-#endif
+      self->foffset        = 0;
       gegl_buffer_header_init (&self->header,
                                backend->priv->tile_width,
                                backend->priv->tile_height,
@@ -1056,24 +931,15 @@ gegl_tile_backend_file_ensure_exist (GeglTileBackendFile *self)
                                backend->priv->format
                                );
       gegl_tile_backend_file_write_header (self);
-#if HAVE_GIO
-      g_output_stream_flush (self->o, NULL, NULL);
-#else
+      self->foffset       = 256;
       fsync (self->o);
       self->i = dup (self->o);
-#endif
 
       /*self->i = G_INPUT_STREAM (g_file_read (self->file, NULL, NULL));*/
       self->next_pre_alloc = 256;  /* reserved space for header */
       self->total          = 256;  /* reserved space for header */
-#if HAVE_GIO
-      g_assert (self->io);
-      g_assert (self->i);
-      g_assert (self->o);
-#else
       g_assert (self->i != -1);
       g_assert (self->o != -1);
-#endif
     }
 }
 
@@ -1106,15 +972,9 @@ gegl_tile_backend_file_init (GeglTileBackendFile *self)
 {
   ((GeglTileSource*)self)->command = gegl_tile_backend_file_command;
   self->path           = NULL;
-#if HAVE_GIO
   self->file           = NULL;
-  self->io             = NULL;
-  self->i              = NULL;
-  self->o              = NULL;
-#else
   self->i              = -1;
   self->o              = -1;
-#endif
   self->index          = NULL;
   self->free_list      = NULL;
   self->next_pre_alloc = 256;  /* reserved space for header */
@@ -1132,11 +992,7 @@ gegl_tile_backend_file_try_lock (GeglTileBackendFile *self)
     }
   self->header.flags += GEGL_FLAG_LOCKED;
   gegl_tile_backend_file_write_header (self);
-#if HAVE_GIO
-  g_output_stream_flush (self->o, NULL, NULL);
-#else
   fsync (self->o);
-#endif
   return TRUE;
 }
 
@@ -1150,10 +1006,6 @@ gegl_tile_backend_file_unlock (GeglTileBackendFile *self)
     }
   self->header.flags -= GEGL_FLAG_LOCKED;
   gegl_tile_backend_file_write_header (self);
-#if HAVE_GIO
-  g_output_stream_flush (self->o, NULL, NULL);
-#else
   fsync (self->o);
-#endif
   return TRUE;
 }
diff --git a/gegl/buffer/gegl-tile-storage.c b/gegl/buffer/gegl-tile-storage.c
index 242c65c..769f6a1 100644
--- a/gegl/buffer/gegl-tile-storage.c
+++ b/gegl/buffer/gegl-tile-storage.c
@@ -26,9 +26,7 @@
 #include "gegl-tile.h"
 #include "gegl-tile-backend-file.h"
 #include "gegl-tile-backend-ram.h"
-#if HAVE_GIO
 #include "gegl-tile-backend-tiledir.h"
-#endif
 #include "gegl-tile-handler-empty.h"
 #include "gegl-tile-handler-zoom.h"
 #include "gegl-tile-handler-cache.h"
diff --git a/gegl/gegl-init.c b/gegl/gegl-init.c
index b985b97..dad80de 100644
--- a/gegl/gegl-init.c
+++ b/gegl/gegl-init.c
@@ -308,9 +308,7 @@ GeglConfig *gegl_config (void)
 }
 
 void gegl_tile_backend_ram_stats (void);
-#if HAVE_GIO
 void gegl_tile_backend_tiledir_stats (void);
-#endif
 void gegl_tile_backend_file_stats (void);
 
 
@@ -380,9 +378,7 @@ gegl_exit (void)
       gegl_buffer_stats ();
       gegl_tile_backend_ram_stats ();
       gegl_tile_backend_file_stats ();
-#if HAVE_GIO
       gegl_tile_backend_tiledir_stats ();
-#endif
     }
   global_time = gegl_ticks () - global_time;
   gegl_instrument ("gegl", "gegl", global_time);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]