RAM2118 commited on
Commit
0f12a9a
·
verified ·
1 Parent(s): 7ba3088

Fix: Remove MSG_NOSIGNAL from HelperIPC.cpp, fix include paths for macOS

Browse files
Files changed (1) hide show
  1. 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 "../Shared/IPCProtocol.h"
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
- // Try to connect (parent should have the socket listening already)
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); // 100ms
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, MSG_NOSIGNAL);
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); // 200ms timeout
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
  {