TextContent::set_dcp_track can end up requesting a view update, which
involves calls to methods in Content which lock the Content::_mutex.
Do these calls without a lock on that mutex held.
Also, it looks like we would append to texts on every call to
examine(). Fix that so that we replace the texts list on each
examine() call.
bool const needed_assets = needs_assets ();
bool const needed_kdm = needs_kdm ();
string const old_name = name ();
bool const needed_assets = needs_assets ();
bool const needed_kdm = needs_kdm ();
string const old_name = name ();
- int const old_texts = text.size ();
ChangeSignaller<Content> cc_texts (this, DCPContentProperty::TEXTS);
ChangeSignaller<Content> cc_assets (this, DCPContentProperty::NEEDS_ASSETS);
ChangeSignaller<Content> cc_texts (this, DCPContentProperty::TEXTS);
ChangeSignaller<Content> cc_assets (this, DCPContentProperty::NEEDS_ASSETS);
atmos->set_length (examiner->atmos_length());
}
atmos->set_length (examiner->atmos_length());
}
+ list<shared_ptr<TextContent> > new_text;
+ for (int i = 0; i < TEXT_COUNT; ++i) {
+ for (int j = 0; j < examiner->text_count(static_cast<TextType>(i)); ++j) {
+ shared_ptr<TextContent> c(new TextContent(this, static_cast<TextType>(i), static_cast<TextType>(i)));
+ if (i == TEXT_CLOSED_CAPTION) {
+ c->set_dcp_track (examiner->dcp_text_track(j));
+ }
+ new_text.push_back (c);
+ }
+ }
+
{
boost::mutex::scoped_lock lm (_mutex);
{
boost::mutex::scoped_lock lm (_mutex);
_name = examiner->name ();
_name = examiner->name ();
- for (int i = 0; i < TEXT_COUNT; ++i) {
- for (int j = 0; j < examiner->text_count(static_cast<TextType>(i)); ++j) {
- shared_ptr<TextContent> c(new TextContent(this, static_cast<TextType>(i), static_cast<TextType>(i)));
- if (i == TEXT_CLOSED_CAPTION) {
- c->set_dcp_track (examiner->dcp_text_track(j));
- }
- text.push_back (c);
- }
- }
- texts = text.size ();
_encrypted = examiner->encrypted ();
_needs_assets = examiner->needs_assets ();
_kdm_valid = examiner->kdm_valid ();
_encrypted = examiner->encrypted ();
_needs_assets = examiner->needs_assets ();
_kdm_valid = examiner->kdm_valid ();
_content_versions = examiner->content_versions ();
}
_content_versions = examiner->content_versions ();
}
- if (old_texts == texts) {
- cc_texts.abort ();
- }
-
if (needed_assets == needs_assets()) {
cc_assets.abort ();
}
if (needed_assets == needs_assets()) {
cc_assets.abort ();
}