|
|
@@ -53,13 +53,6 @@ JackClientPipeThread::~JackClientPipeThread() |
|
|
|
delete fPipe; |
|
|
|
} |
|
|
|
|
|
|
|
bool JackClientPipeThread::IsRunning() |
|
|
|
{ |
|
|
|
return (fRefNum >= 0); |
|
|
|
//return (fRefNum >= GetEngineControl()->fDriverNum); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int JackClientPipeThread::Open(JackServer* server) // Open the Server/Client connection |
|
|
|
{ |
|
|
|
// Start listening |
|
|
@@ -75,14 +68,9 @@ int JackClientPipeThread::Open(JackServer* server) // Open the Server/Clien |
|
|
|
|
|
|
|
void JackClientPipeThread::Close() // Close the Server/Client connection |
|
|
|
{ |
|
|
|
jack_log("JackClientPipeThread::Close %x %ld", this, fRefNum); |
|
|
|
/* |
|
|
|
TODO : solve WIN32 thread Kill issue |
|
|
|
This would hang.. since Close will be followed by a delete, |
|
|
|
all ressources will be deallocated at the end. |
|
|
|
*/ |
|
|
|
jack_log("JackClientPipeThread::Close 0 %x %ld", this, fRefNum); |
|
|
|
|
|
|
|
fThread.Kill(); |
|
|
|
//fThread.Kill(); |
|
|
|
fPipe->Close(); |
|
|
|
fRefNum = -1; |
|
|
|
|
|
|
@@ -94,7 +82,7 @@ bool JackClientPipeThread::Execute() |
|
|
|
{ |
|
|
|
try { |
|
|
|
|
|
|
|
jack_log("JackClientPipeThread::Execute"); |
|
|
|
jack_log("JackClientPipeThread::Execute %x", this); |
|
|
|
JackRequest header; |
|
|
|
int res = header.Read(fPipe); |
|
|
|
bool ret = true; |
|
|
@@ -112,6 +100,7 @@ bool JackClientPipeThread::Execute() |
|
|
|
// Decode request |
|
|
|
} else if (fDecoder->HandleRequest(fPipe, header.fType) < 0) { |
|
|
|
jack_log("JackClientPipeThread::Execute : cannot decode request"); |
|
|
|
ret = false; |
|
|
|
} |
|
|
|
|
|
|
|
// Unlock the global mutex |
|
|
@@ -126,380 +115,27 @@ bool JackClientPipeThread::Execute() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
void JackClientPipeThread::ClientAdd(char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result) |
|
|
|
{ |
|
|
|
jack_log("JackClientPipeThread::ClientAdd %s", name); |
|
|
|
fRefNum = -1; |
|
|
|
*result = fServer->GetEngine()->ClientExternalOpen(name, pid, uuid, &fRefNum, shared_engine, shared_client, shared_graph); |
|
|
|
} |
|
|
|
|
|
|
|
void JackClientPipeThread::ClientRemove() |
|
|
|
{ |
|
|
|
jack_log("JackClientPipeThread::ClientRemove ref = %d", fRefNum); |
|
|
|
// TODO : solve WIN32 thread Kill issue |
|
|
|
//Close(); |
|
|
|
// |
|
|
|
fRefNum = -1; |
|
|
|
fPipe->Close(); |
|
|
|
} |
|
|
|
*/ |
|
|
|
|
|
|
|
void JackClientPipeThread::ClientAdd(detail::JackChannelTransactionInterface* socket, JackClientOpenRequest* req, JackClientOpenResult *res) |
|
|
|
{ |
|
|
|
jack_info("JackClientPipeThread::ClientAdd %s", req->fName); |
|
|
|
jack_log("JackClientPipeThread::ClientAdd %x %s", this, req->fName); |
|
|
|
fRefNum = -1; |
|
|
|
res->fResult = fServer->GetEngine()->ClientExternalOpen(req->fName, req->fPID, req->fUUID, &fRefNum, &res->fSharedEngine, &res->fSharedClient, &res->fSharedGraph); |
|
|
|
} |
|
|
|
|
|
|
|
void JackClientPipeThread::ClientRemove(detail::JackChannelTransactionInterface* socket_aux, int refnum) |
|
|
|
{ |
|
|
|
jack_info("JackClientPipeThread::ClientRemove ref = %d", refnum); |
|
|
|
// TODO : solve WIN32 thread Kill issue |
|
|
|
//Close(); |
|
|
|
// |
|
|
|
fRefNum = -1; |
|
|
|
fPipe->Close(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
bool JackClientPipeThread::HandleRequest() |
|
|
|
{ |
|
|
|
// Read header |
|
|
|
JackRequest header; |
|
|
|
int res = header.Read(fPipe); |
|
|
|
bool ret = true; |
|
|
|
|
|
|
|
// Lock the global mutex |
|
|
|
if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) { |
|
|
|
jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); |
|
|
|
} |
|
|
|
|
|
|
|
if (res < 0) { |
|
|
|
jack_error("HandleRequest: cannot read header"); |
|
|
|
ClientKill(); |
|
|
|
ret = false; |
|
|
|
} else { |
|
|
|
|
|
|
|
// Read data |
|
|
|
switch (header.fType) { |
|
|
|
|
|
|
|
case JackRequest::kClientCheck: { |
|
|
|
jack_log("JackRequest::ClientCheck"); |
|
|
|
JackClientCheckRequest req; |
|
|
|
JackClientCheckResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus); |
|
|
|
res.Write(fPipe); |
|
|
|
// Atomic ClientCheck followed by ClientOpen on same pipe |
|
|
|
if (req.fOpen) |
|
|
|
HandleRequest(); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kClientOpen: { |
|
|
|
jack_log("JackRequest::ClientOpen"); |
|
|
|
JackClientOpenRequest req; |
|
|
|
JackClientOpenResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
ClientAdd(req.fName, req.fPID, req.fUUID, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kClientClose: { |
|
|
|
jack_log("JackRequest::ClientClose"); |
|
|
|
JackClientCloseRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum); |
|
|
|
res.Write(fPipe); |
|
|
|
ClientRemove(); |
|
|
|
ret = false; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kActivateClient: { |
|
|
|
JackActivateRequest req; |
|
|
|
JackResult res; |
|
|
|
jack_log("JackRequest::ActivateClient"); |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kDeactivateClient: { |
|
|
|
jack_log("JackRequest::DeactivateClient"); |
|
|
|
JackDeactivateRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kRegisterPort: { |
|
|
|
jack_log("JackRequest::RegisterPort"); |
|
|
|
JackPortRegisterRequest req; |
|
|
|
JackPortRegisterResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kUnRegisterPort: { |
|
|
|
jack_log("JackRequest::UnRegisterPort"); |
|
|
|
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: { |
|
|
|
jack_log("JackRequest::ConnectNamePorts"); |
|
|
|
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: { |
|
|
|
jack_log("JackRequest::DisconnectNamePorts"); |
|
|
|
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: { |
|
|
|
jack_log("JackRequest::ConnectPorts"); |
|
|
|
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: { |
|
|
|
jack_log("JackRequest::DisconnectPorts"); |
|
|
|
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::kPortRename: { |
|
|
|
jack_log("JackRequest::PortRename"); |
|
|
|
JackPortRenameRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kSetBufferSize: { |
|
|
|
jack_log("JackRequest::SetBufferSize"); |
|
|
|
JackSetBufferSizeRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->SetBufferSize(req.fBufferSize); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kSetFreeWheel: { |
|
|
|
jack_log("JackRequest::SetFreeWheel"); |
|
|
|
JackSetFreeWheelRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->SetFreewheel(req.fOnOff); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kComputeTotalLatencies: { |
|
|
|
jack_log("JackRequest::ComputeTotalLatencies"); |
|
|
|
JackComputeTotalLatenciesRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->ComputeTotalLatencies(); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kReleaseTimebase: { |
|
|
|
jack_log("JackRequest::ReleaseTimebase"); |
|
|
|
JackReleaseTimebaseRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->ReleaseTimebase(req.fRefNum); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kSetTimebaseCallback: { |
|
|
|
jack_log("JackRequest::SetTimebaseCallback"); |
|
|
|
JackSetTimebaseCallbackRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kGetInternalClientName: { |
|
|
|
jack_log("JackRequest::GetInternalClientName"); |
|
|
|
JackGetInternalClientNameRequest req; |
|
|
|
JackGetInternalClientNameResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kInternalClientHandle: { |
|
|
|
jack_log("JackRequest::InternalClientHandle"); |
|
|
|
JackInternalClientHandleRequest req; |
|
|
|
JackInternalClientHandleResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kInternalClientLoad: { |
|
|
|
jack_log("JackRequest::InternalClientLoad"); |
|
|
|
JackInternalClientLoadRequest req; |
|
|
|
JackInternalClientLoadResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kInternalClientUnload: { |
|
|
|
jack_log("JackRequest::InternalClientUnload"); |
|
|
|
JackInternalClientUnloadRequest req; |
|
|
|
JackInternalClientUnloadResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kNotification: { |
|
|
|
jack_log("JackRequest::Notification"); |
|
|
|
JackClientNotificationRequest req; |
|
|
|
if (req.Read(fPipe) == 0) { |
|
|
|
if (req.fNotify == kQUIT) { |
|
|
|
jack_log("JackRequest::Notification kQUIT"); |
|
|
|
throw JackQuitException(); |
|
|
|
} else { |
|
|
|
fServer->Notify(req.fRefNum, req.fNotify, req.fValue); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kSessionNotify: { |
|
|
|
jack_log("JackRequest::SessionNotify"); |
|
|
|
JackSessionNotifyRequest req; |
|
|
|
if (req.Read(fPipe) == 0) { |
|
|
|
fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, fPipe, NULL); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kSessionReply: { |
|
|
|
jack_log("JackRequest::SessionReply"); |
|
|
|
JackSessionReplyRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) { |
|
|
|
fServer->GetEngine()->SessionReply(req.fRefNum); |
|
|
|
res.fResult = 0; |
|
|
|
} |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kGetClientByUUID: { |
|
|
|
jack_log("JackRequest::GetClientByUUID"); |
|
|
|
JackGetClientNameRequest req; |
|
|
|
JackClientNameResult res; |
|
|
|
if (req.Read(fPipe) == 0) { |
|
|
|
res.fResult = fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName); |
|
|
|
} |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kGetUUIDByClient: { |
|
|
|
jack_log("JackRequest::GetUUIDByClient"); |
|
|
|
JackGetUUIDRequest req; |
|
|
|
JackUUIDResult res; |
|
|
|
if (req.Read(fPipe) == 0) { |
|
|
|
res.fResult = fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID); |
|
|
|
} |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kReserveClientName: { |
|
|
|
jack_log("JackRequest::ReserveClientName"); |
|
|
|
JackReserveNameRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) { |
|
|
|
res.fResult = fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID); |
|
|
|
} |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kClientHasSessionCallback: { |
|
|
|
jack_log("JackRequest::ClientHasSessionCallback"); |
|
|
|
JackClientHasSessionCallbackRequest req; |
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) { |
|
|
|
res.fResult = fServer->GetEngine()->ClientHasSessionCallback(req.fName); |
|
|
|
} |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
jack_log("Unknown request %ld", header.fType); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Unlock the global mutex |
|
|
|
ReleaseMutex(fMutex); |
|
|
|
return ret; |
|
|
|
jack_log("JackClientPipeThread::ClientRemove ref = %d", refnum); |
|
|
|
Close(); |
|
|
|
} |
|
|
|
*/ |
|
|
|
|
|
|
|
void JackClientPipeThread::ClientKill() |
|
|
|
{ |
|
|
|
jack_log("JackClientPipeThread::ClientKill ref = %d", fRefNum); |
|
|
|
|
|
|
|
if (fRefNum == -1) { // Correspond to an already removed client. |
|
|
|
jack_log("Kill a closed client"); |
|
|
|
jack_log("Kill a closed client %x", this); |
|
|
|
} else if (fRefNum == 0) { // Correspond to a still not opened client. |
|
|
|
jack_log("Kill a not opened client"); |
|
|
|
jack_log("Kill a not opened client %x", this); |
|
|
|
} else { |
|
|
|
fServer->ClientKill(fRefNum); |
|
|
|
} |
|
|
@@ -564,7 +200,6 @@ void JackWinNamedPipeServerChannel::Stop() |
|
|
|
fThread.Kill(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool JackWinNamedPipeServerChannel::Init() |
|
|
|
{ |
|
|
|
jack_log("JackWinNamedPipeServerChannel::Init"); |
|
|
@@ -610,11 +245,10 @@ void JackWinNamedPipeServerChannel::ClientAdd(JackWinNamedPipeClient* pipe) |
|
|
|
std::list<JackClientPipeThread*>::iterator it = fClientList.begin(); |
|
|
|
JackClientPipeThread* client; |
|
|
|
|
|
|
|
jack_info("JackWinNamedPipeServerChannel::ClientAdd size %ld", fClientList.size()); |
|
|
|
jack_log("JackWinNamedPipeServerChannel::ClientAdd size %ld", fClientList.size()); |
|
|
|
|
|
|
|
while (it != fClientList.end()) { |
|
|
|
client = *it; |
|
|
|
jack_info("Remove dead client = %x running = %ld ref = %d", client, client->IsRunning(), client->GetRefNum()); |
|
|
|
if (client->IsRunning()) { |
|
|
|
it++; |
|
|
|
} else { |
|
|
@@ -625,6 +259,7 @@ void JackWinNamedPipeServerChannel::ClientAdd(JackWinNamedPipeClient* pipe) |
|
|
|
|
|
|
|
client = new JackClientPipeThread(pipe); |
|
|
|
client->Open(fServer); |
|
|
|
|
|
|
|
// Here we are sure that the client is running (because it's thread is in "running" state). |
|
|
|
fClientList.push_back(client); |
|
|
|
} |
|
|
|