diff --git a/ChangeLog b/ChangeLog index ab676f75..254233d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,10 @@ Fernando Lopez-Lezcano Jackdmp changes log --------------------------- +2008-05-05 Stephane Letz + + * Fix JackClient::Close : notification channel is stopped first to avoid receiving notifications while closing and Close is again a synchronous call. + 2008-05-01 Stephane Letz * Fix JackMachClientChannel::InternalClientLoad. diff --git a/common/JackClient.cpp b/common/JackClient.cpp index 72ef5f00..97c00c81 100644 --- a/common/JackClient.cpp +++ b/common/JackClient.cpp @@ -78,8 +78,8 @@ int JackClient::Close() jack_log("JackClient::Close ref = %ld", GetClientControl()->fRefNum); Deactivate(); int result = -1; + fChannel->Stop(); // Channels is stopped first to avoid receiving notifications while closing fChannel->ClientClose(GetClientControl()->fRefNum, &result); - fChannel->Stop(); fChannel->Close(); fSynchroTable[GetClientControl()->fRefNum]->Disconnect(); return result; diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp index 57f5a26f..1221987a 100644 --- a/common/JackEngine.cpp +++ b/common/JackEngine.cpp @@ -215,7 +215,7 @@ void JackEngine::NotifyClient(int refnum, int event, int sync, int value1, int v jack_log("JackEngine::NotifyClient: client not available anymore"); } else if (client->GetClientControl()->fCallback[event]) { if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, value1, value2) < 0) - jack_error("NotifyClient fails name = %s event = %ld = val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); + jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2); } else { jack_log("JackEngine::NotifyClient: no callback for event = %ld", event); } diff --git a/common/JackSocketClientChannel.cpp b/common/JackSocketClientChannel.cpp index eeb2f3fd..b79931d4 100644 --- a/common/JackSocketClientChannel.cpp +++ b/common/JackSocketClientChannel.cpp @@ -162,7 +162,7 @@ void JackSocketClientChannel::ClientClose(int refnum, int* result) { JackClientCloseRequest req(refnum); JackResult res; - ServerAsyncCall(&req, &res, result); + ServerSyncCall(&req, &res, result); } void JackSocketClientChannel::ClientActivate(int refnum, int* result) diff --git a/common/JackSocketServerChannel.cpp b/common/JackSocketServerChannel.cpp index 10ecc40d..a510c2aa 100644 --- a/common/JackSocketServerChannel.cpp +++ b/common/JackSocketServerChannel.cpp @@ -169,7 +169,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) ClientAdd(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); if (res.Write(socket) < 0) - jack_error("JackRequest::kClientOpen write error name = %s", req.fName); + jack_error("JackRequest::ClientOpen write error name = %s", req.fName); break; } @@ -179,7 +179,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackResult res; if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); - // No write: client is actually doing an "ServerAsyncCall", and not interested by the result + if (res.Write(socket) < 0) + jack_error("JackRequest::ClientClose write error ref = %d", req.fRefNum); ClientRemove(fd, req.fRefNum); break; } @@ -191,7 +192,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum); if (res.Write(socket) < 0) - jack_error("JackRequest::kActivateClient write error ref = %d", req.fRefNum); + jack_error("JackRequest::ActivateClient write error ref = %d", req.fRefNum); break; } @@ -202,7 +203,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum); if (res.Write(socket) < 0) - jack_error("JackRequest::kDeactivateClient write error ref = %d", req.fRefNum); + jack_error("JackRequest::DeactivateClient write error ref = %d", req.fRefNum); break; } @@ -213,7 +214,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); if (res.Write(socket) < 0) - jack_error("JackRequest::kRegisterPort write error ref = %d", req.fRefNum); + jack_error("JackRequest::RegisterPort write error ref = %d", req.fRefNum); break; } @@ -224,7 +225,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); if (res.Write(socket) < 0) - jack_error("JackRequest::kUnRegisterPort write error ref = %d", req.fRefNum); + jack_error("JackRequest::UnRegisterPort write error ref = %d", req.fRefNum); break; } @@ -235,7 +236,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); if (res.Write(socket) < 0) - jack_error("JackRequest::kConnectNamePorts write error ref = %d", req.fRefNum); + jack_error("JackRequest::ConnectNamePorts write error ref = %d", req.fRefNum); break; } @@ -246,7 +247,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); if (res.Write(socket) < 0) - jack_error("JackRequest::kDisconnectNamePorts write error ref = %d", req.fRefNum); + jack_error("JackRequest::DisconnectNamePorts write error ref = %d", req.fRefNum); break; } @@ -257,7 +258,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); if (res.Write(socket) < 0) - jack_error("JackRequest::kConnectPorts write error ref = %d", req.fRefNum); + jack_error("JackRequest::ConnectPorts write error ref = %d", req.fRefNum); break; } @@ -268,7 +269,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); if (res.Write(socket) < 0) - jack_error("JackRequest::kDisconnectPorts write error ref = %d", req.fRefNum); + jack_error("JackRequest::DisconnectPorts write error ref = %d", req.fRefNum); break; } @@ -279,7 +280,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->SetBufferSize(req.fBufferSize); if (res.Write(socket) < 0) - jack_error("JackRequest::kSetBufferSize write error"); + jack_error("JackRequest::SetBufferSize write error"); break; } @@ -290,7 +291,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->SetFreewheel(req.fOnOff); if (res.Write(socket) < 0) - jack_error("JackRequest::kSetFreeWheel write error"); + jack_error("JackRequest::SetFreeWheel write error"); break; } @@ -312,7 +313,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal); if (res.Write(socket) < 0) - jack_error("JackRequest::kSetTimebaseCallback write error ref = %d", req.fRefNum); + jack_error("JackRequest::SetTimebaseCallback write error ref = %d", req.fRefNum); break; } @@ -323,7 +324,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); if (res.Write(socket) < 0) - jack_error("JackRequest::kGetInternalClientName write error ref = %d", req.fRefNum); + jack_error("JackRequest::GetInternalClientName write error ref = %d", req.fRefNum); break; } @@ -334,7 +335,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); if (res.Write(socket) < 0) - jack_error("JackRequest::kInternalClientHandle write error ref = %d", req.fRefNum); + jack_error("JackRequest::InternalClientHandle write error ref = %d", req.fRefNum); break; } @@ -345,7 +346,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->InternalClientLoad(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, &res.fStatus); if (res.Write(socket) < 0) - jack_error("JackRequest::kInternalClientLoad write error name = %s", req.fName); + jack_error("JackRequest::InternalClientLoad write error name = %s", req.fName); break; } @@ -356,7 +357,7 @@ int JackSocketServerChannel::HandleRequest(int fd) if (req.Read(socket) == 0) res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); if (res.Write(socket) < 0) - jack_error("JackRequest::kInternalClientUnload write error ref = %d", req.fRefNum); + jack_error("JackRequest::InternalClientUnload write error ref = %d", req.fRefNum); break; } diff --git a/macosx/JackMachThread.cpp b/macosx/JackMachThread.cpp index 2c4a9ae0..b1022f0f 100644 --- a/macosx/JackMachThread.cpp +++ b/macosx/JackMachThread.cpp @@ -143,7 +143,8 @@ int JackMachThread::GetParams(UInt64* period, UInt64* computation, UInt64* const int JackMachThread::Kill() { // pthread_cancel still not yet implemented in Darwin (TO CHECK ON TIGER) - + jack_log("JackMachThread::Kill"); + if (fThread) { // If thread has been started mach_port_t machThread = pthread_mach_thread_np(fThread); return (thread_terminate(machThread) == KERN_SUCCESS) ? 0 : -1; diff --git a/windows/JackWinNamedPipeClientChannel.cpp b/windows/JackWinNamedPipeClientChannel.cpp index 1f681218..bdee81e6 100644 --- a/windows/JackWinNamedPipeClientChannel.cpp +++ b/windows/JackWinNamedPipeClientChannel.cpp @@ -165,7 +165,7 @@ void JackWinNamedPipeClientChannel::ClientClose(int refnum, int* result) { JackClientCloseRequest req(refnum); JackResult res; - ServerAsyncCall(&req, &res, result); + ServerSyncCall(&req, &res, result); } void JackWinNamedPipeClientChannel::ClientActivate(int refnum, int* result) diff --git a/windows/JackWinNamedPipeServerChannel.cpp b/windows/JackWinNamedPipeServerChannel.cpp index 4f4e7de6..64e27ea0 100644 --- a/windows/JackWinNamedPipeServerChannel.cpp +++ b/windows/JackWinNamedPipeServerChannel.cpp @@ -108,7 +108,7 @@ int JackClientPipeThread::HandleRequest() switch (header.fType) { case JackRequest::kClientCheck: { - jack_log("JackRequest::kClientCheck"); + jack_log("JackRequest::ClientCheck"); JackClientCheckRequest req; JackClientCheckResult res; if (req.Read(fPipe) == 0) @@ -133,7 +133,7 @@ int JackClientPipeThread::HandleRequest() JackResult res; if (req.Read(fPipe) == 0) res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); - // No write: client is actually doing an "ServerAsyncCall", and not interested by the result + res.Write(fPipe); ClientRemove(); ret = -1; break; @@ -240,7 +240,7 @@ int JackClientPipeThread::HandleRequest() } case JackRequest::kReleaseTimebase: { - jack_log("JackRequest::kReleaseTimebase"); + jack_log("JackRequest::ReleaseTimebase"); JackReleaseTimebaseRequest req; JackResult res; if (req.Read(fPipe) == 0) @@ -250,7 +250,7 @@ int JackClientPipeThread::HandleRequest() } case JackRequest::kSetTimebaseCallback: { - jack_log("JackRequest::kSetTimebaseCallback"); + jack_log("JackRequest::SetTimebaseCallback"); JackSetTimebaseCallbackRequest req; JackResult res; if (req.Read(fPipe) == 0) @@ -260,7 +260,7 @@ int JackClientPipeThread::HandleRequest() } case JackRequest::kGetInternalClientName: { - jack_log("JackRequest::kGetInternalClientName"); + jack_log("JackRequest::GetInternalClientName"); JackGetInternalClientNameRequest req; JackGetInternalClientNameResult res; if (req.Read(fPipe) == 0) @@ -270,7 +270,7 @@ int JackClientPipeThread::HandleRequest() } case JackRequest::kInternalClientHandle: { - jack_log("JackRequest::kInternalClientHandle"); + jack_log("JackRequest::InternalClientHandle"); JackInternalClientHandleRequest req; JackInternalClientHandleResult res; if (req.Read(fPipe) == 0) @@ -280,7 +280,7 @@ int JackClientPipeThread::HandleRequest() } case JackRequest::kInternalClientLoad: { - jack_log("JackRequest::kInternalClientLoad"); + jack_log("JackRequest::InternalClientLoad"); JackInternalClientLoadRequest req; JackInternalClientLoadResult res; if (req.Read(fPipe) == 0) @@ -290,7 +290,7 @@ int JackClientPipeThread::HandleRequest() } case JackRequest::kInternalClientUnload: { - jack_log("JackRequest::kInternalClientUnload"); + jack_log("JackRequest::InternalClientUnload"); JackInternalClientUnloadRequest req; JackInternalClientUnloadResult res; if (req.Read(fPipe) == 0)