Filedescriptor updates
* make registry initialization singleton, no parameters. * remove registry init from all functions, has to be called explicitly. * some nobug improvements
This commit is contained in:
parent
bb98bb434b
commit
b11ff40fbe
2 changed files with 23 additions and 19 deletions
|
|
@ -31,7 +31,7 @@
|
|||
#include <unistd.h>
|
||||
|
||||
|
||||
NOBUG_DEFINE_FLAG (filedescriptor);
|
||||
NOBUG_DEFINE_FLAG_PARENT (filedescriptor, file_all);
|
||||
|
||||
/*
|
||||
Filedescriptor registry
|
||||
|
|
@ -74,26 +74,28 @@ cmp (const void* keya, const void* keyb)
|
|||
return a->stat.st_dev == b->stat.st_dev && a->stat.st_ino == b->stat.st_ino && a->flags == b->flags;
|
||||
}
|
||||
|
||||
static Cuckoo
|
||||
lumiera_filedescriptor_registry_new (void)
|
||||
void
|
||||
lumiera_filedescriptor_registry_init (void)
|
||||
{
|
||||
NOBUG_INIT_FLAG (filedescriptor);
|
||||
TRACE (filedescriptor);
|
||||
|
||||
Cuckoo registry = cuckoo_new (h1, h2, h3, cmp,
|
||||
sizeof (LumieraFiledescriptor),
|
||||
3);
|
||||
registry = cuckoo_new (h1, h2, h3, cmp,
|
||||
sizeof (LumieraFiledescriptor),
|
||||
3);
|
||||
if (!registry)
|
||||
LUMIERA_DIE (NO_MEMORY);
|
||||
|
||||
return registry;
|
||||
}
|
||||
|
||||
static void
|
||||
lumiera_filedescriptor_registry_delete (void)
|
||||
void
|
||||
lumiera_filedescriptor_registry_destroy (void)
|
||||
{
|
||||
TRACE (filedescriptor);
|
||||
REQUIRE (!cuckoo_nelements (registry));
|
||||
cuckoo_free (registry);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Find existing filedescriptor or create one
|
||||
* @param descriptor strong reference to be initialized with the filedescriptor,
|
||||
|
|
@ -106,18 +108,13 @@ LumieraFiledescriptor
|
|||
lumiera_filedescriptor_acquire (const char* name, int flags)
|
||||
{
|
||||
TRACE (filedescriptor);
|
||||
REQUIRE (registry, "not initialized");
|
||||
UNCHECKED;
|
||||
lumiera_mutexacquirer registry_lock;
|
||||
lumiera_mutexacquirer_init_mutex (®istry_lock, ®istry_mutex, LUMIERA_LOCKED);
|
||||
|
||||
if (!registry)
|
||||
{
|
||||
registry = lumiera_filedescriptor_registry_new ();
|
||||
atexit (lumiera_filedescriptor_registry_delete);
|
||||
}
|
||||
|
||||
lumiera_filedescriptor fdesc;
|
||||
fdesc.flags = flags;
|
||||
fdesc.flags = flags&LUMIERA_FILE_MASK;
|
||||
|
||||
for (int retry = 0; !retry; ++retry)
|
||||
{
|
||||
|
|
@ -216,7 +213,10 @@ lumiera_filedescriptor_new (LumieraFiledescriptor template)
|
|||
self->refcount = 1;
|
||||
self->handle = 0;
|
||||
|
||||
RESOURCE_ANNOUNCE (filedescriptor, "mutex", "filedescriptor", self, self->rh);
|
||||
const char* type = "mutex";
|
||||
const char* name = "filedescriptor";
|
||||
|
||||
RESOURCE_ANNOUNCE (filedescriptor, type, name, self, self->rh);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,11 @@ struct lumiera_filedescriptor_struct
|
|||
RESOURCE_HANDLE (rh);
|
||||
};
|
||||
|
||||
void
|
||||
lumiera_filedescriptor_registry_init (void);
|
||||
|
||||
void
|
||||
lumiera_filedescriptor_registry_destroy (void);
|
||||
|
||||
LumieraFiledescriptor
|
||||
lumiera_filedescriptor_acquire (const char* name, int flags);
|
||||
|
|
@ -65,5 +70,4 @@ lumiera_filedescriptor_new (LumieraFiledescriptor template);
|
|||
void
|
||||
lumiera_filedescriptor_delete (LumieraFiledescriptor self);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in a new issue