52 TRACE (interface,
"%s", name);
53 WARN_IF (version == 0, interface,
"opening experimental interface: %s_%d_%s", interface, version, name);
61 UNIMPLEMENTED (
"query plugindb and load plugin if exists");
66 if (minminorversion > self->interface->size)
68 UNIMPLEMENTED (
"set error");
77 return self->interface;
85 TRACE (interface_dbg,
"%s %s", parent->interface->name, child->interface->name);
88 if (!parent->deps_size)
91 size_t sz = parent->deps_size;
101 sz = parent->deps_size + 1;
102 parent->deps_size *= 2;
104 itr = parent->deps + sz - 2;
120 TRACE (interface_dbg,
"%s %d", self->interface->name, self->refcnt);
123 TRACE (interface_dbg,
"loop %s", (*dep)->interface->name);
129 TRACE (interface_dbg,
"CYCLE");
140 (*dep)->lnk = *stack;
145 *stack = (*dep)->lnk;
156 static unsigned collect_dependencies = 0;
166 TRACE (interface_dbg,
"%s %d (%s)", self->interface->name, self->refcnt, stack?stack->interface->name:
"");
177 TRACE (interface_dbg,
"CYCLE");
184 if (collect_dependencies)
195 int collect_dependencies_bak = collect_dependencies;
197 if (self->refcnt == 1)
200 if (self->interface->acquire)
202 TRACE (interface_dbg,
"Acquire %s", self->interface->name);
203 collect_dependencies = self->deps?0:1;
210 collect_dependencies = 0;
214 collect_dependencies = collect_dependencies_bak;
228 TRACE (interface_dbg);
240 if (self && iname && !strcmp (self->interface, iname))
241 return self->version;
256 TRACE (interface,
"%s %d (%s)", self->interface->name, self->refcnt, stack?stack->interface->name:
"");
258 REQUIRE (self->refcnt);
266 TRACE (interface_dbg,
"CYCLE");
277 if (self->refcnt == 1)
279 if (self->interface->release)
281 TRACE (interface_dbg,
"Release %s", self->interface->name);
282 self->interface->release (self->interface);
289 TRACE (interface_dbg,
"Recurse %s %d", self->interface->name, self->refcnt);
310 LUMIERA_INTERFACE_DEFINE (lumieraorg_interface, 0,
311 lumieraorg_interface,
315 LUMIERA_INTERFACE_MAP (open,
317 LUMIERA_INTERFACE_MAP (close,
319 LUMIERA_INTERFACE_MAP (version,
LumieraInterface lumiera_interface_open(const char *interface, unsigned version, size_t minminorversion, const char *name)
Open an interface by version and name.
static void lumiera_interfacenode_close(LumieraInterfacenode self)
static LumieraInterfacenode lumiera_interface_open_interfacenode(LumieraInterfacenode self)
void lumiera_interface_destroy(void)
deregistering implementations of the above interface
void lumiera_interface_close(LumieraInterface self)
Close an interface after use.
unsigned lumiera_interface_version(LumieraInterface self, const char *iname)
Runtime check for interface type and version.
static void depwalk(LumieraInterfacenode self, LumieraInterfacenode *stack)
LumieraInterface lumiera_interface_interface
the mother of all interfaces
static void push_dependency(LumieraInterfacenode parent, LumieraInterfacenode child)
Lumiera interface macros and structures.
#define LUMIERA_INTERFACE_UNREGISTEREXPORTED
Unregister all exported interfaces when not a plugin This is a no-op when LUMIERA_PLUGIN is defined,...
#define LUMIERA_EXPORT(...)
Generate interface container suitable for enumerating interfaces.
#define LUMIERA_INTERFACE_REGISTEREXPORTED
Register all exported interfaces when not a plugin This is a no-op when LUMIERA_PLUGIN is defined,...
lumiera_interface * LumieraInterface
void lumiera_interface_init(void)
registering implementations of the above interface
LumieraInterfacenode lumiera_interfaceregistry_interfacenode_find(const char *interface, unsigned version, const char *name)
lumiera_recmutex lumiera_interface_mutex
PSplay lumiera_interfaceregistry
Global registry for interfaces (extension points).
lumiera_interfacenode * LumieraInterfacenode
This header is for including and configuring NoBug.
void lumiera_plugin_refdec(LumieraPlugin self)
void lumiera_plugin_refinc(LumieraPlugin self)
Lumiera plugins define 'interfaces' as shown in interface.h, the plugin system handles the loading of...
PSplaynode psplay_find(PSplay self, const void *key, int splayfactor)
Find a element in a splay tree.
Mutual exclusion locking, header.
#define LUMIERA_RECMUTEX_SECTION(nobugflag, mtx)
Recursive Mutual exclusive section.
void * lumiera_calloc(size_t n, size_t size)
Allocate cleared memory for an array.
void * lumiera_realloc(void *ptr, size_t size)
Change the size of a memory block.
Portable and safe wrappers around some C-Lib functions.