Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Sonar wants one declaration per line.
[simgrid.git] / src / smpi / bindings / smpi_pmpi_type.cpp
index 8176b32..5aa26ad 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2007-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. */
@@ -17,6 +17,7 @@ int PMPI_Type_free(MPI_Datatype * datatype)
     return MPI_ERR_TYPE;
   } else {
     simgrid::smpi::Datatype::unref(*datatype);
+    *datatype=MPI_DATATYPE_NULL;
     return MPI_SUCCESS;
   }
 }
@@ -45,11 +46,28 @@ int PMPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent
   return datatype->extent(lb, extent);
 }
 
+int PMPI_Type_get_extent_x(MPI_Datatype datatype, MPI_Count * lb, MPI_Count * extent)
+{
+  MPI_Aint tmplb;
+  MPI_Aint tmpext;
+  int ret = PMPI_Type_get_extent(datatype, &tmplb, &tmpext);
+  if(ret == MPI_SUCCESS){
+    *lb = static_cast<MPI_Count>(tmplb);
+    *extent = static_cast<MPI_Count>(tmpext);
+  }
+  return ret;
+}
+
 int PMPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint * lb, MPI_Aint * extent)
 {
   return PMPI_Type_get_extent(datatype, lb, extent);
 }
 
+int PMPI_Type_get_true_extent_x(MPI_Datatype datatype, MPI_Count * lb, MPI_Count * extent)
+{
+  return PMPI_Type_get_extent_x(datatype, lb, extent);
+}
+
 int PMPI_Type_extent(MPI_Datatype datatype, MPI_Aint * extent)
 {
   CHECK_MPI_NULL(1, MPI_DATATYPE_NULL, MPI_ERR_TYPE, datatype)
@@ -77,7 +95,7 @@ int PMPI_Type_ub(MPI_Datatype datatype, MPI_Aint * disp)
 int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){
   int retval = MPI_SUCCESS;
   CHECK_MPI_NULL(1, MPI_DATATYPE_NULL, MPI_ERR_TYPE, datatype)
-  *newtype = new simgrid::smpi::Datatype(datatype, &retval);
+  retval = datatype->clone(newtype);
   //error when duplicating, free the new datatype
   if(retval!=MPI_SUCCESS){
     simgrid::smpi::Datatype::unref(*newtype);
@@ -135,7 +153,7 @@ int PMPI_Type_create_indexed_block(int count, int blocklength, const int* indice
 {
   CHECK_COUNT(1, count)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
-  int* blocklens=static_cast<int*>(xbt_malloc(blocklength*count*sizeof(int)));
+  auto* blocklens = static_cast<int*>(xbt_malloc(blocklength * count * sizeof(int)));
   for (int i    = 0; i < count; i++)
     blocklens[i]=blocklength;
   int retval    = simgrid::smpi::Datatype::create_indexed(count, blocklens, indices, old_type, new_type);
@@ -160,7 +178,7 @@ int PMPI_Type_create_hindexed_block(int count, int blocklength, const MPI_Aint*
                                     MPI_Datatype* new_type) {
   CHECK_COUNT(1, count)
   CHECK_MPI_NULL(4, MPI_DATATYPE_NULL, MPI_ERR_TYPE, old_type)
-  int* blocklens=(int*)xbt_malloc(blocklength*count*sizeof(int));
+  auto* blocklens = static_cast<int*>(xbt_malloc(blocklength * count * sizeof(int)));
   for (int i     = 0; i < count; i++)
     blocklens[i] = blocklength;
   int retval     = simgrid::smpi::Datatype::create_hindexed(count, blocklens, indices, old_type, new_type);
@@ -248,6 +266,35 @@ int PMPI_Type_set_attr (MPI_Datatype type, int type_keyval, void *attribute_val)
   return type->attr_put<simgrid::smpi::Datatype>(type_keyval, attribute_val);
 }
 
+int PMPI_Type_get_contents (MPI_Datatype type, int max_integers, int max_addresses, 
+                            int max_datatypes, int* array_of_integers, MPI_Aint* array_of_addresses, 
+                            MPI_Datatype *array_of_datatypes)
+{
+  CHECK_MPI_NULL(1, MPI_DATATYPE_NULL, MPI_ERR_TYPE, type)
+  CHECK_NEGATIVE(2, MPI_ERR_COUNT, max_integers)
+  CHECK_NEGATIVE(3, MPI_ERR_COUNT, max_addresses)
+  CHECK_NEGATIVE(4, MPI_ERR_COUNT, max_datatypes)
+  if(max_integers>0)
+    CHECK_NULL(5, MPI_ERR_ARG, array_of_integers)
+  if(max_addresses!=0)
+    CHECK_NULL(6, MPI_ERR_ARG, array_of_addresses)
+  if(max_datatypes!=0)
+    CHECK_NULL(7, MPI_ERR_ARG, array_of_datatypes)
+  return type->get_contents(max_integers, max_addresses, max_datatypes,
+                            array_of_integers, array_of_addresses, array_of_datatypes);
+}
+
+int PMPI_Type_get_envelope (MPI_Datatype type, int *num_integers, int *num_addresses, 
+                            int *num_datatypes, int *combiner)
+{
+  CHECK_MPI_NULL(1, MPI_DATATYPE_NULL, MPI_ERR_TYPE, type)
+  CHECK_NULL(2, MPI_ERR_ARG, num_integers)
+  CHECK_NULL(3, MPI_ERR_ARG, num_addresses)
+  CHECK_NULL(4, MPI_ERR_ARG, num_datatypes)
+  CHECK_NULL(5, MPI_ERR_ARG, combiner)
+  return type->get_envelope(num_integers, num_addresses, num_datatypes, combiner);
+}
+
 int PMPI_Type_delete_attr (MPI_Datatype type, int type_keyval)
 {
   CHECK_MPI_NULL(1, MPI_DATATYPE_NULL, MPI_ERR_TYPE, type)