fix deadlock in protocol manager startup; fix some other ::set_session() SNAFUs;...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 17 Dec 2009 23:36:52 +0000 (23:36 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 17 Dec 2009 23:36:52 +0000 (23:36 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6375 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour_ui_dialogs.cc
gtk2_ardour/editor.cc
gtk2_ardour/editor_summary.cc
gtk2_ardour/editor_summary.h
gtk2_ardour/route_ui.cc
gtk2_ardour/streamview.cc
libs/ardour/ardour/track.h
libs/ardour/control_protocol_manager.cc

index 9db664199ca65e8e249bf3bd4b0865a4afda19a6..87a8dede29e8b5c3aa957e646dfdbd21230bca67 100644 (file)
@@ -51,6 +51,10 @@ ARDOUR_UI::set_session (Session *s)
 {
        SessionHandlePtr::set_session (s);
 
+       if (!_session) {
+               return;
+       }
+
        if (location_ui) {
                location_ui->set_session(s);
        }
@@ -65,10 +69,6 @@ ARDOUR_UI::set_session (Session *s)
        preroll_clock.set_session (s);
        postroll_clock.set_session (s);
        
-       if (!_session) {
-               return;
-       }
-
        /* sensitize menu bar options that are now valid */
 
        ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
index bf0b2124bb193b99c2e376d79b2f65cdf32a410b..7cc9e26339f2cce69cb05d4d7e333d13b92657ba 100644 (file)
@@ -436,8 +436,8 @@ Editor::Editor ()
        transport_mark_label.set_no_show_all();
 
        initialize_rulers ();
-       _summary = new EditorSummary (this);
        initialize_canvas ();
+       _summary = new EditorSummary (this);
 
        selection->TimeChanged.connect (sigc::mem_fun(*this, &Editor::time_selection_changed));
        selection->TracksChanged.connect (sigc::mem_fun(*this, &Editor::track_selection_changed));
@@ -1033,6 +1033,10 @@ Editor::set_session (Session *t)
 {
        SessionHandlePtr::set_session (t);
 
+       if (!_session) {
+               return;
+       }
+
        zoom_range_clock.set_session (_session);
        _playlist_selector->set_session (_session);
        nudge_clock.set_session (_session);
@@ -1056,10 +1060,6 @@ Editor::set_session (Session *t)
                sfbrowser->set_session (_session);
        }
 
-       if (!_session) {
-               return;
-       }
-
        compute_fixed_ruler_scale ();
 
        /* there are never any selected regions at startup */
index b0021506227b5967b5c7e956c3ee567ae0523237..8a62156a1921234b8812aec3cc8cdccfee93a0f7 100644 (file)
@@ -47,7 +47,8 @@ EditorSummary::EditorSummary (Editor* e)
          _zoom_dragging (false)
 
 {
-
+       Region::RegionPropertyChanged.connect (sigc::hide (sigc::mem_fun (*this, &EditorSummary::set_dirty)));
+       _editor->playhead_cursor->PositionChanged.connect (sigc::mem_fun (*this, &EditorSummary::playhead_position_changed));
 }
 
 /** Connect to a session.
@@ -58,17 +59,13 @@ EditorSummary::set_session (Session* s)
 {
        EditorComponent::set_session (s);
 
-       Region::RegionPropertyChanged.connect (sigc::hide (sigc::mem_fun (*this, &EditorSummary::set_dirty)));
+       set_dirty ();
 
        if (_session) {
                _session_connections.add_connection (_session->RegionRemoved.connect (boost::bind (&EditorSummary::set_dirty, this)));
                _session_connections.add_connection (_session->StartTimeChanged.connect (boost::bind (&EditorSummary::set_dirty, this)));
                _session_connections.add_connection (_session->EndTimeChanged.connect (boost::bind (&EditorSummary::set_dirty, this)));
        }
-
-       _editor->playhead_cursor->PositionChanged.connect (sigc::mem_fun (*this, &EditorSummary::playhead_position_changed));
-
-       set_dirty ();
 }
 
 /** Handle an expose event.
@@ -504,7 +501,7 @@ EditorSummary::set_editor (pair<double,double> const & x, pair<double, double> c
 void
 EditorSummary::playhead_position_changed (nframes64_t p)
 {
-       if (int (p * _x_scale) != int (_last_playhead)) {
+       if (_session && int (p * _x_scale) != int (_last_playhead)) {
                set_overlays_dirty ();
        }
 }
index 9d9763996e293d6d8c31f9630aac4541351c8770..e311b47ebd8a2b080ab628140a8abde619d8aed5 100644 (file)
@@ -1,3 +1,4 @@
+
 /*
     Copyright (C) 2009 Paul Davis
 
index 31841c97ba42f26bf8a4761fe034745618f620d4..c4fe713f585bf2278bc4d9735abb546fa9cc38c4 100644 (file)
@@ -167,6 +167,11 @@ RouteUI::reset ()
 void
 RouteUI::self_delete ()
 {
+       /* This may be called from a non-GUI thread. Keep it safe */
+
+       cerr << "\n\nExpect to see route " << _route->name() << " be deleted\n";
+       _route.reset (); /* drop reference to route, so that it can be cleaned up */
+
        route_going_away_connection.disconnect ();
        connections.drop_connections ();
        delete_when_idle (this);
index 626e2bf5375c14e9c9ffb42d7b1c6318b5cbe83b..41901162942505d1dd4ac188bea9c0028aedd2b3 100644 (file)
@@ -92,8 +92,6 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Group* group)
 
 StreamView::~StreamView ()
 {
-       cerr << "Streamview " << _trackview.name() << " deleted\n";
-
        undisplay_diskstream ();
 
        delete canvas_rect;
index c23e159684a113e20fac769b550d247507e3d569..82b4f701b454d4b3ee0c7c09392d46e90b8ba8e6 100644 (file)
@@ -141,7 +141,6 @@ class Track : public Route
 
        FreezeRecord          _freeze_record;
        XMLNode*              pending_state;
-       boost::signals2::scoped_connection  recenable_connection;
        bool                  _destructive;
 
        boost::shared_ptr<RecEnableControllable> _rec_enable_control;
index 47f8d5bf983095ff0dcab481e4efaed6bae971d3..1e793bb71b8fd1e223989cb3a9c473d37d8cf72d 100644 (file)
@@ -110,6 +110,8 @@ ControlProtocolManager::session_going_away()
 ControlProtocol*
 ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
 {
+       /* CALLER MUST HOLD LOCK */
+
        if (_session == 0) {
                return 0;
        }
@@ -126,8 +128,6 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
                return 0;
        }
 
-
-       Glib::Mutex::Lock lm (protocols_lock);
        control_protocols.push_back (cpi.protocol);
 
        return cpi.protocol;
@@ -172,6 +172,8 @@ ControlProtocolManager::load_mandatory_protocols ()
                return;
        }
 
+       Glib::Mutex::Lock lm (protocols_lock);
+
        for (list<ControlProtocolInfo*>::iterator i = control_protocol_info.begin(); i != control_protocol_info.end(); ++i) {
                if ((*i)->mandatory && ((*i)->protocol == 0)) {
                        info << string_compose (_("Instantiating mandatory control protocol %1"), (*i)->name) << endmsg;
@@ -293,6 +295,8 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
        XMLNodeConstIterator citer;
        XMLProperty* prop;
 
+       Glib::Mutex::Lock lm (protocols_lock);
+
        clist = node.children();
 
        for (citer = clist.begin(); citer != clist.end(); ++citer) {