[Spice-devel] [PATCH 00/17] WIP: Refactor the streaming agent towards a more standard C++ style
Lukáš Hrázký
lhrazky at redhat.com
Mon Feb 19 17:29:07 UTC 2018
On Fri, 2018-02-16 at 17:15 +0100, Christophe de Dinechin wrote:
> From: Christophe de Dinechin <dinechin at redhat.com>
>
> The streaming agent started as C code. This series converts
> the style to something that is more usual for C++, notably:
>
> - Adds encapsulation and RAII for resources such as the stream
> - Splits functionality into several classes with clear roles
> - Puts message formatting and writing in a reused based class
> - Isolate what's specific to each message in three derived classes
> - Isolate X11-specific code in separate classes, one for cursor messages,
> one for the thread polling the data.
>
> Reasons for marking this WIP:
>
> 1. This series is, unfortunately, not correctly tested, because on my
> machine, I currently have a black screen with the 'master' streaming
> agent, server, protocol, common, plugin and spicy. Fallback to MJPEG
> leads to a large repetition of messages like:
>
> (spicy:4217): GSpice-CRITICAL **: need more input data
>
> What I have tested using the -d option is that the syslog output
> from the agent looks similar (size of data captured, etc) relative
> to master both for the MJPEG plugin and with fallback. But without
> a picture, I am still concerned about the lack of testing.
Christophe already knows, but in case anyone will benefit from this,
it's the incomplete frame bug, fix should be on the ML here:
[Spice-devel] [PATCH spice-server 8/8] stream-channel: Send the full
frame in a single message
Christophe, I've tested your patches, it's streaming, but the cursor
disappears after a while, so something's not entirely right.
> 2. The classes were isolated, but not moved in separate headers. This
> is intentional. I prefer to make sure that the changes on the code
> are agreed on before we move the individual classes to their own
> headers. It thinks it will also faclitate history browsing
I'd like to point out the classes are not entirely isolated, there is
still the static bool streaming_requested (besides the necessary
quit_requested, although I have an idea for that), which ties together
the ConcreteAgent::CaptureLoop and Stream::read_command_from_device.
I have an unfinished patch for this, which will need heavy rebasing. In
case you are/will be looking into it, Christophe, let me know.
Lukas
> 3. This series compiles without warnings both with GCC in C++11 mode
> and by clang in gnu++11 mode. However, Frediano pointed out that it
> uses a designated intiializer syntax that is presently a GNU
> extension (the C99 designated initializer syntax). We may consider
> it a problem or not. If it's a problem, it's sufficient to remove
> the designators, but I think they add to readability.
>
> 4. Our current configure.ac requires a warning if all initializers are
> not present. Since padding was made explicit in the protocol, this
> requires the code to initialize padding fields, which I don't like.
>
> 5. The series integrates off-topic patches sent in a separate series, but
> which are necessary to successfully build with both clang and gcc.
>
> This series can also be browsed at
> https://gitlab.com/c3d/spice-streaming-agent/merge_requests/1/commits
>
> Christophe de Dinechin (17):
> Add missing <string> header
> log_binary is really a boolean
> Eliminate signed/unsigned warning
> Do not create std::string for constants
> Use RAII to cleanup stream in case of exception or return
> Replace inefficient C-style initialization with C++-style
> Get rid of C-style memset initializations, use C++ style aggregates
> Use C++ style for cursor message initialization instead of C style
> Reorder headers according to style guide
> Since we use a namespace, simplify name of local classes
> Move read, write and locking into the 'Stream' class
> Convert message writing from C style to C++ style
> Add more meaningful syslog reporting
> Create a class encapsulating the X11 display cursor capture
> Create FrameLog class to abstract logging of frames
> Remove client_codecs global variable, moved inside the 'Stream' class
> Move the capture loop in the ConcreteAgent, get rid of global agent
> variable
>
> src/concrete-agent.cpp | 1 +
> src/concrete-agent.hpp | 4 +
> src/mjpeg-fallback.cpp | 2 +-
> src/spice-streaming-agent.cpp | 521 +++++++++++++++++++++++++-----------------
> 4 files changed, 311 insertions(+), 217 deletions(-)
>
More information about the Spice-devel
mailing list