git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1231 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.59
@@ -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) { | ||||
@@ -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; | ||||
} | } | ||||
@@ -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: | ||||
@@ -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; | ||||
@@ -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) | ||||
@@ -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; | ||||
} | } | ||||
@@ -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 | ||||
@@ -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 | ||||
@@ -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); | ||||
} | } | ||||
@@ -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(); | |||||
} | } | ||||
}; | }; | ||||
@@ -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; | ||||
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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" | ||||