summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2019-12-10 22:43:09 +0000
committerCarl Hetherington <cth@carlh.net>2019-12-11 00:33:48 +0100
commit5d92e7bf242200c3b3b8a079671b572569d2b198 (patch)
tree64c26a38d8629b6e00435a20e818334eb324fdf1 /src
parent377de24c4cb129fab39e30a089050c2af8202494 (diff)
Make terminate_threads() less likely to leave _threads containing invalid pointers.
Backported from f0c10e92b849566e458bc323f8783a6fe83e52d2 in master.
Diffstat (limited to 'src')
-rw-r--r--src/lib/j2k_encoder.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc
index e5f127100..5c3fd477e 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;
@@ -250,13 +251,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");