Use engine lock in JackCoreMidiDriver::Restart.

This commit is contained in:
Stephane Letz 2013-05-16 14:16:33 +02:00
parent 8e2d47835e
commit b75b629c70
3 changed files with 29 additions and 17 deletions

View File

@ -604,7 +604,7 @@ int JackEngine::ClientExternalOpen(const char* name, int pid, int uuid, int* ref
EnsureUUID(uuid);
}
jack_log("JackEngine::ClientExternalOpen: uuid = %d, name = %s ", uuid, real_name);
jack_log("JackEngine::ClientExternalOpen: uuid = %d, name = %s", uuid, real_name);
int refnum = AllocateRefnum();
if (refnum < 0) {
@ -895,7 +895,7 @@ int JackEngine::CheckPortsConnect(int refnum, jack_port_id_t src, jack_port_id_t
JackPort* src_port = fGraphManager->GetPort(src);
JackPort* dst_port = fGraphManager->GetPort(dst);
jack_log("CheckPortsConnect(caller = %d, src = %d, dst = %d)", refnum, src_port->GetRefNum(), dst_port->GetRefNum());
jack_log("JackEngine::CheckPortsConnect(ref = %d, src = %d, dst = %d)", refnum, src_port->GetRefNum(), dst_port->GetRefNum());
int src_self = src_port->GetRefNum() == refnum ? 1 : 0;
int dst_self = dst_port->GetRefNum() == refnum ? 1 : 0;
@ -956,7 +956,7 @@ int JackEngine::CheckPortsConnect(int refnum, jack_port_id_t src, jack_port_id_t
int JackEngine::PortConnect(int refnum, const char* src, const char* dst)
{
jack_log("JackEngine::PortConnect src = %s dst = %s", src, dst);
jack_log("JackEngine::PortConnect ref = %d src = %s dst = %s", refnum, src, dst);
jack_port_id_t port_src, port_dst;
return (fGraphManager->GetTwoPorts(src, dst, &port_src, &port_dst) < 0)
@ -966,7 +966,7 @@ int JackEngine::PortConnect(int refnum, const char* src, const char* dst)
int JackEngine::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
{
jack_log("JackEngine::PortConnect src = %d dst = %d", src, dst);
jack_log("JackEngine::PortConnect ref = %d src = %d dst = %d", refnum, src, dst);
JackClientInterface* client;
int ref;
@ -1008,7 +1008,7 @@ int JackEngine::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
int JackEngine::PortDisconnect(int refnum, const char* src, const char* dst)
{
jack_log("JackEngine::PortDisconnect src = %s dst = %s", src, dst);
jack_log("JackEngine::PortDisconnect ref = %d src = %s dst = %s", refnum, src, dst);
jack_port_id_t port_src, port_dst;
return (fGraphManager->GetTwoPorts(src, dst, &port_src, &port_dst) < 0)
@ -1018,7 +1018,7 @@ int JackEngine::PortDisconnect(int refnum, const char* src, const char* dst)
int JackEngine::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
{
jack_log("JackEngine::PortDisconnect src = %d dst = %d", src, dst);
jack_log("JackEngine::PortDisconnect ref = %d src = %d dst = %d", refnum, src, dst);
if (dst == ALL_PORTS) {

View File

@ -88,7 +88,11 @@ class SERVER_EXPORT JackLockedEngine
{}
~JackLockedEngine()
{}
bool Lock() { return fEngine.Lock(); }
bool Unlock() { return fEngine.Unlock(); }
bool Trylock() { return fEngine.Trylock(); }
int Open()
{
// No lock needed

View File

@ -519,17 +519,25 @@ JackCoreMidiDriver::CloseAux()
void
JackCoreMidiDriver::Restart()
{
// Lock between this thread and RT thread
JackLock lock(this);
// Use first alias
SaveConnections(1);
Stop();
Detach();
CloseAux();
OpenAux();
Attach();
Start();
// Use first alias and partial port naming
LoadConnections(1, false);
// Lock between this thread and request thread
if (fEngine->Lock()) {
// Use first alias
SaveConnections(1);
Stop();
Detach();
CloseAux();
OpenAux();
Attach();
Start();
// Use first alias and partial port naming
LoadConnections(1, false);
fEngine->Unlock();
} else {
jack_error("Cannot acquire engine lock...");
}
}
void