diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp index 1f2345ec..c4a244a4 100644 --- a/common/JackEngine.cpp +++ b/common/JackEngine.cpp @@ -344,7 +344,7 @@ int JackEngine::ClientNew(const char* name, int* ref, int* shared_engine, int* s // Used for external clients int JackEngine::ClientExternalNew(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager, JackExternalClient* client) { - JackLog("JackEngine::ClientNew: name %s \n", name); + JackLog("JackEngine::ClientNew: name = %s \n", name); int refnum = fGraphManager->AllocateRefNum(); if (refnum < 0) { @@ -390,7 +390,7 @@ error: // Used for server driver clients int JackEngine::ClientInternalNew(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client) { - JackLog("JackEngine::ClientInternalNew: name %s\n", name); + JackLog("JackEngine::ClientInternalNew: name = %s\n", name); int refnum = fGraphManager->AllocateRefNum(); if (refnum < 0) { @@ -529,7 +529,7 @@ int JackEngine::PortRegister(int refnum, const char* name, unsigned int flags, u int JackEngine::PortUnRegister(int refnum, jack_port_id_t port_index) { - JackLog("JackEngine::PortUnRegister ref = %ld port_index = %ld\n", refnum, port_index); + JackLog("JackEngine::PortUnRegister ref = %ld port_index = %ld\n", refnum, port_index); assert(fClientTable[refnum]); if (fGraphManager->RemovePort(refnum, port_index) == 0) { diff --git a/common/JackExternalClient.cpp b/common/JackExternalClient.cpp index a637e6c7..5390e2c6 100644 --- a/common/JackExternalClient.cpp +++ b/common/JackExternalClient.cpp @@ -49,7 +49,7 @@ int JackExternalClient::Open(const char* name, int refnum, int* shared_client) try { if (fChannel->Open(name) < 0) { - jack_error("Cannot connect to client name = %s port\n", name); + jack_error("Cannot connect to client name = %s\n", name); return -1; } diff --git a/common/JackLibClient.cpp b/common/JackLibClient.cpp index 45b49e09..840a6b1a 100644 --- a/common/JackLibClient.cpp +++ b/common/JackLibClient.cpp @@ -104,7 +104,7 @@ int JackLibClient::Open(const char* name) goto error; } - JackLog("JackLibClient::Open: name, refnum %s %ld\n", name, fClientControl->fRefNum); + JackLog("JackLibClient::Open name = %s refnum = %ld\n", name, fClientControl->fRefNum); return 0; error: diff --git a/common/JackPosixThread.cpp b/common/JackPosixThread.cpp index 32b3b686..7572418b 100644 --- a/common/JackPosixThread.cpp +++ b/common/JackPosixThread.cpp @@ -43,12 +43,10 @@ void* JackPosixThread::ThreadHandler(void* arg) JackLog("ThreadHandler: start\n"); - // If Init succeed start the thread loop - bool res = true; - while (obj->fRunning && res) { - res = runnable->Execute(); - //pthread_testcancel(); - } + // If Init succeed, start the thread loop + while ((obj->fRunning = runnable->Execute())) { + //pthread_testcancel(); + } JackLog("ThreadHandler: exit\n"); return 0; @@ -134,7 +132,8 @@ int JackPosixThread::Kill() JackLog("JackPosixThread::Kill\n"); void* status; pthread_cancel(fThread); - pthread_join(fThread, &status); + pthread_join(fThread, &status); + fRunning = false; return 0; } else { return -1; diff --git a/common/JackRequest.h b/common/JackRequest.h index e096ed8f..39e63ea5 100644 --- a/common/JackRequest.h +++ b/common/JackRequest.h @@ -153,10 +153,11 @@ struct JackClientNewResult : public JackResult int fSharedPorts; uint32_t fProtocolVersion; - JackClientNewResult() + JackClientNewResult() + :fSharedEngine(-1), fSharedClient(-1), fSharedPorts(-1), fProtocolVersion(0) {} JackClientNewResult(int32_t status, int index1, int index2, int index3) - : JackResult(status), fSharedEngine(index1), fSharedClient(index2), fSharedPorts(index3), fProtocolVersion(0) + : JackResult(status), fSharedEngine(index1), fSharedClient(index2), fSharedPorts(index3), fProtocolVersion(0) {} virtual int Read(JackChannelTransaction* trans) diff --git a/common/JackSocketServerChannel.cpp b/common/JackSocketServerChannel.cpp index 5ec70edb..f138a086 100644 --- a/common/JackSocketServerChannel.cpp +++ b/common/JackSocketServerChannel.cpp @@ -154,8 +154,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::ClientNew\n"); JackClientNewRequest req; JackClientNewResult res; - req.Read(socket); - AddClient(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); + if (req.Read(socket) == 0) + AddClient(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); res.Write(socket); break; } @@ -164,8 +164,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::ClientClose\n"); JackClientCloseRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); res.Write(socket); RemoveClient(fd, req.fRefNum); break; @@ -175,8 +175,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackActivateRequest req; JackResult res; JackLog("JackRequest::ActivateClient\n"); - req.Read(socket); - res.fResult = fServer->Activate(req.fRefNum); + if (req.Read(socket) == 0) + res.fResult = fServer->Activate(req.fRefNum); res.Write(socket); break; } @@ -185,8 +185,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::DeactivateClient\n"); JackDeactivateRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->Deactivate(req.fRefNum); + if (req.Read(socket) == 0) + res.fResult = fServer->Deactivate(req.fRefNum); res.Write(socket); break; } @@ -195,8 +195,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::RegisterPort\n"); JackPortRegisterRequest req; JackPortRegisterResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); res.Write(socket); break; } @@ -205,8 +205,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::UnRegisterPort\n"); JackPortUnRegisterRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); res.Write(socket); break; } @@ -215,8 +215,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::ConnectPorts\n"); JackPortConnectNameRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); res.Write(socket); break; } @@ -225,8 +225,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::DisconnectPorts\n"); JackPortDisconnectNameRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); res.Write(socket); break; } @@ -235,8 +235,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::ConnectPorts\n"); JackPortConnectRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); res.Write(socket); break; } @@ -245,8 +245,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::DisconnectPorts\n"); JackPortDisconnectRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); res.Write(socket); break; } @@ -255,8 +255,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::SetBufferSize\n"); JackSetBufferSizeRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->SetBufferSize(req.fBufferSize); + if (req.Read(socket) == 0) + res.fResult = fServer->SetBufferSize(req.fBufferSize); res.Write(socket); break; } @@ -265,8 +265,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::SetFreeWheel\n"); JackSetFreeWheelRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->SetFreewheel(req.fOnOff); + if (req.Read(socket) == 0) + res.fResult = fServer->SetFreewheel(req.fOnOff); res.Write(socket); break; } @@ -275,8 +275,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::kReleaseTimebase\n"); JackReleaseTimebaseRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); res.Write(socket); break; } @@ -285,8 +285,8 @@ int JackSocketServerChannel::HandleRequest(int fd) JackLog("JackRequest::kSetTimebaseCallback\n"); JackSetTimebaseCallbackRequest req; JackResult res; - req.Read(socket); - res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); + if (req.Read(socket) == 0) + res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); res.Write(socket); break; } @@ -294,8 +294,8 @@ int JackSocketServerChannel::HandleRequest(int fd) case JackRequest::kNotification: { JackLog("JackRequest::Notification\n"); JackClientNotificationRequest req; - req.Read(socket); - fServer->Notify(req.fRefNum, req.fNotify, req.fValue); + if (req.Read(socket) == 0) + fServer->Notify(req.fRefNum, req.fNotify, req.fValue); break; } diff --git a/common/JackThread.h b/common/JackThread.h index 1a7aad00..a0791ab0 100644 --- a/common/JackThread.h +++ b/common/JackThread.h @@ -89,7 +89,12 @@ class JackThread virtual void SetParams(UInt64 period, UInt64 computation, UInt64 constraint) // Empty implementation, will only make sense on OSX... {} - virtual pthread_t GetThreadID() = 0; + virtual pthread_t GetThreadID() = 0; + + bool IsRunning() + { + return fRunning; + } }; } // end of namespace diff --git a/windows/JackWinNamedPipeNotifyChannel.cpp b/windows/JackWinNamedPipeNotifyChannel.cpp index 6368ca72..c1acbd55 100644 --- a/windows/JackWinNamedPipeNotifyChannel.cpp +++ b/windows/JackWinNamedPipeNotifyChannel.cpp @@ -32,7 +32,7 @@ int JackWinNamedPipeNotifyChannel::Open(const char* name) // Connect to client listen pipe if (fNotifyPipe.Connect(jack_client_dir, name, 0) < 0) { - jack_error("Cannot connect client socket"); + jack_error("Cannot connect client pipe"); return -1; } // TODO : use a time out for notifications diff --git a/windows/JackWinNamedPipeServerChannel.cpp b/windows/JackWinNamedPipeServerChannel.cpp index 1b85a765..02412f07 100644 --- a/windows/JackWinNamedPipeServerChannel.cpp +++ b/windows/JackWinNamedPipeServerChannel.cpp @@ -32,8 +32,7 @@ namespace Jack HANDLE JackClientPipeThread::fMutex = NULL; // never released.... -// fRefNum = 0 is used as a "running" state for the JackWinNamedPipeServerNotifyChannel object -// fRefNum = -1 correspond to a not running client +// fRefNum = -1 correspond to already removed client JackClientPipeThread::JackClientPipeThread(JackWinNamedPipeClient* pipe) : fPipe(pipe), fServer(NULL), fRefNum(0) @@ -66,209 +65,209 @@ void JackClientPipeThread::Close() // Close the Server/Client connection { fThread->Kill(); } - -bool JackClientPipeThread::Execute() -{ - JackLog("JackClientPipeThread::Execute\n"); - return (HandleRequest(fPipe) == 0); + +bool JackClientPipeThread::Execute() +{ + JackLog("JackClientPipeThread::Execute\n"); + return (HandleRequest() == 0); } -int JackClientPipeThread::HandleRequest(JackWinNamedPipeClient* pipe) +int JackClientPipeThread::HandleRequest() { // Read header - JackRequest header; - if (header.Read(pipe) < 0) { - jack_error("HandleRequest: cannot read header"); - // Lock the global mutex - if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) - jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); - KillClient(fPipe); - // Unlock the global mutex - ReleaseMutex(fMutex); - return -1; - } + JackRequest header; + int res = header.Read(fPipe); + int ret = 0; // Lock the global mutex if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) - jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); - - // Read data - switch (header.fType) { - - case JackRequest::kClientNew: { - JackLog("JackRequest::ClientNew\n"); - JackClientNewRequest req; - JackClientNewResult res; - req.Read(pipe); - AddClient(pipe, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); - res.Write(pipe); - break; - } - - case JackRequest::kClientClose: { - JackLog("JackRequest::ClientClose\n"); - JackClientCloseRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); - res.Write(pipe); - RemoveClient(pipe, req.fRefNum); - break; - } - - case JackRequest::kActivateClient: { - JackActivateRequest req; - JackResult res; - JackLog("JackRequest::ActivateClient\n"); - req.Read(pipe); - res.fResult = fServer->Activate(req.fRefNum); - res.Write(pipe); - break; - } - - case JackRequest::kDeactivateClient: { - JackLog("JackRequest::DeactivateClient\n"); - JackDeactivateRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->Deactivate(req.fRefNum); - res.Write(pipe); - break; - } - - case JackRequest::kRegisterPort: { - JackLog("JackRequest::RegisterPort\n"); - JackPortRegisterRequest req; - JackPortRegisterResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); - res.Write(pipe); - break; - } - - case JackRequest::kUnRegisterPort: { - JackLog("JackRequest::UnRegisterPort\n"); - JackPortUnRegisterRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); - res.Write(pipe); - break; - } - - case JackRequest::kConnectNamePorts: { - JackLog("JackRequest::ConnectPorts\n"); - JackPortConnectNameRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(pipe); - break; - } - - case JackRequest::kDisconnectNamePorts: { - JackLog("JackRequest::DisconnectPorts\n"); - JackPortDisconnectNameRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(pipe); - break; - } - - case JackRequest::kConnectPorts: { - JackLog("JackRequest::ConnectPorts\n"); - JackPortConnectRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(pipe); - break; - } - - case JackRequest::kDisconnectPorts: { - JackLog("JackRequest::DisconnectPorts\n"); - JackPortDisconnectRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); - res.Write(pipe); - break; - } - - case JackRequest::kSetBufferSize: { - JackLog("JackRequest::SetBufferSize\n"); - JackSetBufferSizeRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->SetBufferSize(req.fBufferSize); - res.Write(pipe); - break; - } - - case JackRequest::kSetFreeWheel: { - JackLog("JackRequest::SetFreeWheel\n"); - JackSetFreeWheelRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->SetFreewheel(req.fOnOff); - res.Write(pipe); - break; - } - - case JackRequest::kReleaseTimebase: { - JackLog("JackRequest::kReleaseTimebase\n"); - JackReleaseTimebaseRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); - res.Write(pipe); - break; - } - - case JackRequest::kSetTimebaseCallback: { - JackLog("JackRequest::kSetTimebaseCallback\n"); - JackSetTimebaseCallbackRequest req; - JackResult res; - req.Read(pipe); - res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); - res.Write(pipe); - break; - } - - case JackRequest::kNotification: { - JackLog("JackRequest::Notification\n"); - JackClientNotificationRequest req; - req.Read(pipe); - fServer->Notify(req.fRefNum, req.fNotify, req.fValue); - break; - } - - default: - JackLog("Unknown request %ld\n", header.fType); - break; - } + jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); + + if (res < 0) { + jack_error("HandleRequest: cannot read header"); + KillClient(); + ret = -1; + } else { + + // Read data + switch (header.fType) { + + case JackRequest::kClientNew: { + JackLog("JackRequest::ClientNew\n"); + JackClientNewRequest req; + JackClientNewResult res; + if (req.Read(fPipe) == 0) + AddClient(req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); + res.Write(fPipe); + break; + } + + case JackRequest::kClientClose: { + JackLog("JackRequest::ClientClose\n"); + JackClientCloseRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); + res.Write(fPipe); + RemoveClient(req.fRefNum); + break; + } + + case JackRequest::kActivateClient: { + JackActivateRequest req; + JackResult res; + JackLog("JackRequest::ActivateClient\n"); + if (req.Read(fPipe) == 0) + res.fResult = fServer->Activate(req.fRefNum); + res.Write(fPipe); + break; + } + + case JackRequest::kDeactivateClient: { + JackLog("JackRequest::DeactivateClient\n"); + JackDeactivateRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->Deactivate(req.fRefNum); + res.Write(fPipe); + break; + } + + case JackRequest::kRegisterPort: { + JackLog("JackRequest::RegisterPort\n"); + JackPortRegisterRequest req; + JackPortRegisterResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); + res.Write(fPipe); + break; + } + + case JackRequest::kUnRegisterPort: { + JackLog("JackRequest::UnRegisterPort\n"); + JackPortUnRegisterRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); + + res.Write(fPipe); + break; + } + + case JackRequest::kConnectNamePorts: { + JackLog("JackRequest::ConnectPorts\n"); + JackPortConnectNameRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); + res.Write(fPipe); + break; + } + + case JackRequest::kDisconnectNamePorts: { + JackLog("JackRequest::DisconnectPorts\n"); + JackPortDisconnectNameRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); + res.Write(fPipe); + break; + } + + case JackRequest::kConnectPorts: { + JackLog("JackRequest::ConnectPorts\n"); + JackPortConnectRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); + res.Write(fPipe); + break; + } + + case JackRequest::kDisconnectPorts: { + JackLog("JackRequest::DisconnectPorts\n"); + JackPortDisconnectRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); + res.Write(fPipe); + break; + } + + case JackRequest::kSetBufferSize: { + JackLog("JackRequest::SetBufferSize\n"); + JackSetBufferSizeRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->SetBufferSize(req.fBufferSize); + res.Write(fPipe); + break; + } + + case JackRequest::kSetFreeWheel: { + JackLog("JackRequest::SetFreeWheel\n"); + JackSetFreeWheelRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->SetFreewheel(req.fOnOff); + res.Write(fPipe); + break; + } + + case JackRequest::kReleaseTimebase: { + JackLog("JackRequest::kReleaseTimebase\n"); + JackReleaseTimebaseRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); + res.Write(fPipe); + break; + } + + case JackRequest::kSetTimebaseCallback: { + JackLog("JackRequest::kSetTimebaseCallback\n"); + JackSetTimebaseCallbackRequest req; + JackResult res; + if (req.Read(fPipe) == 0) + res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); + res.Write(fPipe); + break; + } + + case JackRequest::kNotification: { + JackLog("JackRequest::Notification\n"); + JackClientNotificationRequest req; + if (req.Read(fPipe) == 0) + fServer->Notify(req.fRefNum, req.fNotify, req.fValue); + break; + } + + default: + JackLog("Unknown request %ld\n", header.fType); + break; + } + } // Unlock the global mutex ReleaseMutex(fMutex); - return 0; + return ret; } -void JackClientPipeThread::AddClient(JackWinNamedPipeClient* pipe, char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result) +void JackClientPipeThread::AddClient(char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result) { JackLog("JackWinNamedPipeServerChannel::AddClient %s\n", name); fRefNum = -1; *result = fServer->GetEngine()->ClientNew(name, &fRefNum, shared_engine, shared_client, shared_ports); } -void JackClientPipeThread::RemoveClient(JackWinNamedPipeClient* pipe, int refnum) +void JackClientPipeThread::RemoveClient(int refnum) { JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", refnum); fRefNum = -1; - pipe->Close(); + fPipe->Close(); } -void JackClientPipeThread::KillClient(JackWinNamedPipeClient* pipe) +void JackClientPipeThread::KillClient() { JackLog("JackClientPipeThread::KillClient \n"); JackLog("JackWinNamedPipeServerChannel::KillClient ref = %d\n", fRefNum); @@ -282,7 +281,7 @@ void JackClientPipeThread::KillClient(JackWinNamedPipeClient* pipe) } fRefNum = -1; - pipe->Close(); + fPipe->Close(); } JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel() @@ -361,22 +360,23 @@ bool JackWinNamedPipeServerChannel::Execute() void JackWinNamedPipeServerChannel::AddClient(JackWinNamedPipeClient* pipe) { - // Remove dead clients + // Remove dead (= not running anymore) clients. std::list::iterator it = fClientList.begin(); JackClientPipeThread* client; while (it != fClientList.end()) { client = *it; - if (!client->IsRunning()) { // Dead client - JackLog("Remove client from list\n"); - it = fClientList.erase(it); + if (client->IsRunning()) { + it++; + } else { + JackLog("Remove client from list\n"); + it = fClientList.erase(it); delete(client); - } else { - it++; } } client = new JackClientPipeThread(pipe); - client->Open(fServer); + client->Open(fServer); + // Here we are sure that the client is running (because it's thread is in "running" state). fClientList.push_back(client); } diff --git a/windows/JackWinNamedPipeServerChannel.h b/windows/JackWinNamedPipeServerChannel.h index 07f33d43..56caf34a 100644 --- a/windows/JackWinNamedPipeServerChannel.h +++ b/windows/JackWinNamedPipeServerChannel.h @@ -39,9 +39,9 @@ class JackClientPipeThread : public JackRunnableInterface JackThread* fThread; int fRefNum; - void AddClient(JackWinNamedPipeClient* pipe, char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result); - void RemoveClient(JackWinNamedPipeClient* pipe, int refnum); - void KillClient(JackWinNamedPipeClient* pipe); + void AddClient(char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result); + void RemoveClient(int refnum); + void KillClient(); static HANDLE fMutex; @@ -53,14 +53,15 @@ class JackClientPipeThread : public JackRunnableInterface int Open(JackServer* server); // Open the Server/Client connection void Close(); // Close the Server/Client connection - int HandleRequest(JackWinNamedPipeClient* pipe); + int HandleRequest(); // JackRunnableInterface interface bool Execute(); - + + // To be used for find out if the object can be deleted bool IsRunning() { - return (fRefNum >= 0); + return fThread->IsRunning(); } }; diff --git a/windows/JackWinThread.cpp b/windows/JackWinThread.cpp index 8e39c507..762e2631 100644 --- a/windows/JackWinThread.cpp +++ b/windows/JackWinThread.cpp @@ -43,12 +43,9 @@ DWORD WINAPI JackWinThread::ThreadHandler(void* arg) JackLog("ThreadHandler: start\n"); - // If Init succeed start the thread loop - bool res = true; - while (obj->fRunning && res) { - res = runnable->Execute(); - } - + // If Init succeed, start the thread loop + while ((obj->fRunning = runnable->Execute())) {} + SetEvent(obj->fEvent); JackLog("ThreadHandler: exit\n"); return 0; @@ -156,7 +153,8 @@ int JackWinThread::Kill() JackLog("JackWinThread::Kill\n"); TerminateThread(fThread, 0); /// TO CHECK : dangerous CloseHandle(fThread); - CloseHandle(fEvent); + CloseHandle(fEvent); + fRunning = false; return 0; } else { return -1; diff --git a/windows/jack_lsp.dsp b/windows/jack_lsp.dsp index c8253aba..cace65a0 100644 --- a/windows/jack_lsp.dsp +++ b/windows/jack_lsp.dsp @@ -108,6 +108,28 @@ SOURCE="..\example-clients\lsp.c" # Begin Source File SOURCE=.\Release\libjackmp.lib + +!IF "$(CFG)" == "jack_lsp - Win32 Release" + +!ELSEIF "$(CFG)" == "jack_lsp - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\Debug\libjackmp_debug.lib + +!IF "$(CFG)" == "jack_lsp - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "jack_lsp - Win32 Debug" + +!ENDIF + # End Source File # End Target # End Project diff --git a/windows/jack_simple_client.dsp b/windows/jack_simple_client.dsp index eccd1029..80ec2219 100644 --- a/windows/jack_simple_client.dsp +++ b/windows/jack_simple_client.dsp @@ -100,6 +100,28 @@ SOURCE="..\example-clients\simple_client.c" # Begin Source File SOURCE=.\Release\libjackmp.lib + +!IF "$(CFG)" == "jack_simple_client - Win32 Release" + +!ELSEIF "$(CFG)" == "jack_simple_client - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\Debug\libjackmp_debug.lib + +!IF "$(CFG)" == "jack_simple_client - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "jack_simple_client - Win32 Debug" + +!ENDIF + # End Source File # End Target # End Project diff --git a/windows/jackdmp.dsp b/windows/jackdmp.dsp index 2b797b53..442fdb9d 100644 --- a/windows/jackdmp.dsp +++ b/windows/jackdmp.dsp @@ -39,6 +39,7 @@ RSC=rc.exe # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /YX /FD /c @@ -108,6 +109,19 @@ SOURCE=.\JackdmpWIN32.cpp # Begin Source File SOURCE=.\Release\libjackdmp.lib + +!IF "$(CFG)" == "jackdmp - Win32 Release" + +!ELSEIF "$(CFG)" == "jackdmp - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\Debug\libjackdmp_debug.lib # End Source File # End Target # End Project diff --git a/windows/libjackmp.dsp b/windows/libjackmp.dsp index 37637601..283f7ff6 100644 --- a/windows/libjackmp.dsp +++ b/windows/libjackmp.dsp @@ -68,7 +68,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I "." /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I "." /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /FR /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x40c /d "_DEBUG"