mirror of https://github.com/PCSX2/pcsx2.git
IPC: reply datagram splittage
This commit is contained in:
parent
265c9ec055
commit
f0179b5be6
|
@ -141,21 +141,21 @@ void SocketIPC::ExecuteTaskInThread()
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// socket timeout
|
// socket timeout
|
||||||
DWORD timeout = 10 * 1000; // 10 seconds
|
DWORD tv = 10 * 1000; // 10 seconds
|
||||||
setsockopt(m_msgsock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
|
|
||||||
#else
|
#else
|
||||||
// socket timeout
|
// socket timeout
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
tv.tv_sec = 10;
|
tv.tv_sec = 10;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
setsockopt(m_msgsock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
|
|
||||||
#endif
|
#endif
|
||||||
|
setsockopt(m_msgsock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
|
||||||
|
setsockopt(m_msgsock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&tv, sizeof tv);
|
||||||
|
|
||||||
|
|
||||||
// either int or ssize_t depending on the platform, so we have to
|
// either int or ssize_t depending on the platform, so we have to
|
||||||
// use a bunch of auto
|
// use a bunch of auto
|
||||||
auto receive_length = read_portable(m_msgsock, m_ipc_buffer, MAX_IPC_SIZE);
|
auto receive_length = read_portable(m_msgsock, m_ipc_buffer, MAX_IPC_SIZE);
|
||||||
if (receive_length >= 0)
|
if (receive_length > 0)
|
||||||
{
|
{
|
||||||
// if we already received at least the length then we read it
|
// if we already received at least the length then we read it
|
||||||
auto end_length = 4;
|
auto end_length = 4;
|
||||||
|
@ -227,15 +227,17 @@ SocketIPC::~SocketIPC()
|
||||||
DESTRUCTOR_CATCHALL
|
DESTRUCTOR_CATCHALL
|
||||||
}
|
}
|
||||||
|
|
||||||
char* SocketIPC::MakeOkIPC(char* ret_buffer)
|
char* SocketIPC::MakeOkIPC(char* ret_buffer, uint32_t size = 5)
|
||||||
{
|
{
|
||||||
ret_buffer[0] = IPC_OK;
|
ToArray<uint32_t>(ret_buffer, size, 0);
|
||||||
|
ret_buffer[4] = IPC_OK;
|
||||||
return ret_buffer;
|
return ret_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* SocketIPC::MakeFailIPC(char* ret_buffer)
|
char* SocketIPC::MakeFailIPC(char* ret_buffer, uint32_t size = 5)
|
||||||
{
|
{
|
||||||
ret_buffer[0] = IPC_FAIL;
|
ToArray<uint32_t>(ret_buffer, size, 0);
|
||||||
|
ret_buffer[4] = IPC_FAIL;
|
||||||
return ret_buffer;
|
return ret_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,9 +246,9 @@ SocketIPC::IPCBuffer SocketIPC::ParseCommand(char* buf, char* ret_buffer, u32 bu
|
||||||
// currently all our instructions require a running VM so we check once
|
// currently all our instructions require a running VM so we check once
|
||||||
// here, slightly helps performance
|
// here, slightly helps performance
|
||||||
if (!m_vm->HasActiveMachine())
|
if (!m_vm->HasActiveMachine())
|
||||||
return IPCBuffer{1, MakeFailIPC(ret_buffer)};
|
return IPCBuffer{5, MakeFailIPC(ret_buffer)};
|
||||||
|
|
||||||
u32 ret_cnt = 1;
|
u32 ret_cnt = 5;
|
||||||
u32 buf_cnt = 0;
|
u32 buf_cnt = 0;
|
||||||
|
|
||||||
while (buf_cnt < buf_size)
|
while (buf_cnt < buf_size)
|
||||||
|
@ -254,7 +256,7 @@ SocketIPC::IPCBuffer SocketIPC::ParseCommand(char* buf, char* ret_buffer, u32 bu
|
||||||
// if we haven't received enough byte for the address used in R/W
|
// if we haven't received enough byte for the address used in R/W
|
||||||
// commands and opcode, changeme when address is out of the header!
|
// commands and opcode, changeme when address is out of the header!
|
||||||
if (!SafetyChecks(buf_cnt, 4 + 1, ret_cnt, 0, buf_size))
|
if (!SafetyChecks(buf_cnt, 4 + 1, ret_cnt, 0, buf_size))
|
||||||
return IPCBuffer{1, MakeFailIPC(ret_buffer)};
|
return IPCBuffer{5, MakeFailIPC(ret_buffer)};
|
||||||
|
|
||||||
// YY YY YY YY from schema below
|
// YY YY YY YY from schema below
|
||||||
// curently always used by implemented commands so it is out of the
|
// curently always used by implemented commands so it is out of the
|
||||||
|
@ -351,9 +353,9 @@ SocketIPC::IPCBuffer SocketIPC::ParseCommand(char* buf, char* ret_buffer, u32 bu
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
error:
|
error:
|
||||||
return IPCBuffer{1, MakeFailIPC(ret_buffer)};
|
return IPCBuffer{5, MakeFailIPC(ret_buffer)};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return IPCBuffer{(int)ret_cnt, MakeOkIPC(ret_buffer)};
|
return IPCBuffer{(int)ret_cnt, MakeOkIPC(ret_buffer, ret_cnt)};
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,10 +130,11 @@ protected:
|
||||||
|
|
||||||
/* Formats an IPC buffer
|
/* Formats an IPC buffer
|
||||||
* ret_buffer: return buffer to use.
|
* ret_buffer: return buffer to use.
|
||||||
|
* size: size of the IPC buffer.
|
||||||
* return value: buffer containing the status code allocated of size
|
* return value: buffer containing the status code allocated of size
|
||||||
* size */
|
* size */
|
||||||
static inline char* MakeOkIPC(char* ret_buffer);
|
static inline char* MakeOkIPC(char* ret_buffer, uint32_t size);
|
||||||
static inline char* MakeFailIPC(char* ret_buffer);
|
static inline char* MakeFailIPC(char* ret_buffer, uint32_t size);
|
||||||
|
|
||||||
/* Converts an uint to an char* in little endian
|
/* Converts an uint to an char* in little endian
|
||||||
* res_array: the array to modify
|
* res_array: the array to modify
|
||||||
|
|
Loading…
Reference in New Issue