Refactored filehandle acquisition to filehandle.c (duh!)

some old ad-hoc code slipped in which did that in file.c
This commit is contained in:
Christian Thaeter 2008-11-10 15:11:41 +01:00
parent c88a2ffa1e
commit 208f7e2d76
5 changed files with 72 additions and 45 deletions

View file

@ -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);
}

View file

@ -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, &registry_mutex)
{

View file

@ -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

View file

@ -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;
}

View file

@ -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