Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Useless test; TODO--.
[simgrid.git] / src / smpi / bindings / smpi_pmpi_type.cpp
index 4133b58..44de64e 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "private.hpp"
 #include "smpi_datatype_derived.hpp"
+#include "smpi_comm.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
 
@@ -16,6 +17,7 @@ int PMPI_Type_free(MPI_Datatype * datatype)
   if (*datatype == MPI_DATATYPE_NULL || (*datatype)->flags() & DT_FLAG_PREDEFINED) {
     return MPI_ERR_TYPE;
   } else {
+    (*datatype)->mark_as_deleted();
     simgrid::smpi::Datatype::unref(*datatype);
     *datatype=MPI_DATATYPE_NULL;
     return MPI_SUCCESS;
@@ -48,10 +50,13 @@ int PMPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent
 
 int PMPI_Type_get_extent_x(MPI_Datatype datatype, MPI_Count * lb, MPI_Count * extent)
 {
-  MPI_Aint tmplb, tmpext;
+  MPI_Aint tmplb;
+  MPI_Aint tmpext;
   int ret = PMPI_Type_get_extent(datatype, &tmplb, &tmpext);
-  *lb = static_cast<MPI_Count>(tmplb);
-  *extent = static_cast<MPI_Count>(tmpext);
+  if(ret == MPI_SUCCESS){
+    *lb = static_cast<MPI_Count>(tmplb);
+    *extent = static_cast<MPI_Count>(tmpext);
+  }
   return ret;
 }
 
@@ -205,7 +210,16 @@ int PMPI_Type_create_subarray(int ndims, const int* array_of_sizes,
   if (ndims==0){
     *newtype = MPI_DATATYPE_NULL;
     return MPI_SUCCESS;
-  } else if (ndims==1){
+  }
+  CHECK_NULL(2, MPI_ERR_ARG, array_of_sizes)
+  CHECK_NULL(3, MPI_ERR_ARG, array_of_subsizes)
+  CHECK_NULL(4, MPI_ERR_ARG, array_of_starts)
+  for (int i = 0; i < ndims; i++) {
+    CHECK_NEGATIVE_OR_ZERO(2, MPI_ERR_COUNT, array_of_sizes[i])
+    CHECK_NEGATIVE(3, MPI_ERR_COUNT, array_of_subsizes[i])
+    CHECK_NEGATIVE(4, MPI_ERR_COUNT, array_of_starts[i])
+  }
+  if (ndims==1){
     simgrid::smpi::Datatype::create_contiguous( array_of_subsizes[0], oldtype, array_of_starts[0]*oldtype->get_extent(), newtype);
     return MPI_SUCCESS;
   } else if (oldtype == MPI_DATATYPE_NULL || not oldtype->is_valid() ) {
@@ -310,30 +324,34 @@ int PMPI_Type_free_keyval(int* keyval) {
   return simgrid::smpi::Keyval::keyval_free<simgrid::smpi::Datatype>(keyval);
 }
 
-int PMPI_Unpack(const void* inbuf, int incount, int* position, void* outbuf, int outcount, MPI_Datatype type, MPI_Comm comm) {
-  CHECK_NEGATIVE(2, MPI_ERR_COUNT, incount)
+int PMPI_Unpack(const void* inbuf, int insize, int* position, void* outbuf, int outcount, MPI_Datatype type, MPI_Comm comm) {
+  SET_BUF1(inbuf)
+  SET_BUF2(outbuf)
+  CHECK_COMM(7)
+  CHECK_NEGATIVE(2, MPI_ERR_COUNT, insize)
   CHECK_NEGATIVE(5, MPI_ERR_COUNT, outcount)
-  CHECK_BUFFER(1, inbuf, incount)
-  CHECK_BUFFER(4, outbuf, outcount)
   CHECK_TYPE(6, type)
-  CHECK_COMM(7)
-  return type->unpack(inbuf, incount, position, outbuf,outcount, comm);
+  CHECK_BUFFER2(1, inbuf, outcount)
+  CHECK_BUFFER2(4, outbuf, outcount)
+  return type->unpack(inbuf, insize, position, outbuf,outcount, comm);
 }
 
-int PMPI_Pack(const void* inbuf, int incount, MPI_Datatype type, void* outbuf, int outcount, int* position, MPI_Comm comm) {
+int PMPI_Pack(const void* inbuf, int incount, MPI_Datatype type, void* outbuf, int outsize, int* position, MPI_Comm comm) {
+  SET_BUF1(inbuf)
+  SET_BUF2(outbuf)
+  CHECK_COMM(7)
   CHECK_NEGATIVE(2, MPI_ERR_COUNT, incount)
-  CHECK_NEGATIVE(5, MPI_ERR_COUNT, outcount)
-  CHECK_BUFFER(1, inbuf, incount)
-  CHECK_BUFFER(4, outbuf, outcount)
+  CHECK_NEGATIVE(5, MPI_ERR_COUNT, outsize)
   CHECK_TYPE(6, type)
-  CHECK_COMM(7)
-  return type->pack(inbuf == MPI_BOTTOM ? nullptr : inbuf, incount, outbuf, outcount, position, comm);
+  CHECK_BUFFER2(1, inbuf, incount)
+  CHECK_BUFFER2(4, outbuf, incount)
+  return type->pack(inbuf == MPI_BOTTOM ? nullptr : inbuf, incount, outbuf, outsize, position, comm);
 }
 
 int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) {
   CHECK_NEGATIVE(1, MPI_ERR_COUNT, incount)
   CHECK_TYPE(2, datatype)
   CHECK_COMM(3)
-  *size=incount*datatype->size();
+  *size = incount * std::max<long>(datatype->size(), datatype->get_extent());
   return MPI_SUCCESS;
 }