Fix: Remove MSG_NOSIGNAL from HelperIPC.cpp, fix include paths for macOS
Browse files- Source/Helper/HelperIPC.cpp +14 -13
Source/Helper/HelperIPC.cpp
CHANGED
|
@@ -1,19 +1,20 @@
|
|
| 1 |
#include "HelperIPC.h"
|
| 2 |
#include "HelperPluginHost.h"
|
| 3 |
-
#include "
|
| 4 |
|
| 5 |
#include <sys/socket.h>
|
| 6 |
#include <sys/un.h>
|
| 7 |
#include <unistd.h>
|
| 8 |
#include <poll.h>
|
|
|
|
| 9 |
|
| 10 |
-
// Using nlohmann json (shared with parent)
|
| 11 |
#include "json.hpp"
|
| 12 |
using json = nlohmann::json;
|
| 13 |
|
| 14 |
HelperIPC::HelperIPC(int parentPid, HelperPluginHost& host)
|
| 15 |
: parentPid(parentPid), host(host)
|
| 16 |
{
|
|
|
|
| 17 |
}
|
| 18 |
|
| 19 |
HelperIPC::~HelperIPC()
|
|
@@ -28,23 +29,25 @@ bool HelperIPC::connect()
|
|
| 28 |
socketFd = socket(AF_UNIX, SOCK_STREAM, 0);
|
| 29 |
if (socketFd < 0) return false;
|
| 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
struct sockaddr_un addr;
|
| 32 |
memset(&addr, 0, sizeof(addr));
|
| 33 |
addr.sun_family = AF_UNIX;
|
| 34 |
strncpy(addr.sun_path, socketPath.c_str(), sizeof(addr.sun_path) - 1);
|
| 35 |
|
| 36 |
-
|
| 37 |
-
int retries = 50; // 5 seconds total
|
| 38 |
while (retries-- > 0)
|
| 39 |
{
|
| 40 |
if (::connect(socketFd, (struct sockaddr*)&addr, sizeof(addr)) == 0)
|
| 41 |
{
|
| 42 |
-
// Connected — start listening
|
| 43 |
running.store(true);
|
| 44 |
listenThread = std::thread([this]() { listenLoop(); });
|
| 45 |
return true;
|
| 46 |
}
|
| 47 |
-
usleep(100000);
|
| 48 |
}
|
| 49 |
|
| 50 |
close(socketFd);
|
|
@@ -68,13 +71,13 @@ void HelperIPC::disconnect()
|
|
| 68 |
void HelperIPC::sendReady()
|
| 69 |
{
|
| 70 |
json msg = {{"notify", "ready"}};
|
| 71 |
-
sendMessage(msg.dump());
|
| 72 |
}
|
| 73 |
|
| 74 |
void HelperIPC::sendParamChanged(int index, float value)
|
| 75 |
{
|
| 76 |
json msg = {{"notify", "param_changed"}, {"index", index}, {"value", value}};
|
| 77 |
-
sendMessage(msg.dump());
|
| 78 |
}
|
| 79 |
|
| 80 |
void HelperIPC::sendMessage(const juce::String& jsonStr)
|
|
@@ -83,8 +86,8 @@ void HelperIPC::sendMessage(const juce::String& jsonStr)
|
|
| 83 |
|
| 84 |
auto data = jsonStr + "\n";
|
| 85 |
auto bytes = data.toRawUTF8();
|
| 86 |
-
auto len = data.getNumBytesAsUTF8();
|
| 87 |
-
::send(socketFd, bytes, len,
|
| 88 |
}
|
| 89 |
|
| 90 |
void HelperIPC::listenLoop()
|
|
@@ -98,13 +101,12 @@ void HelperIPC::listenLoop()
|
|
| 98 |
pfd.fd = socketFd;
|
| 99 |
pfd.events = POLLIN;
|
| 100 |
|
| 101 |
-
int ret = poll(&pfd, 1, 200);
|
| 102 |
if (ret <= 0) continue;
|
| 103 |
|
| 104 |
ssize_t n = recv(socketFd, chunk, sizeof(chunk) - 1, 0);
|
| 105 |
if (n <= 0)
|
| 106 |
{
|
| 107 |
-
// Parent disconnected or error
|
| 108 |
DBG("HelperIPC: Parent disconnected");
|
| 109 |
juce::JUCEApplication::getInstance()->systemRequestedQuit();
|
| 110 |
return;
|
|
@@ -113,7 +115,6 @@ void HelperIPC::listenLoop()
|
|
| 113 |
chunk[n] = '\0';
|
| 114 |
buffer += chunk;
|
| 115 |
|
| 116 |
-
// Process complete messages (newline-delimited)
|
| 117 |
size_t pos;
|
| 118 |
while ((pos = buffer.find('\n')) != std::string::npos)
|
| 119 |
{
|
|
|
|
| 1 |
#include "HelperIPC.h"
|
| 2 |
#include "HelperPluginHost.h"
|
| 3 |
+
#include "IPCProtocol.h"
|
| 4 |
|
| 5 |
#include <sys/socket.h>
|
| 6 |
#include <sys/un.h>
|
| 7 |
#include <unistd.h>
|
| 8 |
#include <poll.h>
|
| 9 |
+
#include <signal.h>
|
| 10 |
|
|
|
|
| 11 |
#include "json.hpp"
|
| 12 |
using json = nlohmann::json;
|
| 13 |
|
| 14 |
HelperIPC::HelperIPC(int parentPid, HelperPluginHost& host)
|
| 15 |
: parentPid(parentPid), host(host)
|
| 16 |
{
|
| 17 |
+
signal(SIGPIPE, SIG_IGN);
|
| 18 |
}
|
| 19 |
|
| 20 |
HelperIPC::~HelperIPC()
|
|
|
|
| 29 |
socketFd = socket(AF_UNIX, SOCK_STREAM, 0);
|
| 30 |
if (socketFd < 0) return false;
|
| 31 |
|
| 32 |
+
// Set SO_NOSIGPIPE (macOS)
|
| 33 |
+
int nosigpipe = 1;
|
| 34 |
+
setsockopt(socketFd, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe));
|
| 35 |
+
|
| 36 |
struct sockaddr_un addr;
|
| 37 |
memset(&addr, 0, sizeof(addr));
|
| 38 |
addr.sun_family = AF_UNIX;
|
| 39 |
strncpy(addr.sun_path, socketPath.c_str(), sizeof(addr.sun_path) - 1);
|
| 40 |
|
| 41 |
+
int retries = 50;
|
|
|
|
| 42 |
while (retries-- > 0)
|
| 43 |
{
|
| 44 |
if (::connect(socketFd, (struct sockaddr*)&addr, sizeof(addr)) == 0)
|
| 45 |
{
|
|
|
|
| 46 |
running.store(true);
|
| 47 |
listenThread = std::thread([this]() { listenLoop(); });
|
| 48 |
return true;
|
| 49 |
}
|
| 50 |
+
usleep(100000);
|
| 51 |
}
|
| 52 |
|
| 53 |
close(socketFd);
|
|
|
|
| 71 |
void HelperIPC::sendReady()
|
| 72 |
{
|
| 73 |
json msg = {{"notify", "ready"}};
|
| 74 |
+
sendMessage(juce::String(msg.dump()));
|
| 75 |
}
|
| 76 |
|
| 77 |
void HelperIPC::sendParamChanged(int index, float value)
|
| 78 |
{
|
| 79 |
json msg = {{"notify", "param_changed"}, {"index", index}, {"value", value}};
|
| 80 |
+
sendMessage(juce::String(msg.dump()));
|
| 81 |
}
|
| 82 |
|
| 83 |
void HelperIPC::sendMessage(const juce::String& jsonStr)
|
|
|
|
| 86 |
|
| 87 |
auto data = jsonStr + "\n";
|
| 88 |
auto bytes = data.toRawUTF8();
|
| 89 |
+
auto len = (size_t)data.getNumBytesAsUTF8();
|
| 90 |
+
::send(socketFd, bytes, len, 0);
|
| 91 |
}
|
| 92 |
|
| 93 |
void HelperIPC::listenLoop()
|
|
|
|
| 101 |
pfd.fd = socketFd;
|
| 102 |
pfd.events = POLLIN;
|
| 103 |
|
| 104 |
+
int ret = poll(&pfd, 1, 200);
|
| 105 |
if (ret <= 0) continue;
|
| 106 |
|
| 107 |
ssize_t n = recv(socketFd, chunk, sizeof(chunk) - 1, 0);
|
| 108 |
if (n <= 0)
|
| 109 |
{
|
|
|
|
| 110 |
DBG("HelperIPC: Parent disconnected");
|
| 111 |
juce::JUCEApplication::getInstance()->systemRequestedQuit();
|
| 112 |
return;
|
|
|
|
| 115 |
chunk[n] = '\0';
|
| 116 |
buffer += chunk;
|
| 117 |
|
|
|
|
| 118 |
size_t pos;
|
| 119 |
while ((pos = buffer.find('\n')) != std::string::npos)
|
| 120 |
{
|