PortManager::unregister_port() must be called with process lock
authorRobin Gareus <robin@gareus.org>
Fri, 28 Jul 2017 18:15:15 +0000 (20:15 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 28 Jul 2017 18:15:15 +0000 (20:15 +0200)
This fixes "Failed to register <surface> port" when re-loading a session.

libs/ardour/midiport_manager.cc
libs/surfaces/faderport/faderport.cc
libs/surfaces/faderport8/faderport8.cc
libs/surfaces/mackie/surface_port.cc
libs/surfaces/push2/push2.cc

index 7f5dee4c6402818d8ca3b0b80754df72f56fc974..cf1d90ac565ea082f961c01a6525247cab3f503c 100644 (file)
@@ -37,6 +37,7 @@ MidiPortManager::MidiPortManager ()
 
 MidiPortManager::~MidiPortManager ()
 {
+       Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
        if (_midi_in) {
                AudioEngine::instance()->unregister_port (_midi_in);
        }
index 4e65fec3cc08ae792bae526f502c44c707ef12a4..4984c73b06a01acc79295aef4bbd45a74d157b28 100644 (file)
@@ -200,6 +200,7 @@ FaderPort::~FaderPort ()
 
        if (_input_port) {
                DEBUG_TRACE (DEBUG::FaderPort, string_compose ("unregistering input port %1\n", boost::shared_ptr<ARDOUR::Port>(_input_port)->name()));
+               Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
                AudioEngine::instance()->unregister_port (_input_port);
                _input_port.reset ();
        }
@@ -207,6 +208,7 @@ FaderPort::~FaderPort ()
        if (_output_port) {
                _output_port->drain (10000,  250000); /* check every 10 msecs, wait up to 1/4 second for the port to drain */
                DEBUG_TRACE (DEBUG::FaderPort, string_compose ("unregistering output port %1\n", boost::shared_ptr<ARDOUR::Port>(_output_port)->name()));
+               Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
                AudioEngine::instance()->unregister_port (_output_port);
                _output_port.reset ();
        }
index a812e1a4d753b8d3f9af181d7549840e4a7c869d..9b355782554b122bf58214a763b64331749d9169 100644 (file)
@@ -155,6 +155,7 @@ FaderPort8::~FaderPort8 ()
 
        if (_input_port) {
                DEBUG_TRACE (DEBUG::FaderPort8, string_compose ("unregistering input port %1\n", boost::shared_ptr<ARDOUR::Port>(_input_port)->name()));
+               Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
                AudioEngine::instance()->unregister_port (_input_port);
                _input_port.reset ();
        }
@@ -164,6 +165,7 @@ FaderPort8::~FaderPort8 ()
        if (_output_port) {
                _output_port->drain (10000,  250000); /* check every 10 msecs, wait up to 1/4 second for the port to drain */
                DEBUG_TRACE (DEBUG::FaderPort8, string_compose ("unregistering output port %1\n", boost::shared_ptr<ARDOUR::Port>(_output_port)->name()));
+               Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
                AudioEngine::instance()->unregister_port (_output_port);
                _output_port.reset ();
        }
index 4ecb56573530e6b930b307d22ad7d051afff4c59..b6bc26cc777d0c49524d024c45144f874cc6b4f7 100644 (file)
@@ -92,6 +92,7 @@ SurfacePort::~SurfacePort()
        } else {
                if (_async_in) {
                        DEBUG_TRACE (DEBUG::MackieControl, string_compose ("unregistering input port %1\n", _async_in->name()));
+                       Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
                        AudioEngine::instance()->unregister_port (_async_in);
                        _async_in.reset ((ARDOUR::Port*) 0);
                }
@@ -99,6 +100,7 @@ SurfacePort::~SurfacePort()
                if (_async_out) {
                        _output_port->drain (10000, 250000);
                        DEBUG_TRACE (DEBUG::MackieControl, string_compose ("unregistering output port %1\n", _async_out->name()));
+                       Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
                        AudioEngine::instance()->unregister_port (_async_out);
                        _async_out.reset ((ARDOUR::Port*) 0);
                }
index f29ff41d0658088039df1f08c4435841a5b78ed7..d884869048b985ae56a584823005c87821672429 100644 (file)
@@ -294,8 +294,11 @@ Push2::ports_release ()
        asp = dynamic_cast<AsyncMIDIPort*> (_output_port);
        asp->drain (10000, 500000);
 
-       AudioEngine::instance()->unregister_port (_async_in);
-       AudioEngine::instance()->unregister_port (_async_out);
+       {
+               Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock());
+               AudioEngine::instance()->unregister_port (_async_in);
+               AudioEngine::instance()->unregister_port (_async_out);
+       }
 
        _async_in.reset ((ARDOUR::Port*) 0);
        _async_out.reset ((ARDOUR::Port*) 0);