New type. (glibtop_backend_module): New private type.
2000-01-12 Martin Baulig <martin@home-of-linux.org> * include/glibtop/backend.h (glibtop_backend_entry): New type. (glibtop_backend_module): New private type. * lib/backend.c (glibtop_register_backend): This now takes a `glibtop_backend_entry' argument, not a `glibtop_backend_info' one. (glibtop_backend_by_id): Return a `glibtop_backend_entry' type, not a `glibtop_backend_info' one. (glibtop_backend_by_name): Likewise. * lib/init-backends.c: If we have libxml, read all `.backend' files in $(LIBGTOP_BACKEND_DIR), XML parse them and register them via `glibtop_backend_register'. This builds a list of all currently supported backends without actually loading them into memory. * lib/open-backend.c (glibtop_open_backend_l): GModule load the backend if it's not already in memory.
This commit is contained in:
committed by
Martin Baulig
parent
8d532c6298
commit
e2e5c3a1cc
@@ -29,14 +29,49 @@
|
||||
|
||||
#include <glibtop/backend.h>
|
||||
|
||||
#include <gmodule.h>
|
||||
|
||||
int
|
||||
glibtop_open_backend_l (glibtop *server, const char *backend_name,
|
||||
u_int64_t features, const char **backend_args)
|
||||
{
|
||||
glibtop_backend_entry *entry;
|
||||
glibtop_backend_info *info;
|
||||
glibtop_backend *backend;
|
||||
|
||||
info = glibtop_backend_by_name (backend_name);
|
||||
entry = glibtop_backend_by_name (backend_name);
|
||||
if (!entry) return -GLIBTOP_ERROR_NO_SUCH_BACKEND;
|
||||
|
||||
if (!entry->_priv) {
|
||||
entry->_priv = g_new0 (glibtop_backend_module, 1);
|
||||
|
||||
entry->_priv->module = g_module_open (entry->shlib_name,
|
||||
G_MODULE_BIND_LAZY);
|
||||
if (!entry->_priv->module) {
|
||||
glibtop_warn_r (server, "Cannot open shared library `%s' "
|
||||
"for backend `%s'", entry->shlib_name,
|
||||
entry->name);
|
||||
return -GLIBTOP_ERROR_NO_SUCH_BACKEND;
|
||||
}
|
||||
|
||||
if (!g_module_symbol (entry->_priv->module,
|
||||
"LibGTopBackendInfo",
|
||||
(gpointer*) &entry->info)) {
|
||||
glibtop_warn_r (server, "Library `%s' is not a valid "
|
||||
"LibGTop Backend library (start symbol not found)",
|
||||
entry->shlib_name);
|
||||
|
||||
g_module_close (entry->_priv->module);
|
||||
g_free (entry->_priv);
|
||||
entry->_priv = NULL;
|
||||
|
||||
return -GLIBTOP_ERROR_NO_SUCH_BACKEND;
|
||||
}
|
||||
|
||||
entry->_priv->refcount++;
|
||||
}
|
||||
|
||||
info = entry->info;
|
||||
if (!info) return -GLIBTOP_ERROR_NO_SUCH_BACKEND;
|
||||
|
||||
backend = glibtop_calloc_r (server, 1, sizeof (glibtop_backend));
|
||||
|
Reference in New Issue
Block a user