+#include "smpi_coll_private.h"
+#include "smpi_mpi_dt_private.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi,
+ "Logging specific to SMPI (mpi)");
+
+/* MPI User level calls */
+
+int MPI_Init(int* argc, char*** argv) {
+ smpi_process_init(argc, argv);
+ smpi_bench_begin(-1, NULL);
+ return MPI_SUCCESS;
+}
+
+int MPI_Finalize(void) {
+ smpi_bench_end(-1, NULL);
+ smpi_process_destroy();
+ return MPI_SUCCESS;
+}
+
+int MPI_Init_thread(int* argc, char*** argv, int required, int* provided) {
+ if(provided != NULL) {
+ *provided = MPI_THREAD_MULTIPLE;
+ }
+ return MPI_Init(argc, argv);
+}
+
+int MPI_Query_thread(int* provided) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(provided == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *provided = MPI_THREAD_MULTIPLE;
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Is_thread_main(int* flag) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(flag == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *flag = smpi_process_index() == 0;
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Abort(MPI_Comm comm, int errorcode) {
+ smpi_bench_end(-1, NULL);
+ smpi_process_destroy();
+ // FIXME: should kill all processes in comm instead
+ SIMIX_process_kill(SIMIX_process_self());
+ return MPI_SUCCESS;
+}
+
+double MPI_Wtime(void) {
+ double time;
+
+ smpi_bench_end(-1, NULL);
+ time = SIMIX_get_clock();
+ smpi_bench_begin(-1, NULL);
+ return time;
+}
+
+int MPI_Address(void *location, MPI_Aint *address) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(!address) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *address = (MPI_Aint)location;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Type_free(MPI_Datatype* datatype) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(!datatype) {
+ retval = MPI_ERR_ARG;
+ } else {
+ // FIXME: always fail for now
+ retval = MPI_ERR_TYPE;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Type_size(MPI_Datatype datatype, size_t* size) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(size == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *size = smpi_datatype_size(datatype);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint* lb, MPI_Aint* extent) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(lb == NULL || extent == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ retval = smpi_datatype_extent(datatype, lb, extent);
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint* extent) {
+ int retval;
+ MPI_Aint dummy;
+
+ smpi_bench_end(-1, NULL);
+ if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(extent == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ retval = smpi_datatype_extent(datatype, &dummy, extent);
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint* disp) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(disp == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *disp = smpi_datatype_lb(datatype);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint* disp) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(datatype == MPI_DATATYPE_NULL) {
+ retval = MPI_ERR_TYPE;
+ } else if(disp == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *disp = smpi_datatype_ub(datatype);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Op_create(MPI_User_function* function, int commute, MPI_Op* op) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(function == NULL || op == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *op = smpi_op_new(function, commute);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Op_free(MPI_Op* op) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(op == NULL) {
+ retval = MPI_ERR_ARG;
+ } else if(*op == MPI_OP_NULL) {
+ retval = MPI_ERR_OP;
+ } else {
+ smpi_op_destroy(*op);
+ *op = MPI_OP_NULL;
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_free(MPI_Group *group) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(group == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ smpi_group_destroy(*group);
+ *group = MPI_GROUP_NULL;
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_size(MPI_Group group, int* size) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(group == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(size == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *size = smpi_group_size(group);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}