include src/mc/remote/RemotePtr.hpp
include src/mc/remote/RemoteSimulation.cpp
include src/mc/remote/RemoteSimulation.hpp
-include src/mc/remote/mc_protocol.cpp
include src/mc/remote/mc_protocol.h
include src/mc/sosp/ChunkedData.cpp
include src/mc/sosp/ChunkedData.hpp
#include <string>
#include <vector>
#include <xbt/signal.hpp>
+#include <xbt/utility.hpp>
XBT_LOG_EXTERNAL_CATEGORY(s4u_activity);
Activity& operator=(Activity const&) = delete;
#endif
- enum class State { INITED = 0, STARTING, STARTED, CANCELED, FINISHED };
+ // enum class State { ... }
+ XBT_DECLARE_ENUM_CLASS(State, INITED, STARTING, STARTED, CANCELED, FINISHED);
/** Starts a previously created activity.
*
a16, a15, a14, a13, a12, a11, a10, a9, \
a8, a7, a6, a5, a4, a3, a2, a1, N, ...) N
+/* Expands to number of arguments. */
+#define _XBT_COUNT_ARGS(...) _XBT_IF_ONE_ARG_(__VA_ARGS__, \
+ 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, \
+ 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, \
+ 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, \
+ 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
+
+/* Expands to list with each argument rendered as string. Add more cases if needed. */
+#define _XBT_STRINGIFY_ARGS(...) _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_02_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_02_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_03_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_03_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_04_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_04_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_05_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_05_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_06_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_06_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_07_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_07_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_08_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_08_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_09_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_09_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_10_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_10_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_11_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_11_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_12_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_12_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_13_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_13_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_14_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_14_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_15_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_15_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_16_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_16_(a, ...) #a, _XBT_IF_ONE_ARG(_XBT_STRINGIFY, _XBT_STRINGIFY_A_17_, __VA_ARGS__)(__VA_ARGS__)
+#define _XBT_STRINGIFY_A_17_(...) _XBT_STRINGIFY_ARGS("ERROR: MAXIMUM SIZE REACHED")
+
/* Handle import/export stuff
*
* Rationale of XBT_PUBLIC:
#ifndef XBT_UTILITY_HPP
#define XBT_UTILITY_HPP
-#include <tuple>
+#include <array>
#include <functional>
+#include <tuple>
+#include <xbt/base.h>
+
+/** @brief Helper macro to declare enum class
+ *
+ * Declares an enum class EnumType, and a function "const char* to_c_str(EnumType)" to retrieve a C-string description
+ * for each value.
+ */
+#define XBT_DECLARE_ENUM_CLASS(EnumType, ...) \
+ enum class EnumType; \
+ static constexpr char const* to_c_str(EnumType value) \
+ { \
+ constexpr std::array<const char*, _XBT_COUNT_ARGS(__VA_ARGS__)> names{{_XBT_STRINGIFY_ARGS(__VA_ARGS__)}}; \
+ return names[static_cast<int>(value)]; \
+ } \
+ enum class EnumType { __VA_ARGS__ } /* defined here to handle trailing semicolon */
namespace simgrid {
namespace xbt {
#include "simgrid/modelchecker.h"
#include "src/mc/mc_replay.hpp"
#include "src/simix/smx_private.hpp"
-#include <array>
#include <cmath> // isfinite()
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process);
const char* ActivityImpl::get_state_str() const
{
- constexpr std::array<const char*, 12> names{{"WAITING", "READY", "RUNNING", "DONE", "CANCELED", "FAILED",
- "SRC_HOST_FAILURE", "DST_HOST_FAILURE", "TIMEOUT", "SRC_TIMEOUT",
- "DST_TIMEOUT", "LINK_FAILURE"}};
- return names[static_cast<int>(state_)];
+ return to_c_str(state_);
}
bool ActivityImpl::test()
#include <string>
#include <list>
-#include <xbt/base.h>
#include "simgrid/forward.h"
+#include <xbt/utility.hpp>
#include <atomic>
#include <simgrid/kernel/resource/Action.hpp>
namespace simgrid {
namespace kernel {
namespace activity {
-enum class State {
- WAITING = 0,
- READY,
- RUNNING,
- DONE,
- CANCELED,
- FAILED,
- SRC_HOST_FAILURE,
- DST_HOST_FAILURE,
- TIMEOUT,
- SRC_TIMEOUT,
- DST_TIMEOUT,
- LINK_FAILURE
-};
+
+XBT_DECLARE_ENUM_CLASS(State, WAITING, READY, RUNNING, DONE, CANCELED, FAILED, SRC_HOST_FAILURE, DST_HOST_FAILURE,
+ TIMEOUT, SRC_TIMEOUT, DST_TIMEOUT, LINK_FAILURE);
class XBT_PUBLIC ActivityImpl {
std::atomic_int_fast32_t refcount_{0};
public:
enum class Type { SEND, RECEIVE };
- CommImpl(Type type) : type_(type) {}
+ explicit CommImpl(Type type) : type_(type) {}
CommImpl(s4u::Host* from, s4u::Host* to, double bytes);
CommImpl& set_size(double size);
xbt_assert(s == sizeof(message) && message.type == MessageType::DEADLOCK_CHECK_REPLY,
"Received unexpected message %s (%i, size=%i) "
"expected MessageType::DEADLOCK_CHECK_REPLY (%i, size=%i)",
- MC_message_type_name(message.type), (int)message.type, (int)s, (int)MessageType::DEADLOCK_CHECK_REPLY,
+ to_c_str(message.type), (int)message.type, (int)s, (int)MessageType::DEADLOCK_CHECK_REPLY,
(int)sizeof(message));
return message.value != 0;
}
break;
default:
- xbt_die("Received unexpected message %s (%i)", MC_message_type_name(message->type),
- static_cast<int>(message->type));
+ xbt_die("Received unexpected message %s (%i)", to_c_str(message->type), static_cast<int>(message->type));
break;
}
}
/** @brief Send a message; returns 0 on success or errno on failure */
int Channel::send(const void* message, size_t size) const
{
- XBT_DEBUG("Send %s", MC_message_type_name(*(MessageType*)message));
+ XBT_DEBUG("Send %s", to_c_str(*(MessageType*)message));
while (::send(this->socket_, message, size, 0) == -1) {
if (errno != EINTR)
return errno;
{
ssize_t res = recv(this->socket_, message, size, block ? 0 : MSG_DONTWAIT);
if (res != -1)
- XBT_DEBUG("Receive %s", MC_message_type_name(*(MessageType*)message));
+ XBT_DEBUG("Receive %s", to_c_str(*(MessageType*)message));
return res;
}
}
+++ /dev/null
-/* Copyright (c) 2015-2021. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "src/mc/remote/mc_protocol.h"
-#include <array>
-
-const char* MC_message_type_name(simgrid::mc::MessageType type)
-{
- constexpr std::array<const char*, 14> names{{"NONE", "CONTINUE", "IGNORE_HEAP", "UNIGNORE_HEAP", "IGNORE_MEMORY",
- "STACK_REGION", "REGISTER_SYMBOL", "DEADLOCK_CHECK",
- "DEADLOCK_CHECK_REPLY", "WAITING", "SIMCALL_HANDLE", "ASSERTION_FAILED",
- "ACTOR_ENABLED", "ACTOR_ENABLED_REPLY"}};
- return names[static_cast<int>(type)];
-}
#include "simgrid/forward.h" // aid_t
#include <array>
#include <cstdint>
+#include <xbt/utility.hpp>
// ***** Messages
namespace simgrid {
namespace mc {
-enum class MessageType {
- NONE,
- CONTINUE,
- IGNORE_HEAP,
- UNIGNORE_HEAP,
- IGNORE_MEMORY,
- STACK_REGION,
- REGISTER_SYMBOL,
- DEADLOCK_CHECK,
- DEADLOCK_CHECK_REPLY,
- WAITING,
- SIMCALL_HANDLE,
- ASSERTION_FAILED,
- ACTOR_ENABLED,
- ACTOR_ENABLED_REPLY
-};
+XBT_DECLARE_ENUM_CLASS(MessageType, NONE, CONTINUE, IGNORE_HEAP, UNIGNORE_HEAP, IGNORE_MEMORY, STACK_REGION,
+ REGISTER_SYMBOL, DEADLOCK_CHECK, DEADLOCK_CHECK_REPLY, WAITING, SIMCALL_HANDLE, ASSERTION_FAILED,
+ ACTOR_ENABLED, ACTOR_ENABLED_REPLY);
} // namespace mc
} // namespace simgrid
aid_t aid; // actor ID
};
-XBT_PRIVATE const char* MC_message_type_name(simgrid::mc::MessageType type);
-
#endif // __cplusplus
#endif
#include "simgrid/s4u/Engine.hpp"
#include "src/kernel/activity/ActivityImpl.hpp"
-#include <array>
-
XBT_LOG_EXTERNAL_CATEGORY(s4u);
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_activity, s4u, "S4U activities");
const char* Activity::get_state_str() const
{
- constexpr std::array<const char*, 5> names{{"INITED", "STARTING", "STARTED", "CANCELED", "FINISHED"}};
- return names[static_cast<int>(state_)];
+ return to_c_str(state_);
}
double Activity::get_remaining() const
src/mc/remote/RemoteSimulation.cpp
src/mc/remote/RemotePtr.hpp
src/mc/remote/mc_protocol.h
- src/mc/remote/mc_protocol.cpp
src/mc/sosp/PageStore.hpp
src/mc/sosp/PageStore.cpp