From 1ad291db7e847fbb71e5bd9f2f81db6bfb2a022e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 26 Aug 2015 22:12:16 +0100 Subject: [PATCH] Separate ExceptionStore. --- run/tests | 4 ++- src/lib/data.cc | 1 + src/lib/encoder.h | 1 + src/lib/exception_store.h | 69 +++++++++++++++++++++++++++++++++++++++ src/lib/exceptions.h | 45 ------------------------- src/lib/server.h | 2 +- src/lib/server_finder.h | 2 +- src/lib/writer.h | 1 + src/tools/dcpomatic.cc | 1 + 9 files changed, 78 insertions(+), 48 deletions(-) create mode 100644 src/lib/exception_store.h diff --git a/run/tests b/run/tests index c561cfa99..49bc63142 100755 --- a/run/tests +++ b/run/tests @@ -10,10 +10,12 @@ if [ "$1" == "--debug" ]; then elif [ "$1" == "--valgrind" ]; then shift; valgrind --tool="memcheck" --leak-check=full build/test/unit-tests $* +elif [ "$1" == "--callgrind" ]; then + shift; + valgrind --tool="callgrind" build/test/unit-tests $* elif [ "$1" == "--quiet" ]; then shift; build/test/unit-tests --catch_system_errors=no $* else build/test/unit-tests --catch_system_errors=no --log_level=test_suite $* fi - diff --git a/src/lib/data.cc b/src/lib/data.cc index 5975ff6fc..eb3ec4c63 100644 --- a/src/lib/data.cc +++ b/src/lib/data.cc @@ -20,6 +20,7 @@ #include "data.h" #include "cross.h" #include "exceptions.h" +#include #include "i18n.h" diff --git a/src/lib/encoder.h b/src/lib/encoder.h index 12f1e15ff..fbae07a9a 100644 --- a/src/lib/encoder.h +++ b/src/lib/encoder.h @@ -26,6 +26,7 @@ #include "util.h" #include "cross.h" +#include "exception_store.h" #include #include #include diff --git a/src/lib/exception_store.h b/src/lib/exception_store.h new file mode 100644 index 000000000..d7c34c0f4 --- /dev/null +++ b/src/lib/exception_store.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2012-2014 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef DCPOMATIC_EXCEPTION_STORE_H +#define DCPOMATIC_EXCEPTION_STORE_H + +#include +#include + +/** @class ExceptionStore + * @brief A parent class for classes which have a need to catch and + * re-throw exceptions. + * + * This is intended for classes which run their own thread; they should do + * something like + * + * void my_thread () + * try { + * // do things which might throw exceptions + * } catch (...) { + * store_current (); + * } + * + * and then in another thread call rethrow(). If any + * exception was thrown by my_thread it will be stored by + * store_current() and then rethrow() will re-throw it where + * it can be handled. + */ +class ExceptionStore +{ +public: + void rethrow () { + boost::mutex::scoped_lock lm (_mutex); + if (_exception) { + boost::exception_ptr tmp = _exception; + _exception = boost::exception_ptr (); + boost::rethrow_exception (tmp); + } + } + +protected: + + void store_current () { + boost::mutex::scoped_lock lm (_mutex); + _exception = boost::current_exception (); + } + +private: + boost::exception_ptr _exception; + mutable boost::mutex _mutex; +}; + +#endif diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h index 12342b304..7240611ee 100644 --- a/src/lib/exceptions.h +++ b/src/lib/exceptions.h @@ -27,9 +27,7 @@ extern "C" { #include } -#include #include -#include #include #include @@ -265,47 +263,4 @@ public: ProgrammingError (std::string file, int line); }; -/** @class ExceptionStore - * @brief A parent class for classes which have a need to catch and - * re-throw exceptions. - * - * This is intended for classes which run their own thread; they should do - * something like - * - * void my_thread () - * try { - * // do things which might throw exceptions - * } catch (...) { - * store_current (); - * } - * - * and then in another thread call rethrow(). If any - * exception was thrown by my_thread it will be stored by - * store_current() and then rethrow() will re-throw it where - * it can be handled. - */ -class ExceptionStore -{ -public: - void rethrow () { - boost::mutex::scoped_lock lm (_mutex); - if (_exception) { - boost::exception_ptr tmp = _exception; - _exception = boost::exception_ptr (); - boost::rethrow_exception (tmp); - } - } - -protected: - - void store_current () { - boost::mutex::scoped_lock lm (_mutex); - _exception = boost::current_exception (); - } - -private: - boost::exception_ptr _exception; - mutable boost::mutex _mutex; -}; - #endif diff --git a/src/lib/server.h b/src/lib/server.h index fd765e160..97bc26fd8 100644 --- a/src/lib/server.h +++ b/src/lib/server.h @@ -24,7 +24,7 @@ * @brief Server class. */ -#include "exceptions.h" +#include "exception_store.h" #include #include #include diff --git a/src/lib/server_finder.h b/src/lib/server_finder.h index 134759ea3..bd6d79304 100644 --- a/src/lib/server_finder.h +++ b/src/lib/server_finder.h @@ -20,7 +20,7 @@ #include "signaller.h" #include "server_description.h" #include "config.h" -#include "exceptions.h" +#include "exception_store.h" #include #include diff --git a/src/lib/writer.h b/src/lib/writer.h index 3455bfd83..79322bacd 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -24,6 +24,7 @@ #include "types.h" #include "player_subtitles.h" #include "data.h" +#include "exception_store.h" #include #include #include diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 1ab316fec..7a1547557 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -823,6 +823,7 @@ private: TransformProcessType (&serial, kProcessTransformToForegroundApplication); #endif + cout << "set up path encoding.\n"; dcpomatic_setup_path_encoding (); /* Enable i18n; this will create a Config object -- 2.30.2