#include "mc_protocol.h"
#include "mc_server.h"
#include "mc_private.h"
+#include "mc_ignore.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_server, mc, "MC server logic");
throw std::system_error(res, std::system_category());
XBT_DEBUG("Greeted the MC client");
- MC_init_pid(pid, socket);
-
// Block SIGCHLD (this will be handled with accept/signalfd):
sigset_t set;
sigemptyset(&set);
void s_mc_server::handle_events()
{
- s_mc_message_t message;
+ char buffer[MC_MESSAGE_LENGTH];
struct pollfd* socket_pollfd = &fds[SOCKET_FD_INDEX];
struct pollfd* signalfd_pollfd = &fds[SIGNAL_FD_INDEX];
if (socket_pollfd->revents) {
if (socket_pollfd->revents & POLLIN) {
- ssize_t size = recv(socket_pollfd->fd, &message, sizeof(message), MSG_DONTWAIT);
+
+ ssize_t size = recv(socket_pollfd->fd, buffer, sizeof(buffer), MSG_DONTWAIT);
if (size == -1 && errno != EAGAIN)
throw std::system_error(errno, std::system_category());
- else switch(message.type) {
+
+ s_mc_message_t base_message;
+ if (size < (ssize_t) sizeof(base_message))
+ xbt_die("Broken message");
+ memcpy(&base_message, buffer, sizeof(base_message));
+
+ switch(base_message.type) {
+
+ case MC_MESSAGE_IGNORE_HEAP:
+ {
+ XBT_DEBUG("Received ignored region");
+ s_mc_ignore_heap_message_t message;
+ if (size != sizeof(message))
+ xbt_die("Broken messsage");
+ memcpy(&message, buffer, sizeof(message));
+ mc_heap_ignore_region_t region = xbt_new(s_mc_heap_ignore_region_t, 1);
+ *region = message.region;
+ MC_heap_region_ignore_insert(region);
+ break;
+ }
+
+
+ case MC_MESSAGE_UNIGNORE_HEAP:
+ {
+ XBT_DEBUG("Received unignored region");
+ s_mc_ignore_memory_message_t message;
+ if (size != sizeof(message))
+ xbt_die("Broken messsage");
+ memcpy(&message, buffer, sizeof(message));
+ MC_remove_ignore_heap(message.addr, message.size);
+ break;
+ }
+
+ case MC_MESSAGE_IGNORE_MEMORY:
+ {
+ XBT_DEBUG("Received ignored memory");
+ s_mc_ignore_memory_message_t message;
+ if (size != sizeof(message))
+ xbt_die("Broken messsage");
+ memcpy(&message, buffer, sizeof(message));
+ MC_process_ignore_memory(&mc_model_checker->process,
+ message.addr, message.size);
+ break;
+ }
+
+ case MC_MESSAGE_STACK_REGION:
+ {
+ XBT_DEBUG("Received stack area");
+ s_mc_stack_region_message_t message;
+ if (size != sizeof(message))
+ xbt_die("Broken messsage");
+ memcpy(&message, buffer, sizeof(message));
+ stack_region_t stack_region = xbt_new(s_stack_region_t, 1);
+ *stack_region = message.stack_region;
+ MC_stack_area_add(stack_region);
+ }
+ break;
+
default:
xbt_die("Unexpected message from model-checked application");
+
}
return;
}