diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-06-20 15:02:15 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-06-20 15:02:15 +0100 |
| commit | 795e5d916707da498acc7079ae1fb10aa6af6973 (patch) | |
| tree | b231beddbc88fd5578631b282ddb8ac3ddcdc697 /src/lib/encoder.cc | |
| parent | cc08eda9243c746d8940259428e61cc90d31c873 (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.cc | 33 |
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; |
