mc_server_t mc_server;
+struct mc_symbol_pointer_callback
+{
+ mc_process_t process;
+ void* value;
+};
+
+static int mc_symbol_pointer_callback_evaluate(void* p)
+{
+ struct mc_symbol_pointer_callback* callback = (struct mc_symbol_pointer_callback*) p;
+ int value;
+ MC_process_read(callback->process, MC_ADDRESS_SPACE_READ_FLAGS_NONE,
+ &value, callback->value, sizeof(value), MC_PROCESS_INDEX_ANY);
+ return value;
+}
+
s_mc_server::s_mc_server(pid_t pid, int socket)
{
this->pid = pid;
switch(base_message.type) {
case MC_MESSAGE_IGNORE_HEAP:
- XBT_DEBUG("Received ignored region");
- if (size != sizeof(s_mc_ignore_heap_message_t))
- xbt_die("Broken messsage");
- // TODO, handle the message
- break;
+ {
+ 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");
- if (size != sizeof(s_mc_ignore_memory_message_t))
- xbt_die("Broken messsage");
- // TODO, handle the message
- break;
+ {
+ 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");
- if (size != sizeof(s_mc_ignore_memory_message_t))
- xbt_die("Broken messsage");
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;
+ case MC_MESSAGE_REGISTER_SYMBOL:
+ {
+ s_mc_register_symbol_message_t message;
+ if (size != sizeof(message))
+ xbt_die("Broken message");
+ memcpy(&message, buffer, sizeof(message));
+ if (message.callback)
+ xbt_die("Support for callbacks/functions symbols not implemented in client/server mode.");
+ XBT_DEBUG("Received symbol: %s", message.name);
+
+ struct mc_symbol_pointer_callback* callback = xbt_new(struct mc_symbol_pointer_callback, 1);
+ callback->process = &mc_model_checker->process;
+ callback->value = message.data;
+
+ MC_automaton_new_propositional_symbol_callback(message.name,
+ mc_symbol_pointer_callback_evaluate, callback, free);
+ break;
+ }
+
default:
xbt_die("Unexpected message from model-checked application");
else
break;
} else {
- XBT_ERROR("Could not wait for pid: %s", strerror(errno));
+ XBT_ERROR("Could not wait for pid");
throw std::system_error(errno, std::system_category());
}
}