backend/filedescriptor.h File Reference


Detailed Description

Filedescriptors.

Filedescriptors are the underlying working horse in accessing files. All information associated with managing a file is kept here.

Definition in file filedescriptor.h.

#include "lib/mutex.h"
#include "lib/psplay.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "backend/filehandle.h"
#include "backend/file.h"

Include dependency graph for filedescriptor.h:

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

Go to the source code of this file.

Classes

struct  lumiera_filedescriptor_struct

Typedefs

typedef struct
lumiera_filedescriptor_struct 
lumiera_filedescriptor
typedef lumiera_filedescriptor * LumieraFiledescriptor

Functions

LumieraFiledescriptor lumiera_filedescriptor_acquire (const char *name, int flags)
 Find existing filedescriptor or create one.
void lumiera_filedescriptor_delete (LumieraFiledescriptor self)
 Delete a filedescriptor Called whenever its reference count drops to zero.
LumieraFiledescriptor lumiera_filedescriptor_new (LumieraFiledescriptor template)
 Allocate a new filedescriptor cloned from a template.
void lumiera_filedescriptor_registry_destroy (void)
 Destroy and free the global filedescriptor registry.
void lumiera_filedescriptor_registry_init (void)
 Initialize the global filedescriptor registry.
void lumiera_filedescriptor_release (LumieraFiledescriptor self)
 Release a filedescriptor.


Function Documentation

void lumiera_filedescriptor_registry_init ( void   ) 

Initialize the global filedescriptor registry.

All filedescriptors are looked up by dev/ino/open-flags in a hashtable. Opening hardlinked files will be targeted to the same filedescriptor. This function never fails but dies on error.

Definition at line 89 of file filedescriptor.c.

References LUMIERA_DIE.

00090 {
00091   NOBUG_INIT_FLAG (filedescriptor);
00092   TRACE (filedescriptor);
00093   REQUIRE (!registry);
00094 
00095   registry = psplay_new (cmp_fn, key_fn, delete_fn);
00096   if (!registry)
00097     LUMIERA_DIE (NO_MEMORY);
00098 
00099   TODO ("LumieraMutex lumiera_mutex_init (LumieraMutex self, const char* purpose, struct nobug_flag* flag);");
00100 
00101   //  RESOURCE_HANDLE_INIT (registry_mutex.rh);
00102   RESOURCE_ANNOUNCE (filedescriptor, "mutex", "filedescriptor registry", &registry, registry_mutex.rh);
00103 }

void lumiera_filedescriptor_registry_destroy ( void   ) 

Destroy and free the global filedescriptor registry.

Never fails.

Definition at line 106 of file filedescriptor.c.

References psplay_nelements().

00107 {
00108   TRACE (filedescriptor);
00109   REQUIRE (!psplay_nelements (registry));
00110 
00111   RESOURCE_FORGET (filedescriptor, registry_mutex.rh);
00112 
00113   TODO ("LumieraMutex lumiera_mutex_destroy (LumieraMutex self, struct nobug_flag* flag);");
00114 
00115   if (registry)
00116     psplay_destroy (registry);
00117   registry = NULL;
00118 }

Here is the call graph for this function:

LumieraFiledescriptor lumiera_filedescriptor_acquire ( const char *  name,
int  flags 
)

Find existing filedescriptor or create one.

Parameters:
name name of the file
flags opening flags for the filedescriptor
Returns:
descriptor on success or NULL on error

Definition at line 122 of file filedescriptor.c.

References LUMIERA_ERROR_SET, and LUMIERA_MUTEX_SECTION.

00123 {
00124   TRACE (filedescriptor, "%s", name);
00125   REQUIRE (registry, "not initialized");
00126 
00127   LumieraFiledescriptor dest = NULL;
00128 
00129   LUMIERA_MUTEX_SECTION (filedescriptor, &registry_mutex)
00130     {
00131       lumiera_filedescriptor fdesc;
00132       fdesc.flags = flags;
00133 
00134       if (stat (name, &fdesc.stat) != 0)
00135         {
00136           if (errno == ENOENT && flags&O_CREAT)
00137             {
00138               char* dir = lumiera_tmpbuf_strndup (name, PATH_MAX);
00139               char* slash = dir;
00140               while ((slash = strchr (slash+1, '/')))
00141                 {
00142                   *slash = '\0';
00143                   INFO (filedescriptor, "try creating dir: %s", dir);
00144                   if (mkdir (dir, 0777) == -1 && errno != EEXIST)
00145                     {
00146                       LUMIERA_ERROR_SET (filedescriptor, ERRNO);
00147                       goto error;
00148                     }
00149                   *slash = '/';
00150                 }
00151               int fd;
00152               INFO (filedescriptor, "try creating file: %s", name);
00153               fd = creat (name, 0777);
00154               if (fd == -1)
00155                 {
00156                   LUMIERA_ERROR_SET (filedescriptor, ERRNO);
00157                   goto error;
00158                 }
00159               close (fd);
00160               if (stat (name, &fdesc.stat) != 0)
00161                 {
00162                   /* finally, no luck */
00163                   LUMIERA_ERROR_SET (filedescriptor, ERRNO);
00164                   goto error;
00165                 }
00166             }
00167         }
00168 
00169       /* lookup/create descriptor */
00170       dest = (LumieraFiledescriptor) psplay_find (registry, &fdesc, 100);
00171 
00172       if (!dest)
00173         {
00174           TRACE (filedescriptor, "Descriptor not found");
00175 
00176           dest = lumiera_filedescriptor_new (&fdesc);
00177           if (!dest)
00178             goto error;
00179 
00180           psplay_insert (registry, &dest->node, 100);
00181         }
00182       else
00183         {
00184           TRACE (filedescriptor, "Descriptor already existing");
00185           ++dest->refcount;
00186         }
00187     error: ;
00188     }
00189 
00190   return dest;
00191 }

void lumiera_filedescriptor_release ( LumieraFiledescriptor  self  ) 

Release a filedescriptor.

Parameters:
self filedescriptor to be released

Definition at line 195 of file filedescriptor.c.

00196 {
00197   TRACE (filedescriptor, "%p", self);
00198   if (!--self->refcount)
00199     lumiera_filedescriptor_delete (self);
00200 }

LumieraFiledescriptor lumiera_filedescriptor_new ( LumieraFiledescriptor  template  ) 

Allocate a new filedescriptor cloned from a template.

Parameters:
template the source filedescriptor
Returns:
the constrccted filedescriptor

Definition at line 204 of file filedescriptor.c.

References lumiera_mutex_init().

00205 {
00206   LumieraFiledescriptor self = lumiera_malloc (sizeof (lumiera_filedescriptor));
00207   TRACE (filedescriptor, "at %p", self);
00208 
00209   psplaynode_init (&self->node);
00210   self->stat = template->stat;
00211 
00212   self->flags = template->flags;
00213   self->refcount = 1;
00214   self->handle = 0;
00215 
00216   lumiera_mutex_init (&self->lock, "filedescriptor", &NOBUG_FLAG (filedescriptor));
00217 
00218   return self;
00219 }

Here is the call graph for this function:

void lumiera_filedescriptor_delete ( LumieraFiledescriptor  self  ) 

Delete a filedescriptor Called whenever its reference count drops to zero.

Parameters:
self the filedescriptor to be deleted

Definition at line 223 of file filedescriptor.c.

References lumiera_free(), lumiera_mutex_destroy(), and LUMIERA_MUTEX_SECTION.

00224 {
00225   TRACE (filedescriptor, "%p", self);
00226 
00227   LUMIERA_MUTEX_SECTION (filedescriptor, &registry_mutex)
00228     {
00229       REQUIRE (self->refcount == 0);
00230 
00231       psplay_remove (registry, &self->node);
00232 
00233       TODO ("destruct other members (WIP)");
00234 
00235 
00236       TODO ("release filehandle");
00237 
00238       lumiera_mutex_destroy (&self->lock, &NOBUG_FLAG (filedescriptor));
00239       lumiera_free (self);
00240     }
00241 }

Here is the call graph for this function:


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