filedescriptor cleanup and fixes
basically working now, flag masking is not complete yet.
This commit is contained in:
parent
232afe77e9
commit
dd63a0e190
3 changed files with 63 additions and 32 deletions
|
|
@ -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 (®istry_lock, ®istry_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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue