backend/file.h File Reference


Detailed Description

File management Handling Files is splitted into different classes: 1.

The 'lumiera_file' class which acts as interface to the outside for managing files. 'lumiera_file' is addressed by the name of the file. Since files can have more than one name (hardlinks) many 'lumiera_file' can point to a single 'lumiera_filedescriptor' 2. The 'lumiera_filedescriptor' class which does the real work managing the file in the back. 3. Since OS-filehandles are a limited resource we access the lazily as 'lumiera_filehandle' which are managed in a 'lumiera_filehandlecache'

Definition in file file.h.

#include "lib/mutex.h"
#include "lib/llist.h"
#include "lib/error.h"
#include "backend/filehandle.h"
#include "backend/filedescriptor.h"

Include dependency graph for file.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  lumiera_file_struct

Defines

#define LUMIERA_FILE_CREATE   (O_RDWR | O_LARGEFILE | O_NOATIME | O_CREAT | O_EXCL)
#define LUMIERA_FILE_MASK   ~(O_CREAT | O_EXCL | O_TRUNC)
#define LUMIERA_FILE_READONLY   (O_RDONLY | O_LARGEFILE | O_NOATIME)
#define LUMIERA_FILE_READWRITE   (O_RDWR | O_LARGEFILE | O_NOATIME)
#define LUMIERA_FILE_RECREATE   (O_RDWR | O_LARGEFILE | O_NOATIME | O_CREAT | O_TRUNC)

Typedefs

typedef struct lumiera_file_struct lumiera_file
typedef lumiera_file * LumieraFile

Functions

 LUMIERA_ERROR_DECLARE (FILE_CHANGED)
void lumiera_file_delete (LumieraFile self)
 Frees a file structure.
LumieraFile lumiera_file_destroy (LumieraFile self)
 Destroy a file structure.
int lumiera_file_handle_acquire (LumieraFile self)
 Get a POSIX filehandle for a file.
void lumiera_file_handle_release (LumieraFile self)
 Put filehandle back into cache aging.
LumieraFile lumiera_file_init (LumieraFile self, const char *name, int flags)
 Initialize a file structure.
LumieraFile lumiera_file_new (const char *name, int flags)
 Allocate a new file structure.
 NOBUG_DECLARE_FLAG (file)


Function Documentation

LumieraFile lumiera_file_init ( LumieraFile  self,
const char *  name,
int  flags 
)

Initialize a file structure.

Parameters:
self pointer to the file structure
name filename
flags open flags
Returns:
self

Definition at line 38 of file file.c.

00039 {
00040   TRACE (file);
00041   if (!(self->descriptor = lumiera_filedescriptor_acquire (name, flags)))
00042     return NULL;
00043   self->name = lumiera_strndup (name, PATH_MAX);
00044 
00045   return self;
00046 }

LumieraFile lumiera_file_destroy ( LumieraFile  self  ) 

Destroy a file structure.

frees all associated resources, releases the filedescriptor etc.

Parameters:
self file structure to be destroyed
Returns:
self

Definition at line 49 of file file.c.

References lumiera_free().

00050 {
00051   TRACE (file);
00052   lumiera_filedescriptor_release (self->descriptor);
00053   lumiera_free (self->name);
00054   return self;
00055 }

Here is the call graph for this function:

LumieraFile lumiera_file_new ( const char *  name,
int  flags 
)

Allocate a new file structure.

Parameters:
name filename
flags open flags
Returns:
new file structure

Definition at line 59 of file file.c.

00060 {
00061   TRACE (file);
00062   LumieraFile self = lumiera_malloc (sizeof (lumiera_file));
00063   return lumiera_file_init (self, name, flags);
00064 }

void lumiera_file_delete ( LumieraFile  self  ) 

Frees a file structure.

Parameters:
self file structure to be freed

Definition at line 67 of file file.c.

References lumiera_free().

00068 {
00069   TRACE (file);
00070   lumiera_free (lumiera_file_destroy (self));
00071 }

Here is the call graph for this function:

int lumiera_file_handle_acquire ( LumieraFile  self  ) 

Get a POSIX filehandle for a file.

Filehandles are opened on demand and must be acquired for use. Using filehandles is refcounted and might be nested. After using them they must be released which puts them back into filehandlecache aging.

Parameters:
self file structure
Returns:
POSIX filehandle or -1 on error, check lumiera_error() to retrieve the errorcode Currently only LUMIERA_ERROR_ERRNO will be raised but this might change in future. Opening files can fail for many reasons and at any time!

Definition at line 75 of file file.c.

References LUMIERA_ERROR_SET, and LUMIERA_MUTEX_SECTION.

00076 {
00077   TRACE (file);
00078   REQUIRE (self);
00079   REQUIRE (self->descriptor);
00080   REQUIRE (lumiera_fhcache);
00081 
00082   LUMIERA_MUTEX_SECTION (file, &self->descriptor->lock)
00083     {
00084       if (!self->descriptor->handle)
00085         /* no handle yet, get a new one */
00086         lumiera_filehandlecache_handle_acquire (lumiera_fhcache, self->descriptor);
00087       else
00088         lumiera_filehandlecache_checkout (lumiera_fhcache, self->descriptor->handle);
00089 
00090       if (self->descriptor->handle->fd == -1)
00091         {
00092           int fd;
00093           fd = open (self->name, self->descriptor->flags & LUMIERA_FILE_MASK);
00094           if (fd == -1)
00095             {
00096               LUMIERA_ERROR_SET (file, ERRNO);
00097             }
00098           else
00099             {
00100               struct stat st;
00101               if (fstat (fd, &st) == -1)
00102                 {
00103                   close (fd);
00104                   LUMIERA_ERROR_SET (file, ERRNO);
00105                 }
00106               else if (self->descriptor->stat.st_dev != st.st_dev || self->descriptor->stat.st_ino != st.st_ino)
00107                 {
00108                   close (fd);
00109                   /* Woops this is not the file we expected to use */
00110                   LUMIERA_ERROR_SET (file, FILE_CHANGED);
00111                 }
00112             }
00113           self->descriptor->handle->fd = fd;
00114         }
00115     }
00116 
00117   return self->descriptor->handle->fd;
00118 }

void lumiera_file_handle_release ( LumieraFile  self  ) 

Put filehandle back into cache aging.

Parameters:
self file which handle to be released

Definition at line 122 of file file.c.

References LUMIERA_MUTEX_SECTION.

00123 {
00124   TRACE (file);
00125 
00126   LUMIERA_MUTEX_SECTION (file, &self->descriptor->lock)
00127     {
00128       lumiera_filehandlecache_checkin (lumiera_fhcache, self->descriptor->handle);
00129     }
00130 }


Generated on Fri Nov 7 22:15:09 2008 for Lumiera by  doxygen 1.5.6