diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-04-20 12:26:06 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2021-04-21 00:52:07 +0200 |
| commit | f61acf7791b17d446f8953ca261092d4fb878d37 (patch) | |
| tree | f5ebcc0c43d5ad28e8cd1c291034b0d793383c9a | |
| parent | fd130fc0b0c7421c7b1af613ff1f31ba3fc4f03b (diff) | |
Tidy up/fix Hints thread in a couple of ways:
- catch all exceptions from anywhere in the thread, rather than
just from parts of it
- stop the thread immediately when _stop is set to true; we don't
care about the results so there's no point carrying on
| -rw-r--r-- | src/lib/hints.cc | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/src/lib/hints.cc b/src/lib/hints.cc index e767c07fe..b23f32238 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -368,6 +368,7 @@ Hints::check_out_of_range_markers () void Hints::thread () +try { auto film = _film.lock (); if (!film) { @@ -411,21 +412,17 @@ Hints::thread () struct timeval last_pulse; gettimeofday (&last_pulse, 0); - try { - while (!player->pass()) { + while (!player->pass()) { - struct timeval now; - gettimeofday (&now, 0); - if ((seconds(now) - seconds(last_pulse)) > 1) { - if (_stop) { - break; - } - emit (bind (boost::ref(Pulse))); - last_pulse = now; + struct timeval now; + gettimeofday (&now, 0); + if ((seconds(now) - seconds(last_pulse)) > 1) { + if (_stop) { + return; } + emit (bind (boost::ref(Pulse))); + last_pulse = now; } - } catch (...) { - store_current (); } if (!check_loudness_done) { @@ -449,13 +446,7 @@ Hints::thread () boost::filesystem::path dcp_dir = film->dir("hints") / dcpomatic::get_process_id(); boost::filesystem::remove_all (dcp_dir); - try { - _writer->finish (film->dir("hints") / dcpomatic::get_process_id()); - } catch (...) { - store_current (); - emit (bind(boost::ref(Finished))); - return; - } + _writer->finish (film->dir("hints") / dcpomatic::get_process_id()); dcp::DCP dcp (dcp_dir); dcp.read (); @@ -489,6 +480,14 @@ Hints::thread () emit (bind(boost::ref(Finished))); } +catch (boost::thread_interrupted) +{ + /* The Hints object is being destroyed before it has finished, so just give up */ +} +catch (...) +{ + store_current (); +} void Hints::hint (string h) |
