filedescriptor cleanup and fixes

basically working now, flag masking is not complete yet.
This commit is contained in:
Christian Thaeter 2008-04-08 07:46:25 +02:00
parent 232afe77e9
commit dd63a0e190
3 changed files with 63 additions and 32 deletions

View file

@ -110,54 +110,48 @@ lumiera_filedescriptor_registry_destroy (void)
LumieraFiledescriptor
lumiera_filedescriptor_acquire (const char* name, int flags)
{
TRACE (filedescriptor);
TRACE (filedescriptor, "%s", name);
REQUIRE (registry, "not initialized");
UNCHECKED;
lumiera_mutexacquirer registry_lock;
lumiera_mutexacquirer_init_mutex (&registry_lock, &registry_mutex, LUMIERA_LOCKED);
lumiera_filedescriptor fdesc;
fdesc.flags = flags&LUMIERA_FILE_MASK;
for (int retry = 0; !retry; ++retry)
if (stat (name, &fdesc.stat) != 0)
{
if (stat (name, &fdesc.stat) == 0)
break;
else
if (errno == ENOENT && flags&O_CREAT)
{
if (errno == ENOENT && flags&O_CREAT)
char* dir = lumiera_tmpbuf_strndup (name, PATH_MAX);
char* slash = dir;
while ((slash = strchr (slash+1, '/')))
{
INFO (filedescriptor, "try creating file: %s %d", name, PATH_MAX);
char* dir = lumiera_tmpbuf_strndup (name, PATH_MAX);
char* slash = dir;
while ((slash = strchr (slash+1, '/')))
{
*slash = '\0';
INFO (filedescriptor, "try creating dir: %s", dir);
if (mkdir (dir, 0777) == -1)
{
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
*slash = '/';
}
int fd;
INFO (filedescriptor, "try creating file: %s", name);
fd = creat (name, 0777);
if (fd == -1)
*slash = '\0';
INFO (filedescriptor, "try creating dir: %s", dir);
if (mkdir (dir, 0777) == -1 && errno != EEXIST)
{
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
close (fd);
continue; /* will now retry the fstat once */
*slash = '/';
}
int fd;
INFO (filedescriptor, "try creating file: %s", name);
fd = creat (name, 0777);
if (fd == -1)
{
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
close (fd);
if (stat (name, &fdesc.stat) != 0)
{
/* finally, no luck */
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
}
/* finally, no luck */
LUMIERA_ERROR_SET (filedescriptor, ERRNO);
goto efile;
}
/* lookup/create descriptor */

View file

@ -5,3 +5,9 @@ TESTING "Filehandle management" ./test-filehandles
TEST "basic filehandle usage" basic <<END
return: 0
END
rm -rf ,tmpdir
TEST "using many filehandles" more <<END
return: 0
END

View file

@ -21,6 +21,7 @@
#define _GNU_SOURCE
#include "lib/llist.h"
#include "lib/safeclib.h"
#include "backend/backend.h"
#include "backend/filehandlecache.h"
@ -52,6 +53,36 @@ TEST ("basic")
TEST ("more")
{
lumiera_backend_init ();
LumieraFile files[100];
int fds[100];
/*create 100 files*/
for (int i=0; i<100; ++i)
{
files[i]= lumiera_file_new (lumiera_tmpbuf_snprintf (256, ",tmpdir/testfile%d", i), LUMIERA_FILE_CREATE);
}
/* get the filehandles, this gross overallocates filehandles */
for (int i=0; i<100; ++i)
{
fds[i] = lumiera_file_handle_acquire (files[i]);
ENSURE (fds[i] > -1);
printf ("got filehandle #%d\n", fds[i]);
}
/* put them into aging, can't use anymore */
for (int i=0; i<100; ++i)
{
lumiera_file_handle_release (files[i]);
}
/* cleanup */
for (int i=0; i<100; ++i)
{
lumiera_file_delete (files[i]);
}
lumiera_backend_destroy ();
}