diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-12-10 22:43:09 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2019-12-10 22:43:09 +0000 |
| commit | f0c10e92b849566e458bc323f8783a6fe83e52d2 (patch) | |
| tree | 39eff8be9946d576dbba6c3e2e05311c7904dcf6 | |
| parent | a949b98e6dc94a89c3d705577f5c4af8d8364e4f (diff) | |
Make terminate_threads() less likely to leave _threads containing invalid pointers.
| -rw-r--r-- | src/lib/j2k_encoder.cc | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index 94728d6a9..10496671c 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net> + Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -44,6 +44,7 @@ using std::list; using std::cout; +using std::exception; using boost::shared_ptr; using boost::weak_ptr; using boost::optional; @@ -249,13 +250,20 @@ J2KEncoder::terminate_threads () int n = 0; for (list<boost::thread *>::iterator i = _threads.begin(); i != _threads.end(); ++i) { + /* Be careful not to throw in here otherwise _threads will not be clear()ed */ LOG_GENERAL ("Terminating thread %1 of %2", n + 1, _threads.size ()); (*i)->interrupt (); - DCPOMATIC_ASSERT ((*i)->joinable ()); + if (!(*i)->joinable()) { + LOG_ERROR_NC ("About to join() a non-joinable thread"); + } try { (*i)->join (); } catch (boost::thread_interrupted& e) { - /* This is to be expected */ + /* This is to be expected (I think?) */ + } catch (exception& e) { + LOG_ERROR ("join() threw an exception: %1", e.what()); + } catch (...) { + LOG_ERROR_NC ("join() threw an exception"); } delete *i; LOG_GENERAL_NC ("Thread terminated"); |
