summaryrefslogtreecommitdiff
path: root/src/lib/encoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-06-20 15:02:15 +0100
committerCarl Hetherington <cth@carlh.net>2016-06-20 15:02:15 +0100
commit795e5d916707da498acc7079ae1fb10aa6af6973 (patch)
treeb231beddbc88fd5578631b282ddb8ac3ddcdc697 /src/lib/encoder.cc
parentcc08eda9243c746d8940259428e61cc90d31c873 (diff)
Encoder shutdown fixes.
Two fixes here; prevent the servers-list-changed callback being called when Encoder is being destroyed, and stop ~Encoder throwing exceptions. I'm not sure if the catch (...) in ~Encoder will hide problems that we should be handling, but I think by the time ~Encoder is happening we'll already have seen any exceptions that we need to report.
Diffstat (limited to 'src/lib/encoder.cc')
-rw-r--r--src/lib/encoder.cc33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index 8f2aa58f7..9ec817604 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -65,14 +65,37 @@ Encoder::Encoder (shared_ptr<const Film> film, shared_ptr<Writer> writer)
Encoder::~Encoder ()
{
- terminate_threads ();
+ try {
+ terminate_threads ();
+ } catch (...) {
+ /* Destructors must not throw exceptions; anything bad
+ happening now is too late to worry about anyway,
+ I think.
+ */
+ }
}
void
Encoder::begin ()
{
if (!EncodeServerFinder::instance()->disabled ()) {
- _server_found_connection = EncodeServerFinder::instance()->ServersListChanged.connect (boost::bind (&Encoder::servers_list_changed, this));
+ weak_ptr<Encoder> wp = shared_from_this ();
+ _server_found_connection = EncodeServerFinder::instance()->ServersListChanged.connect (
+ boost::bind (&Encoder::call_servers_list_changed, wp)
+ );
+ }
+}
+
+/* We don't want the servers-list-changed callback trying to do things
+ during destruction of Encoder, and I think this is the neatest way
+ to achieve that.
+*/
+void
+Encoder::call_servers_list_changed (weak_ptr<Encoder> encoder)
+{
+ shared_ptr<Encoder> e = encoder.lock ();
+ if (e) {
+ e->servers_list_changed ();
}
}
@@ -238,7 +261,11 @@ Encoder::terminate_threads ()
LOG_GENERAL ("Terminating thread %1 of %2", n + 1, _threads.size ());
(*i)->interrupt ();
DCPOMATIC_ASSERT ((*i)->joinable ());
- (*i)->join ();
+ try {
+ (*i)->join ();
+ } catch (boost::thread_interrupted& e) {
+ /* This is to be expected */
+ }
delete *i;
LOG_GENERAL_NC ("Thread terminated");
++n;