24 size_t messageSize = zmq_msg_size(message);
27 char *
string = (
char *)malloc(messageSize);
28 memcpy(
string, zmq_msg_data(message), messageSize);
37 size_t messageSize = (
string != NULL ? (strlen(
string) + 1) : 0);
38 zmq_msg_init_size(message, messageSize);
39 memcpy(zmq_msg_data(message),
string, messageSize);
47 size_t messageSize =
sizeof(int);
48 zmq_msg_init_size(message, messageSize);
49 memcpy(zmq_msg_data(message), &value, messageSize);
57 size_t messageSize =
sizeof(bool);
58 zmq_msg_init_size(message, messageSize);
59 memcpy(zmq_msg_data(message), &value, messageSize);
68 size_t moreSize =
sizeof more;
69 zmq_getsockopt(socket, ZMQ_RCVMORE, &more, &moreSize);
79 zmq_msg_init(&message);
81 if (zmq_msg_recv(&message, socket, 0) == -1)
86 errorMessage = strdup(
"The connection between the composition and runner timed out when trying to receive a message");
89 const char *eStr = zmq_strerror(e);
90 const char *format =
"The connection between the composition and runner failed when trying to receive a message (%s)";
91 int size = snprintf(NULL, 0, format, eStr);
92 errorMessage = malloc(size+1);
93 snprintf(errorMessage, size+1, format, eStr);
96 *error = errorMessage;
102 zmq_msg_close(&message);
107 zmq_msg_close(&message);
117 zmq_msg_init(&message);
119 if (zmq_msg_recv(&message, socket, 0) == -1)
124 errorMessage = strdup(
"The connection between the composition and runner timed out when trying to receive a message");
126 errorMessage = strdup(
"The connection between the composition and runner failed because the context was terminated when trying to receive a message");
129 const char *eStr = zmq_strerror(e);
130 const char *format =
"The connection between the composition and runner failed when trying to receive a message (%s)";
131 int size = snprintf(NULL, 0, format, eStr);
132 errorMessage = malloc(size+1);
133 snprintf(errorMessage, size+1, format, eStr);
136 *error = errorMessage;
142 zmq_msg_close(&message);
143 bzero(data, dataSize);
147 size_t messageSize = zmq_msg_size(&message);
148 if (messageSize != dataSize)
150 const char *format =
"A wrong-sized message was received in the connection between the composition and runner "
151 "(expected %lu bytes, received %lu bytes)";
152 int size = snprintf(NULL, 0, format, (
unsigned long)dataSize, (
unsigned long)messageSize);
153 char *errorMessage = malloc(size+1);
154 snprintf(errorMessage, size+1, format, (
unsigned long)dataSize, (
unsigned long)messageSize);
156 *error = errorMessage;
162 zmq_msg_close(&message);
163 bzero(data, dataSize);
167 memcpy(data, zmq_msg_data(&message), messageSize);
168 zmq_msg_close(&message);
205 void vuoSend(
const char *name,
void *socket,
int type, zmq_msg_t *messages,
unsigned int messageCount,
bool isNonBlocking,
char **error)
212 zmq_msg_init_size(&message,
sizeof type);
213 memcpy(zmq_msg_data(&message), &type,
sizeof type);
214 int flags = (messageCount > 0 ? ZMQ_SNDMORE : 0) | (isNonBlocking ? ZMQ_DONTWAIT : 0);
215 if (zmq_msg_send(&message, socket, flags) == -1)
217 zmq_msg_close(&message);
221 for(
unsigned int i=0; i<messageCount && e==0; ++i)
223 int flags = (i < messageCount - 1 ? ZMQ_SNDMORE : 0) | (isNonBlocking ? ZMQ_DONTWAIT : 0);
224 if (zmq_msg_send(&messages[i], socket, flags) == -1)
228 for(
unsigned int i=0; i<messageCount; ++i)
229 zmq_msg_close(&messages[i]);
236 const char *format =
"The connection between the composition and runner timed out when trying to send a message of type %i on '%s'";
237 int size = snprintf(NULL, 0, format, type, name);
238 errorMessage = malloc(size+1);
239 snprintf(errorMessage, size+1, format, type, name);
243 const char *eStr = zmq_strerror(e);
244 const char *format =
"The connection between the composition and runner failed when trying to send a message of type %i on '%s' (%s)";
245 int size = snprintf(NULL, 0, format, type, name, eStr);
246 errorMessage = malloc(size+1);
247 snprintf(errorMessage, size+1, format, type, name, eStr);
250 *error = errorMessage;
259 #include <libkern/OSAtomic.h>