projects
/
dcpomatic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
a949b98
)
Make terminate_threads() less likely to leave _threads containing invalid pointers.
author
Carl Hetherington
<cth@carlh.net>
Tue, 10 Dec 2019 22:43:09 +0000
(22:43 +0000)
committer
Carl Hetherington
<cth@carlh.net>
Tue, 10 Dec 2019 22:43:09 +0000
(22:43 +0000)
src/lib/j2k_encoder.cc
patch
|
blob
|
history
diff --git
a/src/lib/j2k_encoder.cc
b/src/lib/j2k_encoder.cc
index 94728d6a9e6acccbe5839e4acc0c73d3d1b09530..10496671c4f5748e6e77b88776f96cab41589f94 100644
(file)
--- a/
src/lib/j2k_encoder.cc
+++ b/
src/lib/j2k_encoder.cc
@@
-1,5
+1,5
@@
/*
/*
- Copyright (C) 2012-201
5
Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-201
9
Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
This file is part of DCP-o-matic.
@@
-44,6
+44,7
@@
using std::list;
using std::cout;
using std::list;
using std::cout;
+using std::exception;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::optional;
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) {
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 ();
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) {
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");
}
delete *i;
LOG_GENERAL_NC ("Thread terminated");