Browse Source

Merge b346a8e278 into a92df44112

pull/386/merge
twischer-adit GitHub 4 years ago
parent
commit
54dc1af404
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 418 additions and 723 deletions
  1. +3
    -3
      common/JackGenericClientChannel.cpp
  2. +317
    -639
      common/JackRequest.h
  3. +35
    -35
      common/JackRequestDecoder.cpp
  4. +3
    -1
      common/JackRequestDecoder.h
  5. +16
    -13
      common/jack/systemdeps.h
  6. +37
    -25
      posix/JackSocket.cpp
  7. +4
    -4
      posix/JackSocketServerChannel.cpp
  8. +3
    -3
      windows/JackWinNamedPipeServerChannel.cpp

+ 3
- 3
common/JackGenericClientChannel.cpp View File

@@ -60,13 +60,13 @@ void JackGenericClientChannel::ServerSyncCall(JackRequest* req, JackResult* res,
} }
if (req->Write(fRequest) < 0) { if (req->Write(fRequest) < 0) {
jack_error("Could not write request type = %ld", req->fType);
jack_error("Could not write request type = %ld", req->getType());
*result = -1; *result = -1;
return; return;
} }


if (res->Read(fRequest) < 0) { if (res->Read(fRequest) < 0) {
jack_error("Could not read result type = %ld", req->fType);
jack_error("Could not read result type = %ld", req->getType());
*result = -1; *result = -1;
return; return;
} }
@@ -90,7 +90,7 @@ void JackGenericClientChannel::ServerAsyncCall(JackRequest* req, JackResult* res
} }
if (req->Write(fRequest) < 0) { if (req->Write(fRequest) < 0) {
jack_error("Could not write request type = %ld", req->fType);
jack_error("Could not write request type = %ld", req->getType());
*result = -1; *result = -1;
} else { } else {
*result = 0; *result = 0;


+ 317
- 639
common/JackRequest.h
File diff suppressed because it is too large
View File


+ 35
- 35
common/JackRequestDecoder.cpp View File

@@ -31,8 +31,8 @@ namespace Jack
{ {


#define CheckRead(req, socket) { if (req.Read(socket) < 0) { jack_error("CheckRead error"); return -1; } } #define CheckRead(req, socket) { if (req.Read(socket) < 0) { jack_error("CheckRead error"); return -1; } }
#define CheckWriteName(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error name = %s", error, req.fName); } }
#define CheckWriteRefNum(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error ref = %d", error, req.fRefNum); } }
#define CheckWriteName(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error name = %s", error, req.d.fName); } }
#define CheckWriteRefNum(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error ref = %d", error, req.d.fRefNum); } }
#define CheckWrite(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error", error); } } #define CheckWrite(error, socket) { if (res.Write(socket) < 0) { jack_error("%s write error", error); } }


JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler) JackRequestDecoder::JackRequestDecoder(JackServer* server, JackClientHandlerInterface* handler)
@@ -54,13 +54,13 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackClientCheckRequest req; JackClientCheckRequest req;
JackClientCheckResult res; JackClientCheckResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus);
res.fResult = fServer->GetEngine()->ClientCheck(req.d.fName, req.d.fUUID, res.fName, req.d.fProtocol, req.d.fOptions, &res.fStatus);
CheckWriteName("JackRequest::ClientCheck", socket); CheckWriteName("JackRequest::ClientCheck", socket);
// Atomic ClientCheck followed by ClientOpen on same socket // Atomic ClientCheck followed by ClientOpen on same socket
if (req.fOpen) {
JackRequest header;
header.Read(socket);
return HandleRequest(socket, header.fType);
if (req.d.fOpen) {
JackRequest::RequestType type;
JackRequest::ReadType(socket, type);
return HandleRequest(socket, type);
} }
break; break;
} }
@@ -80,9 +80,9 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackClientCloseRequest req; JackClientCloseRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientExternalClose(req.fRefNum);
res.fResult = fServer->GetEngine()->ClientExternalClose(req.d.fRefNum);
CheckWriteRefNum("JackRequest::ClientClose", socket); CheckWriteRefNum("JackRequest::ClientClose", socket);
fHandler->ClientRemove(socket, req.fRefNum);
fHandler->ClientRemove(socket, req.d.fRefNum);
// Will cause the wrapping thread to stop // Will cause the wrapping thread to stop
return -1; return -1;
} }
@@ -92,7 +92,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackResult res; JackResult res;
jack_log("JackRequest::ActivateClient"); jack_log("JackRequest::ActivateClient");
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientActivate(req.fRefNum, req.fIsRealTime);
res.fResult = fServer->GetEngine()->ClientActivate(req.d.fRefNum, req.d.fIsRealTime);
CheckWriteRefNum("JackRequest::ActivateClient", socket); CheckWriteRefNum("JackRequest::ActivateClient", socket);
break; break;
} }
@@ -102,7 +102,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackDeactivateRequest req; JackDeactivateRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientDeactivate(req.fRefNum);
res.fResult = fServer->GetEngine()->ClientDeactivate(req.d.fRefNum);
CheckWriteRefNum("JackRequest::DeactivateClient", socket); CheckWriteRefNum("JackRequest::DeactivateClient", socket);
break; break;
} }
@@ -112,7 +112,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackPortRegisterRequest req; JackPortRegisterRequest req;
JackPortRegisterResult res; JackPortRegisterResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex);
res.fResult = fServer->GetEngine()->PortRegister(req.d.fRefNum, req.d.fName, req.d.fPortType, req.d.fFlags, req.d.fBufferSize, &res.fPortIndex);
CheckWriteRefNum("JackRequest::RegisterPort", socket); CheckWriteRefNum("JackRequest::RegisterPort", socket);
break; break;
} }
@@ -122,7 +122,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackPortUnRegisterRequest req; JackPortUnRegisterRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);
res.fResult = fServer->GetEngine()->PortUnRegister(req.d.fRefNum, req.d.fPortIndex);
CheckWriteRefNum("JackRequest::UnRegisterPort", socket); CheckWriteRefNum("JackRequest::UnRegisterPort", socket);
break; break;
} }
@@ -132,7 +132,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackPortConnectNameRequest req; JackPortConnectNameRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
res.fResult = fServer->GetEngine()->PortConnect(req.d.fRefNum, req.d.fSrc, req.d.fDst);
CheckWriteRefNum("JackRequest::ConnectNamePorts", socket); CheckWriteRefNum("JackRequest::ConnectNamePorts", socket);
break; break;
} }
@@ -142,7 +142,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackPortDisconnectNameRequest req; JackPortDisconnectNameRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
res.fResult = fServer->GetEngine()->PortDisconnect(req.d.fRefNum, req.d.fSrc, req.d.fDst);
CheckWriteRefNum("JackRequest::DisconnectNamePorts", socket); CheckWriteRefNum("JackRequest::DisconnectNamePorts", socket);
break; break;
} }
@@ -152,7 +152,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackPortConnectRequest req; JackPortConnectRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
res.fResult = fServer->GetEngine()->PortConnect(req.d.fRefNum, req.d.fSrc, req.d.fDst);
CheckWriteRefNum("JackRequest::ConnectPorts", socket); CheckWriteRefNum("JackRequest::ConnectPorts", socket);
break; break;
} }
@@ -162,7 +162,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackPortDisconnectRequest req; JackPortDisconnectRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst);
res.fResult = fServer->GetEngine()->PortDisconnect(req.d.fRefNum, req.d.fSrc, req.d.fDst);
CheckWriteRefNum("JackRequest::DisconnectPorts", socket); CheckWriteRefNum("JackRequest::DisconnectPorts", socket);
break; break;
} }
@@ -172,7 +172,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackPortRenameRequest req; JackPortRenameRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->PortRename(req.fRefNum, req.fPort, req.fName);
res.fResult = fServer->GetEngine()->PortRename(req.d.fRefNum, req.d.fPort, req.d.fName);
CheckWriteRefNum("JackRequest::PortRename", socket); CheckWriteRefNum("JackRequest::PortRename", socket);
break; break;
} }
@@ -182,7 +182,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackSetBufferSizeRequest req; JackSetBufferSizeRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->SetBufferSize(req.fBufferSize);
res.fResult = fServer->SetBufferSize(req.d.fBufferSize);
CheckWrite("JackRequest::SetBufferSize", socket); CheckWrite("JackRequest::SetBufferSize", socket);
break; break;
} }
@@ -192,7 +192,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackSetFreeWheelRequest req; JackSetFreeWheelRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->SetFreewheel(req.fOnOff);
res.fResult = fServer->SetFreewheel(req.d.fOnOff);
CheckWrite("JackRequest::SetFreeWheel", socket); CheckWrite("JackRequest::SetFreeWheel", socket);
break; break;
} }
@@ -212,7 +212,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackReleaseTimebaseRequest req; JackReleaseTimebaseRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->ReleaseTimebase(req.fRefNum);
res.fResult = fServer->ReleaseTimebase(req.d.fRefNum);
CheckWriteRefNum("JackRequest::ReleaseTimebase", socket); CheckWriteRefNum("JackRequest::ReleaseTimebase", socket);
break; break;
} }
@@ -222,7 +222,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackSetTimebaseCallbackRequest req; JackSetTimebaseCallbackRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->SetTimebaseCallback(req.fRefNum, req.fConditionnal);
res.fResult = fServer->SetTimebaseCallback(req.d.fRefNum, req.d.fConditionnal);
CheckWriteRefNum("JackRequest::SetTimebaseCallback", socket); CheckWriteRefNum("JackRequest::SetTimebaseCallback", socket);
break; break;
} }
@@ -232,7 +232,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackGetInternalClientNameRequest req; JackGetInternalClientNameRequest req;
JackGetInternalClientNameResult res; JackGetInternalClientNameResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName);
res.fResult = fServer->GetEngine()->GetInternalClientName(req.d.fIntRefNum, res.fName);
CheckWriteRefNum("JackRequest::GetInternalClientName", socket); CheckWriteRefNum("JackRequest::GetInternalClientName", socket);
break; break;
} }
@@ -242,7 +242,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackInternalClientHandleRequest req; JackInternalClientHandleRequest req;
JackInternalClientHandleResult res; JackInternalClientHandleResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum);
res.fResult = fServer->GetEngine()->InternalClientHandle(req.d.fName, &res.fStatus, &res.fIntRefNum);
CheckWriteRefNum("JackRequest::InternalClientHandle", socket); CheckWriteRefNum("JackRequest::InternalClientHandle", socket);
break; break;
} }
@@ -252,7 +252,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackInternalClientLoadRequest req; JackInternalClientLoadRequest req;
JackInternalClientLoadResult res; JackInternalClientLoadResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->InternalClientLoad1(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, req.fUUID, &res.fStatus);
res.fResult = fServer->InternalClientLoad1(req.d.fName, req.d.fDllName, req.d.fLoadInitName, req.d.fOptions, &res.fIntRefNum, req.d.fUUID, &res.fStatus);
CheckWriteName("JackRequest::InternalClientLoad", socket); CheckWriteName("JackRequest::InternalClientLoad", socket);
break; break;
} }
@@ -262,7 +262,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackInternalClientUnloadRequest req; JackInternalClientUnloadRequest req;
JackInternalClientUnloadResult res; JackInternalClientUnloadResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus);
res.fResult = fServer->GetEngine()->InternalClientUnload(req.d.fIntRefNum, &res.fStatus);
CheckWriteRefNum("JackRequest::InternalClientUnload", socket); CheckWriteRefNum("JackRequest::InternalClientUnload", socket);
break; break;
} }
@@ -271,11 +271,11 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
jack_log("JackRequest::Notification"); jack_log("JackRequest::Notification");
JackClientNotificationRequest req; JackClientNotificationRequest req;
CheckRead(req, socket); CheckRead(req, socket);
if (req.fNotify == kQUIT) {
if (req.d.fNotify == kQUIT) {
jack_log("JackRequest::Notification kQUIT"); jack_log("JackRequest::Notification kQUIT");
throw JackQuitException(); throw JackQuitException();
} else { } else {
fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
fServer->Notify(req.d.fRefNum, req.d.fNotify, req.d.fValue);
} }
break; break;
} }
@@ -284,7 +284,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
jack_log("JackRequest::SessionNotify"); jack_log("JackRequest::SessionNotify");
JackSessionNotifyRequest req; JackSessionNotifyRequest req;
CheckRead(req, socket); CheckRead(req, socket);
fServer->GetEngine()->SessionNotify(req.fRefNum, req.fDst, req.fEventType, req.fPath, socket, NULL);
fServer->GetEngine()->SessionNotify(req.d.fRefNum, req.d.fDst, req.d.fEventType, req.d.fPath, socket, NULL);
break; break;
} }


@@ -293,7 +293,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackSessionReplyRequest req; JackSessionReplyRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->SessionReply(req.fRefNum);
res.fResult = fServer->GetEngine()->SessionReply(req.d.fRefNum);
CheckWrite("JackRequest::SessionReply", socket); CheckWrite("JackRequest::SessionReply", socket);
break; break;
} }
@@ -303,7 +303,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackGetClientNameRequest req; JackGetClientNameRequest req;
JackClientNameResult res; JackClientNameResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName);
res.fResult = fServer->GetEngine()->GetClientNameForUUID(req.d.fUUID, res.fName);
CheckWrite("JackRequest::GetClientByUUID", socket); CheckWrite("JackRequest::GetClientByUUID", socket);
break; break;
} }
@@ -313,7 +313,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackGetUUIDRequest req; JackGetUUIDRequest req;
JackUUIDResult res; JackUUIDResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID);
res.fResult = fServer->GetEngine()->GetUUIDForClientName(req.d.fName, res.fUUID);
CheckWrite("JackRequest::GetUUIDByClient", socket); CheckWrite("JackRequest::GetUUIDByClient", socket);
break; break;
} }
@@ -323,7 +323,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackReserveNameRequest req; JackReserveNameRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID);
res.fResult = fServer->GetEngine()->ReserveClientName(req.d.fName, req.d.fUUID);
CheckWrite("JackRequest::ReserveClientName", socket); CheckWrite("JackRequest::ReserveClientName", socket);
break; break;
} }
@@ -333,7 +333,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
JackClientHasSessionCallbackRequest req; JackClientHasSessionCallbackRequest req;
JackResult res; JackResult res;
CheckRead(req, socket); CheckRead(req, socket);
res.fResult = fServer->GetEngine()->ClientHasSessionCallback(req.fName);
res.fResult = fServer->GetEngine()->ClientHasSessionCallback(req.d.fName);
CheckWrite("JackRequest::ClientHasSessionCallback", socket); CheckWrite("JackRequest::ClientHasSessionCallback", socket);
break; break;
} }
@@ -342,7 +342,7 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
jack_log("JackRequest::PropertyChangeNotify"); jack_log("JackRequest::PropertyChangeNotify");
JackPropertyChangeNotifyRequest req; JackPropertyChangeNotifyRequest req;
CheckRead(req, socket); CheckRead(req, socket);
fServer->GetEngine()->PropertyChangeNotify(req.fSubject, req.fKey, req.fChange);
fServer->GetEngine()->PropertyChangeNotify(req.d.fSubject, req.d.fKey, req.d.fChange);
break; break;
} }




+ 3
- 1
common/JackRequestDecoder.h View File

@@ -26,7 +26,9 @@ namespace Jack
{ {


class JackServer; class JackServer;
struct JackClientOpenRequest;
template<class DATA> struct JackRequestTemplate;
struct JackClientOpenRequestData;
typedef JackRequestTemplate<JackClientOpenRequestData> JackClientOpenRequest;
struct JackClientOpenResult; struct JackClientOpenResult;


struct JackClientHandlerInterface { struct JackClientHandlerInterface {


+ 16
- 13
common/jack/systemdeps.h View File

@@ -20,10 +20,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#ifndef __jack_systemdeps_h__ #ifndef __jack_systemdeps_h__
#define __jack_systemdeps_h__ #define __jack_systemdeps_h__


#ifndef POST_PACKED_STRUCTURE
#ifndef POST_PACKED_STRUCTURE_ALWAYS


#ifdef __GNUC__ #ifdef __GNUC__
/* POST_PACKED_STRUCTURE needs to be a macro which
/* POST_PACKED_STRUCTURE_ALWAYS needs to be a macro which
expands into a compiler directive. The directive must expands into a compiler directive. The directive must
tell the compiler to arrange the preceding structure tell the compiler to arrange the preceding structure
declaration so that it is packed on byte-boundaries rather declaration so that it is packed on byte-boundaries rather
@@ -31,27 +31,27 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
compiler. compiler.
*/ */


#define PRE_PACKED_STRUCTURE
#define POST_PACKED_STRUCTURE __attribute__((__packed__))
#define PRE_PACKED_STRUCTURE_ALWAYS
#define POST_PACKED_STRUCTURE_ALWAYS __attribute__((__packed__))


#else #else
#ifdef _MSC_VER #ifdef _MSC_VER
#define PRE_PACKED_STRUCTURE1 __pragma(pack(push,1))
#define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE1
/* PRE_PACKED_STRUCTURE needs to be a macro which
#define PRE_PACKED_STRUCTURE_ALWAYS1 __pragma(pack(push,1))
#define PRE_PACKED_STRUCTURE_ALWAYS PRE_PACKED_STRUCTURE_ALWAYS1
/* PRE_PACKED_STRUCTURE_ALWAYS needs to be a macro which
expands into a compiler directive. The directive must expands into a compiler directive. The directive must
tell the compiler to arrange the following structure tell the compiler to arrange the following structure
declaration so that it is packed on byte-boundaries rather declaration so that it is packed on byte-boundaries rather
than use the natural alignment of the processor and/or than use the natural alignment of the processor and/or
compiler. compiler.
*/ */
#define POST_PACKED_STRUCTURE ;__pragma(pack(pop))
/* and POST_PACKED_STRUCTURE needs to be a macro which
#define POST_PACKED_STRUCTURE_ALWAYS ;__pragma(pack(pop))
/* and POST_PACKED_STRUCTURE_ALWAYS needs to be a macro which
restores the packing to its previous setting */ restores the packing to its previous setting */
#else #else
#define PRE_PACKED_STRUCTURE
#define POST_PACKED_STRUCTURE
#define PRE_PACKED_STRUCTURE_ALWAYS
#define POST_PACKED_STRUCTURE_ALWAYS
#endif /* _MSC_VER */ #endif /* _MSC_VER */


#endif /* __GNUC__ */ #endif /* __GNUC__ */
@@ -125,9 +125,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#endif /* __APPLE__ || __linux__ || __sun__ || sun */ #endif /* __APPLE__ || __linux__ || __sun__ || sun */


#if defined(__arm__) || defined(__aarch64__) || defined(__mips__) || defined(__ppc__) || defined(__powerpc__) #if defined(__arm__) || defined(__aarch64__) || defined(__mips__) || defined(__ppc__) || defined(__powerpc__)
#undef POST_PACKED_STRUCTURE
#define PRE_PACKED_STRUCTURE
#define POST_PACKED_STRUCTURE #define POST_PACKED_STRUCTURE
#endif /* __arm__ || __aarch64__ || __ppc__ || __powerpc__ */
#else
#define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE_ALWAYS
#define POST_PACKED_STRUCTURE POST_PACKED_STRUCTURE_ALWAYS
#endif /* __arm__ || __aarch64__ || __mips__ || __ppc__ || __powerpc__ */


/** define JACK_LIB_EXPORT, useful for internal clients */ /** define JACK_LIB_EXPORT, useful for internal clients */
#if defined(_WIN32) #if defined(_WIN32)


+ 37
- 25
posix/JackSocket.cpp View File

@@ -132,7 +132,7 @@ int JackClientSocket::Connect(const char* dir, const char* name, int which) // A


addr.sun_family = AF_UNIX; addr.sun_family = AF_UNIX;
BuildName(name, addr.sun_path, dir, which, sizeof(addr.sun_path), fPromiscuous); BuildName(name, addr.sun_path, dir, which, sizeof(addr.sun_path), fPromiscuous);
jack_log("JackClientSocket::Connect : addr.sun_path %s", addr.sun_path);
jack_log("JackClientSocket::Connect : addr.sun_path %s (fd %d)", addr.sun_path, fSocket);


if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) { if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
jack_error("Cannot connect to server socket err = %s", strerror(errno)); jack_error("Cannot connect to server socket err = %s", strerror(errno));
@@ -166,6 +166,8 @@ int JackClientSocket::Close()


int JackClientSocket::Read(void* data, int len) int JackClientSocket::Read(void* data, int len)
{ {
int pos = 0;
uint8_t* buffer = (uint8_t*)data;
int res; int res;


#if defined(__sun__) || defined(sun) #if defined(__sun__) || defined(sun)
@@ -193,25 +195,31 @@ int JackClientSocket::Read(void* data, int len)
} }
#endif #endif


if ((res = read(fSocket, data, len)) != len) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_error("JackClientSocket::Read time out");
return 0; // For a non blocking socket, a read failure is not considered as an error
} else if (res != 0) {
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
//return 0;
return -1;
} else {
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
while ((res = read(fSocket, &buffer[pos], len)) != len) {
if (res < 0) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_error("JackClientSocket::Read time out on socket fd = %d", fSocket);
return 0; // For a non blocking socket, a read failure is not considered as an error
} else {
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
return -1;
}
} else if (res == 0) {
jack_error("Cannot read socket fd = %d err = connection closed", fSocket);
return -1; return -1;
} }
} else {
return 0;

pos += res;
len -= res;
} }

return 0;
} }


int JackClientSocket::Write(void* data, int len) int JackClientSocket::Write(void* data, int len)
{ {
int pos = 0;
uint8_t* buffer = (uint8_t*)data;
int res; int res;


#if defined(__sun__) || defined(sun) #if defined(__sun__) || defined(sun)
@@ -239,21 +247,25 @@ int JackClientSocket::Write(void* data, int len)
} }
#endif #endif


if ((res = write(fSocket, data, len)) != len) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_log("JackClientSocket::Write time out");
return 0; // For a non blocking socket, a write failure is not considered as an error
} else if (res != 0) {
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
//return 0;
return -1;
} else {
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
while ((res = write(fSocket, &buffer[pos], len)) != len) {
if (res < 0) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_log("JackClientSocket::Write time out on socket fd = %d", fSocket);
return 0; // For a non blocking socket, a write failure is not considered as an error
} else {
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
return -1;
}
} else if (res == 0) {
jack_error("Cannot write socket fd = %ld err = connection closed", fSocket);
return -1; return -1;
} }
} else {
return 0;

pos += res;
len -= res;
} }

return 0;
} }


JackServerSocket::JackServerSocket(): fSocket( -1) JackServerSocket::JackServerSocket(): fSocket( -1)


+ 4
- 4
posix/JackSocketServerChannel.cpp View File

@@ -128,7 +128,7 @@ int JackSocketServerChannel::GetFd(JackClientSocket* socket_aux)
void JackSocketServerChannel::ClientAdd(detail::JackChannelTransactionInterface* socket_aux, JackClientOpenRequest* req, JackClientOpenResult *res) void JackSocketServerChannel::ClientAdd(detail::JackChannelTransactionInterface* socket_aux, JackClientOpenRequest* req, JackClientOpenResult *res)
{ {
int refnum = -1; int refnum = -1;
res->fResult = fServer->GetEngine()->ClientExternalOpen(req->fName, req->fPID, req->fUUID, &refnum, &res->fSharedEngine, &res->fSharedClient, &res->fSharedGraph);
res->fResult = fServer->GetEngine()->ClientExternalOpen(req->d.fName, req->d.fPID, req->d.fUUID, &refnum, &res->fSharedEngine, &res->fSharedClient, &res->fSharedGraph);
if (res->fResult == 0) { if (res->fResult == 0) {
JackClientSocket* socket = dynamic_cast<JackClientSocket*>(socket_aux); JackClientSocket* socket = dynamic_cast<JackClientSocket*>(socket_aux);
assert(socket); assert(socket);
@@ -235,14 +235,14 @@ bool JackSocketServerChannel::Execute()
} else if (fPollTable[i].revents & POLLIN) { } else if (fPollTable[i].revents & POLLIN) {
JackClientSocket* socket = fSocketTable[fd].second; JackClientSocket* socket = fSocketTable[fd].second;
// Decode header // Decode header
JackRequest header;
if (header.Read(socket) < 0) {
JackRequest::RequestType type;
if (JackRequest::ReadType(socket, type) < 0) {
jack_log("JackSocketServerChannel::Execute : cannot decode header"); jack_log("JackSocketServerChannel::Execute : cannot decode header");
ClientKill(fd); ClientKill(fd);
// Decode request // Decode request
} else { } else {
// Result is not needed here // Result is not needed here
fDecoder->HandleRequest(socket, header.fType);
fDecoder->HandleRequest(socket, type);
} }
} }
} }


+ 3
- 3
windows/JackWinNamedPipeServerChannel.cpp View File

@@ -83,8 +83,8 @@ bool JackClientPipeThread::Execute()
try { try {


jack_log("JackClientPipeThread::Execute %x", this); jack_log("JackClientPipeThread::Execute %x", this);
JackRequest header;
int res = header.Read(fPipe);
JackRequest::RequestType type;
int res = JackRequest::ReadType(fPipe, type);
bool ret = true; bool ret = true;


// Lock the global mutex // Lock the global mutex
@@ -98,7 +98,7 @@ bool JackClientPipeThread::Execute()
ClientKill(); ClientKill();
ret = false; ret = false;
// Decode request // Decode request
} else if (fDecoder->HandleRequest(fPipe, header.fType) < 0) {
} else if (fDecoder->HandleRequest(fPipe, type) < 0) {
ret = false; ret = false;
} }




Loading…
Cancel
Save