APPLY_OP_LOOP(MPI_LONG_DOUBLE_INT, long_double_int,op)\
APPLY_OP_LOOP(MPI_2LONG, long_long,op)
-#define APPLY_END_OP_LOOP(op)\
- {\
- xbt_die("Failed to apply " #op " to type %s", (*datatype)->name());\
+#define APPLY_END_OP_LOOP(op) \
+ { \
+ xbt_die("Failed to apply " _XBT_STRINGIFY(op) " to type %s", (*datatype)->name()); \
}
static void max_func(void *a, void *b, int *length, MPI_Datatype * datatype)
/* obviously a no-op */
}
-#define CREATE_MPI_OP(name, func) \
- static SMPI_Op mpi_##name (&(func) /* func */, true, true ); \
-MPI_Op name = &mpi_##name;
+#define CREATE_MPI_OP(name, func) \
+ static SMPI_Op _XBT_CONCAT(mpi_, name)(&(func) /* func */, true, true); \
+ MPI_Op name = &_XBT_CONCAT(mpi_, name);
CREATE_MPI_OP(MPI_MAX, max_func);
CREATE_MPI_OP(MPI_MIN, min_func);
namespace simgrid{
namespace smpi{
-void Op::apply(void *invec, void *inoutvec, int *len, MPI_Datatype datatype)
+void Op::apply(const void* invec, void* inoutvec, const int* len, MPI_Datatype datatype)
{
if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) {
// we need to switch as the called function may silently touch global variables
if (not smpi_process()->replaying() && *len > 0) {
if (not is_fortran_op_)
- this->func_(invec, inoutvec, len, &datatype);
+ this->func_(const_cast<void*>(invec), inoutvec, const_cast<int*>(len), &datatype);
else{
XBT_DEBUG("Applying operation of length %d from %p and from/to %p", *len, invec, inoutvec);
int tmp = datatype->c2f();
/* Unfortunately, the C and Fortran version of the MPI standard do not agree on the type here,
thus the reinterpret_cast. */
- this->func_(invec, inoutvec, len, reinterpret_cast<MPI_Datatype*>(&tmp) );
+ this->func_(const_cast<void*>(invec), inoutvec, const_cast<int*>(len), reinterpret_cast<MPI_Datatype*>(&tmp));
}
}
}