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"


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) | |
| LumieraFile lumiera_file_init | ( | LumieraFile | self, | |
| const char * | name, | |||
| int | flags | |||
| ) |
Initialize a file structure.
| self | pointer to the file structure | |
| name | filename | |
| flags | open flags |
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.
| self | file structure to be destroyed |
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 }

| LumieraFile lumiera_file_new | ( | const char * | name, | |
| int | flags | |||
| ) |
| void lumiera_file_delete | ( | LumieraFile | self | ) |
Frees a file structure.
| 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 }

| 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.
| self | file structure |
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.
| 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 }
1.5.6