[Spice-devel] [PATCH spice-streaming-agent] Add support log logging statistics from plugins
Frediano Ziglio
fziglio at redhat.com
Thu Apr 25 09:42:22 UTC 2019
ping 2
>
> ping
>
> >
> > 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;
> > }
More information about the Spice-devel
mailing list