From 208f7e2d76d861bb2539e62f35c1fba0d435de43 Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Mon, 10 Nov 2008 15:11:41 +0100 Subject: [PATCH] Refactored filehandle acquisition to filehandle.c (duh!) some old ad-hoc code slipped in which did that in file.c --- src/backend/file.c | 40 +++--------------------------------- src/backend/filedescriptor.c | 35 +++++++++++++++++++++++++------ src/backend/filedescriptor.h | 6 ++++-- src/backend/filehandle.c | 33 +++++++++++++++++++++++++++++ src/backend/filehandle.h | 3 +++ 5 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/backend/file.c b/src/backend/file.c index f0bb7d525..beceece1e 100644 --- a/src/backend/file.c +++ b/src/backend/file.c @@ -53,7 +53,8 @@ LumieraFile lumiera_file_destroy (LumieraFile self) { TRACE (file); - lumiera_filedescriptor_release (self->descriptor); + + lumiera_filedescriptor_release (self->descriptor, self->name); lumiera_free (self->name); return self; } @@ -83,42 +84,7 @@ lumiera_file_handle_acquire (LumieraFile self) REQUIRE (self->descriptor); REQUIRE (lumiera_fhcache); - LUMIERA_MUTEX_SECTION (file, &self->descriptor->lock) - { - if (!self->descriptor->handle) - /* no handle yet, get a new one */ - lumiera_filehandlecache_handle_acquire (lumiera_fhcache, self->descriptor); - else - lumiera_filehandlecache_checkout (lumiera_fhcache, self->descriptor->handle); - - if (self->descriptor->handle->fd == -1) - { - int fd; - fd = open (self->name, self->descriptor->flags & LUMIERA_FILE_MASK); - if (fd == -1) - { - LUMIERA_ERROR_SET (file, ERRNO); - } - else - { - struct stat st; - if (fstat (fd, &st) == -1) - { - close (fd); - LUMIERA_ERROR_SET (file, ERRNO); - } - else if (self->descriptor->stat.st_dev != st.st_dev || self->descriptor->stat.st_ino != st.st_ino) - { - close (fd); - /* Woops this is not the file we expected to use */ - LUMIERA_ERROR_SET (file, FILE_CHANGED); - } - } - self->descriptor->handle->fd = fd; - } - } - - return self->descriptor->handle->fd; + return lumiera_filedescriptor_handle (self->descriptor, self->name); } diff --git a/src/backend/filedescriptor.c b/src/backend/filedescriptor.c index d10fc9897..02b1466e5 100644 --- a/src/backend/filedescriptor.c +++ b/src/backend/filedescriptor.c @@ -73,7 +73,8 @@ cmp_fn (const void* keya, const void* keyb) static void delete_fn (PSplaynode node) { - lumiera_filedescriptor_delete ((LumieraFiledescriptor) node); + TODO ("figure name out? or is the handle here always closed"); + lumiera_filedescriptor_delete ((LumieraFiledescriptor) node, NULL); } @@ -187,11 +188,33 @@ lumiera_filedescriptor_acquire (const char* name, int flags) void -lumiera_filedescriptor_release (LumieraFiledescriptor self) +lumiera_filedescriptor_release (LumieraFiledescriptor self, const char* name) { - TRACE (filedescriptor, "%p", self); + TRACE (filedescriptor, "%p, refcount: %d", self, self->refcount); if (!--self->refcount) - lumiera_filedescriptor_delete (self); + lumiera_filedescriptor_delete (self, name); +} + + +int +lumiera_filedescriptor_handle (LumieraFiledescriptor self, const char* name) +{ + TRACE (filedescriptor); + + int fd = -1; + + LUMIERA_MUTEX_SECTION (filedescriptor, &self->lock) + { + if (!self->handle) + /* no handle yet, get a new one */ + lumiera_filehandlecache_handle_acquire (lumiera_fhcache, self); + else + lumiera_filehandlecache_checkout (lumiera_fhcache, self->handle); + + fd = lumiera_filehandle_handle (self->handle, name, self->flags, &self->stat); + } + + return fd; } @@ -215,9 +238,9 @@ lumiera_filedescriptor_new (LumieraFiledescriptor template) void -lumiera_filedescriptor_delete (LumieraFiledescriptor self) +lumiera_filedescriptor_delete (LumieraFiledescriptor self, const char* name) { - TRACE (filedescriptor, "%p", self); + TRACE (filedescriptor, "%p %s", self, name); LUMIERA_MUTEX_SECTION (filedescriptor, ®istry_mutex) { diff --git a/src/backend/filedescriptor.h b/src/backend/filedescriptor.h index 135d52eec..e67675bfd 100644 --- a/src/backend/filedescriptor.h +++ b/src/backend/filedescriptor.h @@ -108,8 +108,10 @@ lumiera_filedescriptor_acquire (const char* name, int flags); * @param self filedescriptor to be released */ void -lumiera_filedescriptor_release (LumieraFiledescriptor self); +lumiera_filedescriptor_release (LumieraFiledescriptor self, const char* name); +int +lumiera_filedescriptor_handle (LumieraFiledescriptor self, const char* name); /** * Allocate a new filedescriptor cloned from a template @@ -125,6 +127,6 @@ lumiera_filedescriptor_new (LumieraFiledescriptor template); * @param self the filedescriptor to be deleted */ void -lumiera_filedescriptor_delete (LumieraFiledescriptor self); +lumiera_filedescriptor_delete (LumieraFiledescriptor self, const char* name); #endif diff --git a/src/backend/filehandle.c b/src/backend/filehandle.c index b2a104319..6075baa08 100644 --- a/src/backend/filehandle.c +++ b/src/backend/filehandle.c @@ -66,3 +66,36 @@ lumiera_filehandle_get (LumieraFilehandle self) return -1; } + +int +lumiera_filehandle_handle (LumieraFilehandle self, const char* name, int flags, struct stat* stat) +{ + TRACE (filehandle); + + int fd = -1; + if (self->fd == -1) + { + fd = open (name, flags & LUMIERA_FILE_MASK); + if (fd == -1) + { + LUMIERA_ERROR_SET (filehandle, ERRNO); + } + else + { + struct stat st; + if (fstat (fd, &st) == -1) + { + close (fd); + LUMIERA_ERROR_SET (filehandle, ERRNO); + } + else if (stat->st_dev != st.st_dev || stat->st_ino != st.st_ino) + { + close (fd); + /* Woops this is not the file we expected to use */ + LUMIERA_ERROR_SET (filehandle, FILE_CHANGED); + } + } + self->fd = fd; + } + return self->fd; +} diff --git a/src/backend/filehandle.h b/src/backend/filehandle.h index 61e916765..1d10c64a3 100644 --- a/src/backend/filehandle.h +++ b/src/backend/filehandle.h @@ -68,4 +68,7 @@ lumiera_filehandle_new (); void* lumiera_filehandle_destroy_node (LList node); +int +lumiera_filehandle_handle (LumieraFilehandle self, const char* name, int flags, struct stat* stat); + #endif