On Wed, Nov 08, 2017 at 03:02:35PM +0000, Frediano Ziglio wrote: > This better integrate with exceptions. > Also don't leak resources using a return in the middle of the > code. > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > src/Makefile.am | 1 + > src/defer.hpp | 16 ++++++++++++++++ > src/spice-streaming-agent.cpp | 16 ++++++++-------- > 3 files changed, 25 insertions(+), 8 deletions(-) > create mode 100644 src/defer.hpp > > diff --git a/src/Makefile.am b/src/Makefile.am > index 8d5c5bd..ec1969a 100644 > --- a/src/Makefile.am > +++ b/src/Makefile.am > @@ -56,4 +56,5 @@ spice_streaming_agent_SOURCES = \ > mjpeg-fallback.cpp \ > jpeg.cpp \ > jpeg.hpp \ > + defer.hpp \ > $(NULL) > diff --git a/src/defer.hpp b/src/defer.hpp > new file mode 100644 > index 0000000..93931fe > --- /dev/null > +++ b/src/defer.hpp > @@ -0,0 +1,16 @@ > +// see https://stackoverflow.com/questions/32432450/what-is-standard-defer-finalizer-implementation-in-c Is there any license associated with that code snippet? Christophe > +#ifndef defer > +template <class F> struct deferrer > +{ > + F f; > + ~deferrer() { f(); } > +}; > +struct defer_dummy {}; > +template <class F> inline deferrer<F> operator*(defer_dummy, F f) > +{ > + return {f}; > +} > +#define DFRCAT_(LINE) _defer##LINE > +#define DFRCAT(LINE) DFRCAT_(LINE) > +#define defer auto DFRCAT(__LINE__) = defer_dummy{} *[&]() -> void > +#endif > diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp > index ed7ddb9..4122eee 100644 > --- a/src/spice-streaming-agent.cpp > +++ b/src/spice-streaming-agent.cpp > @@ -33,6 +33,7 @@ > > #include "hexdump.h" > #include "concrete-agent.hpp" > +#include "defer.hpp" > > using namespace std; > using namespace SpiceStreamingAgent; > @@ -353,12 +354,17 @@ do_capture(const char *streamport, FILE *f_log) > // TODO was syslog(LOG_ERR, "Failed to open %s: %s\n", streamport, strerror(errno)); > throw std::runtime_error("failed to open streaming device"); > > + defer { > + close(streamfd); > + streamfd = -1; > + }; > + > unsigned int frame_count = 0; > while (! quit) { > while (!quit && !streaming_requested) { > if (read_command(1) < 0) { > syslog(LOG_ERR, "FAILED to read command\n"); > - goto done; > + return; > } > } > > @@ -409,19 +415,13 @@ do_capture(const char *streamport, FILE *f_log) > //usleep(1); > if (read_command(0) < 0) { > syslog(LOG_ERR, "FAILED to read command\n"); > - goto done; > + return; > } > if (!streaming_requested) { > capture->Reset(); > } > } > } > - > -done: > - if (streamfd >= 0) { > - close(streamfd); > - streamfd = -1; > - } > } > > #define arg_error(...) syslog(LOG_ERR, ## __VA_ARGS__); > -- > 2.13.6 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/spice-devel
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel