[gegl] buffer: always rely on having GIO
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: always rely on having GIO
- Date: Wed, 27 Apr 2011 21:40:24 +0000 (UTC)
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]