[Spice-devel] [PATCH spice-streaming-agent 2/2] explicit instead of static registration for built-in plugins

Lukáš Hrázký lhrazky at redhat.com
Tue Jan 30 11:19:23 UTC 2018


The static registration (that is, having a static list of pointers to
static plugin variables and calling a generic function in the main
initialization code path to register them) allows to add plugins without
registering each of them explicitly.

However, in a single codebase, and having very few plugins, there is
very little advantage to it and the tradeoff for the complexity of this
initialization is not worth it. A single call for every built-in plugin
is much more simple and clear.

Signed-off-by: Lukáš Hrázký <lhrazky at redhat.com>
---
 src/Makefile.am               |  2 --
 src/concrete-agent.cpp        |  3 ---
 src/mjpeg-fallback.cpp        |  6 +-----
 src/mjpeg-fallback.hpp        |  1 +
 src/spice-streaming-agent.cpp |  4 ++++
 src/static-plugin.cpp         | 23 -----------------------
 src/static-plugin.hpp         | 35 -----------------------------------
 7 files changed, 6 insertions(+), 68 deletions(-)
 delete mode 100644 src/static-plugin.cpp
 delete mode 100644 src/static-plugin.hpp

diff --git a/src/Makefile.am b/src/Makefile.am
index 8d5c5bd..590db1f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -49,8 +49,6 @@ spice_streaming_agent_LDADD = \
 
 spice_streaming_agent_SOURCES = \
 	spice-streaming-agent.cpp \
-	static-plugin.cpp \
-	static-plugin.hpp \
 	concrete-agent.cpp \
 	concrete-agent.hpp \
 	mjpeg-fallback.cpp \
diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp
index 873a69e..c69da43 100644
--- a/src/concrete-agent.cpp
+++ b/src/concrete-agent.cpp
@@ -11,7 +11,6 @@
 #include <dlfcn.h>
 
 #include "concrete-agent.hpp"
-#include "static-plugin.hpp"
 
 using namespace std;
 using namespace SpiceStreamingAgent;
@@ -58,8 +57,6 @@ void ConcreteAgent::AddOption(const char *name, const char *value)
 
 void ConcreteAgent::LoadPlugins(const string &directory)
 {
-    StaticPlugin::InitAll(*this);
-
     string pattern = directory + "/*.so";
     glob_t globbuf;
 
diff --git a/src/mjpeg-fallback.cpp b/src/mjpeg-fallback.cpp
index fac34bc..7aaa355 100644
--- a/src/mjpeg-fallback.cpp
+++ b/src/mjpeg-fallback.cpp
@@ -15,7 +15,6 @@
 #include <syslog.h>
 #include <X11/Xlib.h>
 
-#include "static-plugin.hpp"
 #include "jpeg.hpp"
 
 using namespace std;
@@ -191,8 +190,7 @@ SpiceVideoCodecType MjpegPlugin::VideoCodecType() const {
     return SPICE_VIDEO_CODEC_TYPE_MJPEG;
 }
 
-static bool
-mjpeg_plugin_init(Agent* agent)
+bool MjpegPlugin::Register(Agent* agent)
 {
     if (agent->Version() != PluginVersion)
         return false;
@@ -205,5 +203,3 @@ mjpeg_plugin_init(Agent* agent)
 
     return true;
 }
-
-static StaticPlugin mjpeg_plugin(mjpeg_plugin_init);
diff --git a/src/mjpeg-fallback.hpp b/src/mjpeg-fallback.hpp
index 8044244..0e9ed6a 100644
--- a/src/mjpeg-fallback.hpp
+++ b/src/mjpeg-fallback.hpp
@@ -25,6 +25,7 @@ public:
     unsigned Rank() override;
     void ParseOptions(const ConfigureOption *options);
     SpiceVideoCodecType VideoCodecType() const;
+    static bool Register(Agent* agent);
 private:
     MjpegSettings settings = { 10, 80 };
 };
diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
index 94d9d25..8458975 100644
--- a/src/spice-streaming-agent.cpp
+++ b/src/spice-streaming-agent.cpp
@@ -34,6 +34,7 @@
 
 #include "hexdump.h"
 #include "concrete-agent.hpp"
+#include "mjpeg-fallback.hpp"
 
 using namespace std;
 using namespace SpiceStreamingAgent;
@@ -489,6 +490,9 @@ int main(int argc, char* argv[])
         }
     }
 
+    // register built-in plugins
+    MjpegPlugin::Register(&agent);
+
     agent.LoadPlugins(PLUGINSDIR);
 
     register_interrupts();
diff --git a/src/static-plugin.cpp b/src/static-plugin.cpp
deleted file mode 100644
index d5feb22..0000000
--- a/src/static-plugin.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Utility to manage registration of plugins compiled statically
- *
- * \copyright
- * Copyright 2017 Red Hat Inc. All rights reserved.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include "static-plugin.hpp"
-
-using namespace SpiceStreamingAgent;
-
-const StaticPlugin *StaticPlugin::list = nullptr;
-
-void StaticPlugin::InitAll(Agent& agent)
-{
-    for (const StaticPlugin* plugin = list; plugin; plugin = plugin->next) {
-        plugin->init_func(&agent);
-    }
-}
diff --git a/src/static-plugin.hpp b/src/static-plugin.hpp
deleted file mode 100644
index 5436b41..0000000
--- a/src/static-plugin.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Utility to manage registration of plugins compiled statically
- *
- * \copyright
- * Copyright 2017 Red Hat Inc. All rights reserved.
- */
-#ifndef SPICE_STREAMING_AGENT_STATIC_PLUGIN_HPP
-#define SPICE_STREAMING_AGENT_STATIC_PLUGIN_HPP
-
-#include <spice-streaming-agent/plugin.hpp>
-
-namespace SpiceStreamingAgent {
-
-class StaticPlugin final {
-public:
-    StaticPlugin(PluginInitFunc init_func):
-        next(list),
-        init_func(init_func)
-    {
-        list = this;
-    }
-    static void InitAll(Agent& agent);
-private:
-    // this should be instantiated statically
-    void *operator new(size_t s);
-    void *operator new[](size_t s);
-
-    const StaticPlugin *const next;
-    const PluginInitFunc* const init_func;
-
-    static const StaticPlugin *list;
-};
-
-}
-
-#endif // SPICE_STREAMING_AGENT_STATIC_PLUGIN_HPP
-- 
2.16.1



More information about the Spice-devel mailing list