qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>
Subject: [PATCH 10/14] modules: dependencies infrastructure
Date: Mon, 19 Oct 2020 09:52:20 +0200	[thread overview]
Message-ID: <20201019075224.14803-11-kraxel@redhat.com> (raw)
In-Reply-To: <20201019075224.14803-1-kraxel@redhat.com>

Allow modules depending on other modules.

module_load_file() gets the option to export symbols (by not adding the
G_MODULE_BIND_LOCAL flag).

module_load_one() will check the module dependency list to figure (a)
whenever are other modules must be loaded first, or (b) the module
should export the symbols.

The dependencies are specificed as static list in the source code for
now as I expect the list will stay small.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 util/module.c | 32 +++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/util/module.c b/util/module.c
index f0ed05fbd06b..0c0f258923dc 100644
--- a/util/module.c
+++ b/util/module.c
@@ -110,7 +110,7 @@ void module_call_init(module_init_type type)
 }
 
 #ifdef CONFIG_MODULES
-static int module_load_file(const char *fname, bool mayfail)
+static int module_load_file(const char *fname, bool mayfail, bool export_symbols)
 {
     GModule *g_module;
     void (*sym)(void);
@@ -118,7 +118,7 @@ static int module_load_file(const char *fname, bool mayfail)
     int len = strlen(fname);
     int suf_len = strlen(dsosuf);
     ModuleEntry *e, *next;
-    int ret;
+    int ret, flags;
 
     if (len <= suf_len || strcmp(&fname[len - suf_len], dsosuf)) {
         /* wrong suffix */
@@ -132,7 +132,11 @@ static int module_load_file(const char *fname, bool mayfail)
 
     assert(QTAILQ_EMPTY(&dso_init_list));
 
-    g_module = g_module_open(fname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+    flags = G_MODULE_BIND_LAZY;
+    if (!export_symbols) {
+        flags |= G_MODULE_BIND_LOCAL;
+    }
+    g_module = g_module_open(fname, flags);
     if (!g_module) {
         if (!mayfail) {
             fprintf(stderr, "Failed to open module: %s\n",
@@ -167,6 +171,12 @@ static int module_load_file(const char *fname, bool mayfail)
 out:
     return ret;
 }
+
+static const struct {
+    const char *name;
+    const char *dep;
+} module_deps[] = {
+};
 #endif
 
 bool module_load_one(const char *prefix, const char *lib_name, bool mayfail)
@@ -182,7 +192,8 @@ bool module_load_one(const char *prefix, const char *lib_name, bool mayfail)
     char *dirs[5];
     char *module_name;
     int i = 0, n_dirs = 0;
-    int ret;
+    int ret, dep;
+    bool export_symbols = false;
     static GHashTable *loaded_modules;
 
     if (!g_module_supported()) {
@@ -196,6 +207,17 @@ bool module_load_one(const char *prefix, const char *lib_name, bool mayfail)
 
     module_name = g_strdup_printf("%s%s", prefix, lib_name);
 
+    for (dep = 0; dep < ARRAY_SIZE(module_deps); dep++) {
+        if (strcmp(module_name, module_deps[dep].name) == 0) {
+            /* we depend on another module */
+            module_load_one("", module_deps[dep].dep, false);
+        }
+        if (strcmp(module_name, module_deps[dep].dep) == 0) {
+            /* another module depends on us */
+            export_symbols = true;
+        }
+    }
+
     if (!g_hash_table_add(loaded_modules, module_name)) {
         g_free(module_name);
         return true;
@@ -220,7 +242,7 @@ bool module_load_one(const char *prefix, const char *lib_name, bool mayfail)
     for (i = 0; i < n_dirs; i++) {
         fname = g_strdup_printf("%s/%s%s",
                 dirs[i], module_name, CONFIG_HOST_DSOSUF);
-        ret = module_load_file(fname, mayfail);
+        ret = module_load_file(fname, mayfail, export_symbols);
         g_free(fname);
         fname = NULL;
         /* Try loading until loaded a module file */
-- 
2.27.0



  parent reply	other threads:[~2020-10-19  8:06 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-19  7:52 [PATCH 00/14] ui: build spice and opengl as module Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 01/14] spice: add module helpers Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 02/14] spice: add QemuSpiceOps, move migrate_info Gerd Hoffmann
2020-10-19 10:17   ` Dr. David Alan Gilbert
2020-10-19  7:52 ` [PATCH 03/14] spice: move qemu_spice_init() to QemuSpiceOps Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 04/14] spice: move display_init() " Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 05/14] spice: move add_interface() " Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 06/14] spice: move auth functions " Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 07/14] spice: move display_add_client() " Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 08/14] spice: wire up monitor in QemuSpiceOps Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 09/14] spice: load module when enabled on the cmdline Gerd Hoffmann
2020-10-19  7:52 ` Gerd Hoffmann [this message]
2020-10-19  7:52 ` [PATCH 11/14] modules: add spice dependencies Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 12/14] spice: flip modules switch Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 13/14] opengl: build egl-headless display modular Gerd Hoffmann
2020-10-19  7:52 ` [PATCH 14/14] opengl: build opengl helper code modular Gerd Hoffmann
2020-10-20  9:59 ` [PATCH 00/14] ui: build spice and opengl as module Marc-André Lureau
2020-10-26 16:27 ` Bruce Rogers
2020-10-27  5:58   ` Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201019075224.14803-11-kraxel@redhat.com \
    --to=kraxel@redhat.com \
    --cc=armbru@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).