using namespace dcpomatic;
-static
-void
-ignore_progress (float)
-{
-
-}
-
-
/** @param j Job to report progress to, or 0.
* @param text_only true to enable only the text (subtitle/ccap) parts of the writer.
*/
pool.create_thread (boost::bind (&boost::asio::io_service::run, &service));
}
- boost::function<void (float)> set_progress;
+ std::function<void (float)> set_progress;
if (job) {
set_progress = boost::bind (&Writer::set_digest_progress, this, job.get(), _1);
} else {
- set_progress = &ignore_progress;
+ set_progress = [](float) {
+ boost::this_thread::interruption_point();
+ };
}
for (auto& i: _reels) {
work.reset ();
- {
+ try {
+ pool.join_all ();
+ } catch (boost::thread_interrupted) {
+ /* join_all was interrupted, so we need to interrupt the threads
+ * in our pool then try again to join them.
+ */
+ pool.interrupt_all ();
pool.join_all ();
}
Waker waker;
waker.nudge ();
+
+ boost::this_thread::interruption_point();
}
/** Calculate hashes for any referenced MXF assets which do not already have one */
void
-Writer::calculate_referenced_digests (boost::function<void (float)> set_progress)
+Writer::calculate_referenced_digests (std::function<void (float)> set_progress)
+try
{
for (auto const& i: _reel_assets) {
auto file = dynamic_pointer_cast<dcp::ReelFileAsset>(i.asset);
file->set_hash (file->asset_ref().asset()->hash());
}
}
+} catch (boost::thread_interrupted) {
+ /* set_progress contains an interruption_point, so any of these methods
+ * may throw thread_interrupted, at which point we just give up.
+ */
}