Browse Source

Correct crash bug when closing clients in Windows version

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1231 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.59
sletz 18 years ago
parent
commit
00a8d52a5b
15 changed files with 312 additions and 250 deletions
  1. +3
    -3
      common/JackEngine.cpp
  2. +1
    -1
      common/JackExternalClient.cpp
  3. +1
    -1
      common/JackLibClient.cpp
  4. +6
    -7
      common/JackPosixThread.cpp
  5. +3
    -2
      common/JackRequest.h
  6. +30
    -30
      common/JackSocketServerChannel.cpp
  7. +6
    -1
      common/JackThread.h
  8. +1
    -1
      windows/JackWinNamedPipeNotifyChannel.cpp
  9. +190
    -190
      windows/JackWinNamedPipeServerChannel.cpp
  10. +7
    -6
      windows/JackWinNamedPipeServerChannel.h
  11. +5
    -7
      windows/JackWinThread.cpp
  12. +22
    -0
      windows/jack_lsp.dsp
  13. +22
    -0
      windows/jack_simple_client.dsp
  14. +14
    -0
      windows/jackdmp.dsp
  15. +1
    -1
      windows/libjackmp.dsp

+ 3
- 3
common/JackEngine.cpp View File

@@ -344,7 +344,7 @@ int JackEngine::ClientNew(const char* name, int* ref, int* shared_engine, int* s
// Used for external clients // Used for external clients
int JackEngine::ClientExternalNew(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager, JackExternalClient* client) 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(); int refnum = fGraphManager->AllocateRefNum();


if (refnum < 0) { if (refnum < 0) {
@@ -390,7 +390,7 @@ error:
// Used for server driver clients // Used for server driver clients
int JackEngine::ClientInternalNew(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client) 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(); int refnum = fGraphManager->AllocateRefNum();


if (refnum < 0) { 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) 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]); assert(fClientTable[refnum]);


if (fGraphManager->RemovePort(refnum, port_index) == 0) { if (fGraphManager->RemovePort(refnum, port_index) == 0) {


+ 1
- 1
common/JackExternalClient.cpp View File

@@ -49,7 +49,7 @@ int JackExternalClient::Open(const char* name, int refnum, int* shared_client)
try { try {


if (fChannel->Open(name) < 0) { 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; return -1;
} }




+ 1
- 1
common/JackLibClient.cpp View File

@@ -104,7 +104,7 @@ int JackLibClient::Open(const char* name)
goto error; 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; return 0;


error: error:


+ 6
- 7
common/JackPosixThread.cpp View File

@@ -43,12 +43,10 @@ void* JackPosixThread::ThreadHandler(void* arg)


JackLog("ThreadHandler: start\n"); 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"); JackLog("ThreadHandler: exit\n");
return 0; return 0;
@@ -134,7 +132,8 @@ int JackPosixThread::Kill()
JackLog("JackPosixThread::Kill\n"); JackLog("JackPosixThread::Kill\n");
void* status; void* status;
pthread_cancel(fThread); pthread_cancel(fThread);
pthread_join(fThread, &status);
pthread_join(fThread, &status);
fRunning = false;
return 0; return 0;
} else { } else {
return -1; return -1;


+ 3
- 2
common/JackRequest.h View File

@@ -153,10 +153,11 @@ struct JackClientNewResult : public JackResult
int fSharedPorts; int fSharedPorts;
uint32_t fProtocolVersion; uint32_t fProtocolVersion;


JackClientNewResult()
JackClientNewResult()
:fSharedEngine(-1), fSharedClient(-1), fSharedPorts(-1), fProtocolVersion(0)
{} {}
JackClientNewResult(int32_t status, int index1, int index2, int index3) 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) virtual int Read(JackChannelTransaction* trans)


+ 30
- 30
common/JackSocketServerChannel.cpp View File

@@ -154,8 +154,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::ClientNew\n"); JackLog("JackRequest::ClientNew\n");
JackClientNewRequest req; JackClientNewRequest req;
JackClientNewResult res; 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); res.Write(socket);
break; break;
} }
@@ -164,8 +164,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::ClientClose\n"); JackLog("JackRequest::ClientClose\n");
JackClientCloseRequest req; JackClientCloseRequest req;
JackResult res; 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); res.Write(socket);
RemoveClient(fd, req.fRefNum); RemoveClient(fd, req.fRefNum);
break; break;
@@ -175,8 +175,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackActivateRequest req; JackActivateRequest req;
JackResult res; JackResult res;
JackLog("JackRequest::ActivateClient\n"); 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); res.Write(socket);
break; break;
} }
@@ -185,8 +185,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::DeactivateClient\n"); JackLog("JackRequest::DeactivateClient\n");
JackDeactivateRequest req; JackDeactivateRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -195,8 +195,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::RegisterPort\n"); JackLog("JackRequest::RegisterPort\n");
JackPortRegisterRequest req; JackPortRegisterRequest req;
JackPortRegisterResult res; 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); res.Write(socket);
break; break;
} }
@@ -205,8 +205,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::UnRegisterPort\n"); JackLog("JackRequest::UnRegisterPort\n");
JackPortUnRegisterRequest req; JackPortUnRegisterRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -215,8 +215,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::ConnectPorts\n"); JackLog("JackRequest::ConnectPorts\n");
JackPortConnectNameRequest req; JackPortConnectNameRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -225,8 +225,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::DisconnectPorts\n"); JackLog("JackRequest::DisconnectPorts\n");
JackPortDisconnectNameRequest req; JackPortDisconnectNameRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -235,8 +235,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::ConnectPorts\n"); JackLog("JackRequest::ConnectPorts\n");
JackPortConnectRequest req; JackPortConnectRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -245,8 +245,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::DisconnectPorts\n"); JackLog("JackRequest::DisconnectPorts\n");
JackPortDisconnectRequest req; JackPortDisconnectRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -255,8 +255,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::SetBufferSize\n"); JackLog("JackRequest::SetBufferSize\n");
JackSetBufferSizeRequest req; JackSetBufferSizeRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -265,8 +265,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::SetFreeWheel\n"); JackLog("JackRequest::SetFreeWheel\n");
JackSetFreeWheelRequest req; JackSetFreeWheelRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -275,8 +275,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::kReleaseTimebase\n"); JackLog("JackRequest::kReleaseTimebase\n");
JackReleaseTimebaseRequest req; JackReleaseTimebaseRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -285,8 +285,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
JackLog("JackRequest::kSetTimebaseCallback\n"); JackLog("JackRequest::kSetTimebaseCallback\n");
JackSetTimebaseCallbackRequest req; JackSetTimebaseCallbackRequest req;
JackResult res; 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); res.Write(socket);
break; break;
} }
@@ -294,8 +294,8 @@ int JackSocketServerChannel::HandleRequest(int fd)
case JackRequest::kNotification: { case JackRequest::kNotification: {
JackLog("JackRequest::Notification\n"); JackLog("JackRequest::Notification\n");
JackClientNotificationRequest req; 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; break;
} }




+ 6
- 1
common/JackThread.h View File

@@ -89,7 +89,12 @@ class JackThread
virtual void SetParams(UInt64 period, UInt64 computation, UInt64 constraint) // Empty implementation, will only make sense on OSX... 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 } // end of namespace


+ 1
- 1
windows/JackWinNamedPipeNotifyChannel.cpp View File

@@ -32,7 +32,7 @@ int JackWinNamedPipeNotifyChannel::Open(const char* name)


// Connect to client listen pipe // Connect to client listen pipe
if (fNotifyPipe.Connect(jack_client_dir, name, 0) < 0) { if (fNotifyPipe.Connect(jack_client_dir, name, 0) < 0) {
jack_error("Cannot connect client socket");
jack_error("Cannot connect client pipe");
return -1; return -1;
} }
// TODO : use a time out for notifications // TODO : use a time out for notifications


+ 190
- 190
windows/JackWinNamedPipeServerChannel.cpp View File

@@ -32,8 +32,7 @@ namespace Jack


HANDLE JackClientPipeThread::fMutex = NULL; // never released.... 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) JackClientPipeThread::JackClientPipeThread(JackWinNamedPipeClient* pipe)
: fPipe(pipe), fServer(NULL), fRefNum(0) : fPipe(pipe), fServer(NULL), fRefNum(0)
@@ -66,209 +65,209 @@ void JackClientPipeThread::Close() // Close the Server/Client connection
{ {
fThread->Kill(); 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 // 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 // Lock the global mutex
if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) 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 // Unlock the global mutex
ReleaseMutex(fMutex); 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); JackLog("JackWinNamedPipeServerChannel::AddClient %s\n", name);
fRefNum = -1; fRefNum = -1;
*result = fServer->GetEngine()->ClientNew(name, &fRefNum, shared_engine, shared_client, shared_ports); *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); JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", refnum);
fRefNum = -1; fRefNum = -1;
pipe->Close();
fPipe->Close();
} }


void JackClientPipeThread::KillClient(JackWinNamedPipeClient* pipe)
void JackClientPipeThread::KillClient()
{ {
JackLog("JackClientPipeThread::KillClient \n"); JackLog("JackClientPipeThread::KillClient \n");
JackLog("JackWinNamedPipeServerChannel::KillClient ref = %d\n", fRefNum); JackLog("JackWinNamedPipeServerChannel::KillClient ref = %d\n", fRefNum);
@@ -282,7 +281,7 @@ void JackClientPipeThread::KillClient(JackWinNamedPipeClient* pipe)
} }


fRefNum = -1; fRefNum = -1;
pipe->Close();
fPipe->Close();
} }


JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel() JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel()
@@ -361,22 +360,23 @@ bool JackWinNamedPipeServerChannel::Execute()


void JackWinNamedPipeServerChannel::AddClient(JackWinNamedPipeClient* pipe) void JackWinNamedPipeServerChannel::AddClient(JackWinNamedPipeClient* pipe)
{ {
// Remove dead clients
// Remove dead (= not running anymore) clients.
std::list<JackClientPipeThread*>::iterator it = fClientList.begin(); std::list<JackClientPipeThread*>::iterator it = fClientList.begin();
JackClientPipeThread* client; JackClientPipeThread* client;
while (it != fClientList.end()) { while (it != fClientList.end()) {
client = *it; 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); delete(client);
} else {
it++;
} }
} }


client = new JackClientPipeThread(pipe); 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); fClientList.push_back(client);
} }




+ 7
- 6
windows/JackWinNamedPipeServerChannel.h View File

@@ -39,9 +39,9 @@ class JackClientPipeThread : public JackRunnableInterface
JackThread* fThread; JackThread* fThread;
int fRefNum; 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; static HANDLE fMutex;


@@ -53,14 +53,15 @@ class JackClientPipeThread : public JackRunnableInterface
int Open(JackServer* server); // Open the Server/Client connection int Open(JackServer* server); // Open the Server/Client connection
void Close(); // Close the Server/Client connection void Close(); // Close the Server/Client connection


int HandleRequest(JackWinNamedPipeClient* pipe);
int HandleRequest();


// JackRunnableInterface interface // JackRunnableInterface interface
bool Execute(); bool Execute();

// To be used for find out if the object can be deleted
bool IsRunning() bool IsRunning()
{ {
return (fRefNum >= 0);
return fThread->IsRunning();
} }
}; };




+ 5
- 7
windows/JackWinThread.cpp View File

@@ -43,12 +43,9 @@ DWORD WINAPI JackWinThread::ThreadHandler(void* arg)


JackLog("ThreadHandler: start\n"); 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); SetEvent(obj->fEvent);
JackLog("ThreadHandler: exit\n"); JackLog("ThreadHandler: exit\n");
return 0; return 0;
@@ -156,7 +153,8 @@ int JackWinThread::Kill()
JackLog("JackWinThread::Kill\n"); JackLog("JackWinThread::Kill\n");
TerminateThread(fThread, 0); /// TO CHECK : dangerous TerminateThread(fThread, 0); /// TO CHECK : dangerous
CloseHandle(fThread); CloseHandle(fThread);
CloseHandle(fEvent);
CloseHandle(fEvent);
fRunning = false;
return 0; return 0;
} else { } else {
return -1; return -1;


+ 22
- 0
windows/jack_lsp.dsp View File

@@ -108,6 +108,28 @@ SOURCE="..\example-clients\lsp.c"
# Begin Source File # Begin Source File
SOURCE=.\Release\libjackmp.lib 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 Source File
# End Target # End Target
# End Project # End Project

+ 22
- 0
windows/jack_simple_client.dsp View File

@@ -100,6 +100,28 @@ SOURCE="..\example-clients\simple_client.c"
# Begin Source File # Begin Source File
SOURCE=.\Release\libjackmp.lib 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 Source File
# End Target # End Target
# End Project # End Project

+ 14
- 0
windows/jackdmp.dsp View File

@@ -39,6 +39,7 @@ RSC=rc.exe
# PROP Use_Debug_Libraries 0 # PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release" # PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # 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 # 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 # Begin Source File
SOURCE=.\Release\libjackdmp.lib 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 Source File
# End Target # End Target
# End Project # End Project

+ 1
- 1
windows/libjackmp.dsp View File

@@ -68,7 +68,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # 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 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 BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x40c /d "_DEBUG" # ADD BASE RSC /l 0x40c /d "_DEBUG"


Loading…
Cancel
Save