[Spice-devel] [PATCH spice-streaming-agent] Add support log logging statistics from plugins

Frediano Ziglio fziglio at redhat.com
Wed Mar 20 16:24:57 UTC 2019


Allows the plugins to add information to the log.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
Not entirely happy to export a kind of C function, any suggestion
welcome
---
 include/spice-streaming-agent/plugin.hpp |  5 +++++
 src/concrete-agent.cpp                   | 16 ++++++++++++++--
 src/concrete-agent.hpp                   |  6 ++++++
 src/frame-log.cpp                        |  9 +++++++++
 src/frame-log.hpp                        |  2 ++
 src/spice-streaming-agent.cpp            |  8 ++++++--
 6 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/include/spice-streaming-agent/plugin.hpp b/include/spice-streaming-agent/plugin.hpp
index 3b265d9..a51f060 100644
--- a/include/spice-streaming-agent/plugin.hpp
+++ b/include/spice-streaming-agent/plugin.hpp
@@ -116,6 +116,11 @@ public:
      * \todo passing options to entry point instead?
      */
     virtual const ConfigureOption* Options() const = 0;
+    /*!
+     * Write something in the log.
+     */
+    __attribute__ ((format (printf, 2, 3)))
+    virtual void LogStat(const char* format, ...) = 0;
 };
 
 typedef bool PluginInitFunc(spice::streaming_agent::Agent* agent);
diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp
index f94aead..d279656 100644
--- a/src/concrete-agent.cpp
+++ b/src/concrete-agent.cpp
@@ -5,13 +5,15 @@
  */
 
 #include <config.h>
+#include "concrete-agent.hpp"
+#include "frame-log.hpp"
+
 #include <algorithm>
 #include <syslog.h>
 #include <glob.h>
 #include <dlfcn.h>
 #include <string>
-
-#include "concrete-agent.hpp"
+#include <cstdarg>
 
 using namespace spice::streaming_agent;
 
@@ -145,3 +147,13 @@ FrameCapture *ConcreteAgent::GetBestFrameCapture(const std::set<SpiceVideoCodecT
     }
     return nullptr;
 }
+
+void ConcreteAgent::LogStat(const char* format, ...)
+{
+    if (logger) {
+        va_list ap;
+        va_start(ap, format);
+        logger->log_statv(format, ap);
+        va_end(ap);
+    }
+}
diff --git a/src/concrete-agent.hpp b/src/concrete-agent.hpp
index 99dcf54..aa4d6aa 100644
--- a/src/concrete-agent.hpp
+++ b/src/concrete-agent.hpp
@@ -14,6 +14,8 @@
 namespace spice {
 namespace streaming_agent {
 
+class FrameLog;
+
 struct ConcreteConfigureOption: ConfigureOption
 {
     ConcreteConfigureOption(const char *name, const char *value)
@@ -33,11 +35,15 @@ public:
     // pointer must remain valid
     void AddOption(const char *name, const char *value);
     FrameCapture *GetBestFrameCapture(const std::set<SpiceVideoCodecType>& codecs);
+    void SetFrameLog(FrameLog *logger) { this->logger = logger; }
+    __attribute__ ((format (printf, 2, 3)))
+    void LogStat(const char* format, ...) override;
 private:
     bool PluginVersionIsCompatible(unsigned pluginVersion) const;
     void LoadPlugin(const std::string &plugin_filename);
     std::vector<std::shared_ptr<Plugin>> plugins;
     std::vector<ConcreteConfigureOption> options;
+    FrameLog *logger = nullptr;
 };
 
 }} // namespace spice::streaming_agent
diff --git a/src/frame-log.cpp b/src/frame-log.cpp
index 62fffc3..db6b652 100644
--- a/src/frame-log.cpp
+++ b/src/frame-log.cpp
@@ -52,6 +52,15 @@ void FrameLog::log_stat(const char* format, ...)
     }
 }
 
+void FrameLog::log_statv(const char* format, va_list ap)
+{
+    if (log_file) {
+        fprintf(log_file, "%" PRIu64 ": ", get_time());
+        vfprintf(log_file, format, ap);
+        fputc('\n', log_file);
+    }
+}
+
 void FrameLog::log_frame(const void* buffer, size_t buffer_size)
 {
     if (log_file) {
diff --git a/src/frame-log.hpp b/src/frame-log.hpp
index 8503345..a104723 100644
--- a/src/frame-log.hpp
+++ b/src/frame-log.hpp
@@ -24,6 +24,8 @@ public:
 
     __attribute__ ((format (printf, 2, 3)))
     void log_stat(const char* format, ...);
+    __attribute__ ((format (printf, 2, 0)))
+    void log_statv(const char* format, va_list ap);
     void log_frame(const void* buffer, size_t buffer_size);
 
     static uint64_t get_time();
diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
index 9507a54..f262118 100644
--- a/src/spice-streaming-agent.cpp
+++ b/src/spice-streaming-agent.cpp
@@ -401,13 +401,15 @@ int main(int argc, char* argv[])
     register_interrupts();
 
     try {
+        FrameLog frame_log(log_filename, log_binary, log_frames);
+
+        agent.SetFrameLog(&frame_log);
+
         // register built-in plugins
         MjpegPlugin::Register(&agent);
 
         agent.LoadPlugins(pluginsdir);
 
-        FrameLog frame_log(log_filename, log_binary, log_frames);
-
         for (const std::string& arg: old_args) {
             frame_log.log_stat("Args: %s", arg.c_str());
         }
@@ -419,8 +421,10 @@ int main(int argc, char* argv[])
         cursor_updater.detach();
 
         do_capture(stream_port, frame_log);
+        agent.SetFrameLog(nullptr);
     }
     catch (std::exception &err) {
+        agent.SetFrameLog(nullptr);
         syslog(LOG_ERR, "%s", err.what());
         return EXIT_FAILURE;
     }
-- 
2.20.1



More information about the Spice-devel mailing list