/* smpi_datatype.cpp -- MPI primitives to handle datatypes */
-/* Copyright (c) 2009-2018. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2009-2019. 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 "simgrid/modelchecker.h"
#include "smpi_datatype_derived.hpp"
#include "smpi_op.hpp"
+#include "src/instr/instr_private.hpp"
#include "src/smpi/include/smpi_actor.hpp"
#include <string>
#endif
}
-Datatype::Datatype(Datatype *datatype, int* ret) : name_(nullptr), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_), refcount_(1)
+Datatype::Datatype(Datatype *datatype, int* ret) : name_(nullptr), size_(datatype->size_), lb_(datatype->lb_), ub_(datatype->ub_), flags_(datatype->flags_), refcount_(1)
{
flags_ &= ~DT_FLAG_PREDEFINED;
*ret = MPI_SUCCESS;
xbt_free(name_);
}
-
void Datatype::ref(){
refcount_++;
return (flags_ & DT_FLAG_BASIC);
}
-const char* Datatype::encode(MPI_Datatype dt)
+bool Datatype::is_replayable()
{
- return dt->id.c_str();
+ return (simgrid::instr::trace_format == simgrid::instr::TraceFormat::Ti) &&
+ ((this == MPI_BYTE) || (this == MPI_DOUBLE) || (this == MPI_INT) || (this == MPI_CHAR) ||
+ (this == MPI_SHORT) || (this == MPI_LONG) || (this == MPI_FLOAT));
}
-MPI_Datatype Datatype::decode(std::string datatype_id)
+MPI_Datatype Datatype::decode(const std::string& datatype_id)
{
return id2type_lookup.find(datatype_id)->second;
}
-bool Datatype::is_replayable()
-{
- return ((this==MPI_BYTE)||(this==MPI_DOUBLE)||(this==MPI_INT)||
- (this==MPI_CHAR)||(this==MPI_SHORT)||(this==MPI_LONG)||(this==MPI_FLOAT));
-}
-
-size_t Datatype::size(){
- return size_;
-}
-
-int Datatype::flags(){
- return flags_;
-}
-
-int Datatype::refcount(){
- return refcount_;
-}
-
void Datatype::addflag(int flag){
flags_ &= flag;
}
-MPI_Aint Datatype::lb(){
- return lb_;
-}
-
-MPI_Aint Datatype::ub(){
- return ub_;
-}
-
-char* Datatype::name(){
- return name_;
-}
-
-
int Datatype::extent(MPI_Aint * lb, MPI_Aint * extent){
*lb = lb_;
*extent = ub_ - lb_;
return MPI_SUCCESS;
}
-MPI_Aint Datatype::get_extent(){
- return ub_ - lb_;
-}
-
void Datatype::get_name(char* name, int* length){
*length = strlen(name_);
strncpy(name, name_, *length+1);
int Datatype::pack(void* inbuf, int incount, void* outbuf, int outcount, int* position,MPI_Comm comm){
if (outcount - *position < incount*static_cast<int>(size_))
- return MPI_ERR_BUFFER;
+ return MPI_ERR_OTHER;
Datatype::copy(inbuf, incount, this, static_cast<char*>(outbuf) + *position, outcount, MPI_CHAR);
*position += incount * size_;
return MPI_SUCCESS;
int Datatype::unpack(void* inbuf, int insize, int* position, void* outbuf, int outcount,MPI_Comm comm){
if (outcount*static_cast<int>(size_)> insize)
- return MPI_ERR_BUFFER;
+ return MPI_ERR_OTHER;
Datatype::copy(static_cast<char*>(inbuf) + *position, insize, MPI_CHAR, outbuf, outcount, this);
*position += outcount * size_;
return MPI_SUCCESS;
}
-
int Datatype::copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype){
}
//Default serialization method : memcpy.
-void Datatype::serialize( void* noncontiguous_buf, void *contiguous_buf, int count){
+void Datatype::serialize(void* noncontiguous_buf, void* contiguous_buf, int count)
+{
char* contiguous_buf_char = static_cast<char*>(contiguous_buf);
char* noncontiguous_buf_char = static_cast<char*>(noncontiguous_buf)+lb_;
memcpy(contiguous_buf_char, noncontiguous_buf_char, count*size_);
-
}
void Datatype::unserialize( void* contiguous_buf, void *noncontiguous_buf, int count, MPI_Op op){