[Spice-devel] [PATCH 00/22] streaming-agent: C++ refactoring

Christophe de Dinechin christophe at dinechin.org
Wed Feb 28 15:43:03 UTC 2018


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
- Create exception handling classes dealing with exception
  identification and message formatting
- Puts message formatting and writing in a template Message class
- Isolate what's specific to each message in four derived classes
- Isolate X11-specific code in separate classes, one for cursor messages,
  one for the thread polling the data.

Changes since WIP:

- Took into account the many comments on the WIP
  (if I forgot any, my apologies, let me know)
- Finished the error handling work, extended to all 'throw' points
- Avoid any allocation in exception handling (and made it noexcept)
- Split X11 cursor class into two classes, "updater" and "thread"
- Added final patches to move the classes in separate files
- Tested with both MJPEG and H264 encoders, verified cursor fix
- Tested exception handling and message reporting

Christophe de Dinechin (22):
  Eliminate signed/unsigned warning
  Reorder headers according to style guide
  Reformat 'if' statments according to style guide
  Use RAII to cleanup stream in case of exception or return
  Replace C-style initialization with shorter C++-style
  Get rid of C-style memset initializations, use C++ style aggregates
  Since we use a namespace, simplify name of local classes
  Use C++ style for cursor message initialization instead of C style
  Move read, write, handle and locking into the 'Stream' class
  Remove client_codecs global variable, moved inside the 'Stream' class
  Make streaming_requested a method in Stream
  Add exception handling classes
  Convert message writing from C style to C++ style
  Create classes encapsulating the X11 display cursor capture
  Create FrameLog class to encapsulate logging of frames
  Move the capture loop in the ConcreteAgent
  Catch all std::exception derivatives
  Convert existing std::runtime_error to the new Error classes
  Put Stream and Message classes in separate files
  Move the X11CursorUpdater and X11CursorThread classes in a separate
    file
  Moving FrameLog into a separate file
  Move capture loop into concrete-agent.cpp

 include/spice-streaming-agent/Makefile.am |   2 +-
 include/spice-streaming-agent/errors.hpp  |  95 +++++++
 src/Makefile.am                           |   7 +
 src/concrete-agent.cpp                    | 106 ++++++-
 src/concrete-agent.hpp                    |   4 +
 src/errors.cpp                            |  74 +++++
 src/frame-log.cpp                         |  45 +++
 src/frame-log.hpp                         |  43 +++
 src/message.hpp                           |  43 +++
 src/mjpeg-fallback.cpp                    |  12 +-
 src/spice-streaming-agent.cpp             | 451 ++----------------------------
 src/stream.cpp                            | 172 ++++++++++++
 src/stream.hpp                            |  55 ++++
 src/unittests/Makefile.am                 |   1 +
 src/unittests/test-mjpeg-fallback.cpp     |   4 +-
 src/x11-cursor.cpp                        |  65 +++++
 src/x11-cursor.hpp                        |  91 ++++++
 17 files changed, 840 insertions(+), 430 deletions(-)
 create mode 100644 include/spice-streaming-agent/errors.hpp
 create mode 100644 src/errors.cpp
 create mode 100644 src/frame-log.cpp
 create mode 100644 src/frame-log.hpp
 create mode 100644 src/message.hpp
 create mode 100644 src/stream.cpp
 create mode 100644 src/stream.hpp
 create mode 100644 src/x11-cursor.cpp
 create mode 100644 src/x11-cursor.hpp

-- 
2.13.5 (Apple Git-94)



More information about the Spice-devel mailing list