+void AppSide::handle_fork(const s_mc_message_fork_t* msg)
+{
+ int status;
+ int pid;
+ /* Reap any zombie child, saving its status for later use in AppSide::handle_wait_child() */
+ while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
+ child_statuses_[pid] = status;
+
+ pid = fork();
+ xbt_assert(pid >= 0, "Could not fork application sub-process: %s.", strerror(errno));
+
+ if (pid == 0) { // Child
+ int sock = socket(AF_UNIX,
+#ifdef __APPLE__
+ SOCK_STREAM, /* Mac OSX does not have AF_UNIX + SOCK_SEQPACKET, even if that's faster*/
+#else
+ SOCK_SEQPACKET,
+#endif
+ 0);
+
+ struct sockaddr_un addr = {};
+ addr.sun_family = AF_UNIX;
+ std::copy_n(begin(msg->socket_name), MC_SOCKET_NAME_LEN, addr.sun_path);
+
+ xbt_assert(connect(sock, (struct sockaddr*)&addr, sizeof addr) >= 0, "Cannot connect to Checker on %c%s: %s.",
+ (addr.sun_path[0] ? addr.sun_path[0] : '@'), addr.sun_path + 1, strerror(errno));
+
+ channel_.reset_socket(sock);
+
+ s_mc_message_int_t answer = {};
+ answer.type = MessageType::FORK_REPLY;
+ answer.value = getpid();
+ xbt_assert(channel_.send(answer) == 0, "Could not send response to WAIT_CHILD_REPLY: %s", strerror(errno));
+ } else {
+ XBT_VERB("App %d forks subprocess %d.", getpid(), pid);
+ }
+}
+void AppSide::handle_wait_child(const s_mc_message_int_t* msg)