Small fix to follow more closely the specs in mpi_type_free
// Internal use only
CREATE_MPI_DATATYPE(MPI_PTR, void*);
// Internal use only
CREATE_MPI_DATATYPE(MPI_PTR, void*);
+/** Check if the datatype is usable for communications
+ */
+int is_datatype_valid(MPI_Datatype datatype) {
+ return datatype != MPI_DATATYPE_NULL
+ && (datatype->flags & DT_FLAG_COMMITED);
+}
size_t smpi_datatype_size(MPI_Datatype datatype)
{
return datatype->size;
}
size_t smpi_datatype_size(MPI_Datatype datatype)
{
return datatype->size;
}
MPI_Aint smpi_datatype_lb(MPI_Datatype datatype)
{
return datatype->lb;
MPI_Aint smpi_datatype_lb(MPI_Datatype datatype)
{
return datatype->lb;
xbt_free((*type)->substruct);
}
xbt_free(*type);
xbt_free((*type)->substruct);
}
xbt_free(*type);
+ *type = MPI_DATATYPE_NULL;
}
void smpi_datatype_use(MPI_Datatype type){
}
void smpi_datatype_use(MPI_Datatype type){
int PMPI_Type_free(MPI_Datatype * datatype)
{
int retval = 0;
int PMPI_Type_free(MPI_Datatype * datatype)
{
int retval = 0;
+ /* Free a predefined datatype is an error according to the standard, and
+ should be checked for */
+ if (*datatype == MPI_DATATYPE_NULL) {
retval = MPI_ERR_ARG;
} else {
smpi_datatype_free(datatype);
retval = MPI_ERR_ARG;
} else {
smpi_datatype_free(datatype);
smpi_bench_end();
if (request == NULL) {
smpi_bench_end();
if (request == NULL) {
} else if (comm == MPI_COMM_NULL) {
} else if (comm == MPI_COMM_NULL) {
+ retval = MPI_ERR_COMM;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if (dst == MPI_PROC_NULL) {
} else if (dst == MPI_PROC_NULL) {
- *request = smpi_mpi_send_init(buf, count, datatype, dst, tag, comm);
- retval = MPI_SUCCESS;
+ *request = smpi_mpi_send_init(buf, count, datatype, dst, tag, comm);
+ retval = MPI_SUCCESS;
}
smpi_bench_begin();
if (retval != MPI_SUCCESS && request)
}
smpi_bench_begin();
if (retval != MPI_SUCCESS && request)
retval = MPI_ERR_ARG;
} else if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
retval = MPI_ERR_ARG;
} else if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if (src == MPI_PROC_NULL) {
retval = MPI_SUCCESS;
} else {
} else if (src == MPI_PROC_NULL) {
retval = MPI_SUCCESS;
} else {
retval = MPI_ERR_ARG;
} else if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
retval = MPI_ERR_ARG;
} else if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if (dst == MPI_PROC_NULL) {
retval = MPI_SUCCESS;
} else {
} else if (dst == MPI_PROC_NULL) {
retval = MPI_SUCCESS;
} else {
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
- } else if (datatype == MPI_DATATYPE_NULL){
- retval = MPI_ERR_TYPE;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
- } else if (datatype == MPI_DATATYPE_NULL){
- retval = MPI_ERR_TYPE;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
- } else if (datatype == MPI_DATATYPE_NULL){
- retval = MPI_ERR_TYPE;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
- } else if (datatype == MPI_DATATYPE_NULL){
- retval = MPI_ERR_TYPE;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
- } else if (datatype == MPI_DATATYPE_NULL){
- retval = MPI_ERR_TYPE;
+ } else if (!is_datatype_valid(datatype)) {
+ retval = MPI_ERR_TYPE;
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
} else {
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
retval = MPI_ERR_COUNT;
} else if (buf==NULL && count > 0) {
retval = MPI_ERR_COUNT;
- } else if (datatype == MPI_DATATYPE_NULL){
+ } else if (!is_datatype_valid(datatype)){
retval = MPI_ERR_TYPE;
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
retval = MPI_ERR_TYPE;
} else if(tag<0 && tag != MPI_ANY_TAG){
retval = MPI_ERR_TAG;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (sendtype == MPI_DATATYPE_NULL
- || recvtype == MPI_DATATYPE_NULL) {
+ } else if (!is_datatype_valid(sendtype)
+ || !is_datatype_valid(recvtype)) {
retval = MPI_ERR_TYPE;
} else if (src == MPI_PROC_NULL || dst == MPI_PROC_NULL) {
smpi_empty_status(status);
retval = MPI_ERR_TYPE;
} else if (src == MPI_PROC_NULL || dst == MPI_PROC_NULL) {
smpi_empty_status(status);
//TODO: suboptimal implementation
void *recvbuf;
int retval = 0;
//TODO: suboptimal implementation
void *recvbuf;
int retval = 0;
- if (datatype == MPI_DATATYPE_NULL) {
+ if (!is_datatype_valid(datatype)) {
retval = MPI_ERR_TYPE;
} else if (count < 0) {
retval = MPI_ERR_COUNT;
retval = MPI_ERR_TYPE;
} else if (count < 0) {
retval = MPI_ERR_COUNT;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) {
+ } else if (!is_datatype_valid(datatype) || op == MPI_OP_NULL) {
retval = MPI_ERR_ARG;
} else {
#ifdef HAVE_TRACING
retval = MPI_ERR_ARG;
} else {
#ifdef HAVE_TRACING
int retval = 0;
smpi_bench_end();
int retval = 0;
smpi_bench_end();
- if (datatype == MPI_DATATYPE_NULL || op == MPI_OP_NULL) {
+ if (!is_datatype_valid(datatype) || op == MPI_OP_NULL) {
retval = MPI_ERR_ARG;
} else {
smpi_op_apply(op, inbuf, inoutbuf, &count, &datatype);
retval = MPI_ERR_ARG;
} else {
smpi_op_apply(op, inbuf, inoutbuf, &count, &datatype);
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (datatype == MPI_DATATYPE_NULL) {
+ } else if (!is_datatype_valid(datatype)) {
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (datatype == MPI_DATATYPE_NULL) {
+ } else if (!is_datatype_valid(datatype)) {
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (datatype == MPI_DATATYPE_NULL) {
+ } else if (!is_datatype_valid(datatype)) {
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (datatype == MPI_DATATYPE_NULL) {
+ } else if (!is_datatype_valid(datatype)) {
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
if (comm == MPI_COMM_NULL) {
retval = MPI_ERR_COMM;
- } else if (datatype == MPI_DATATYPE_NULL) {
+ } else if (!is_datatype_valid(datatype)) {
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
retval = MPI_ERR_TYPE;
} else if (op == MPI_OP_NULL) {
retval = MPI_ERR_OP;
if (status == NULL || count == NULL) {
retval = MPI_ERR_ARG;
if (status == NULL || count == NULL) {
retval = MPI_ERR_ARG;
- } else if (datatype == MPI_DATATYPE_NULL) {
+ } else if (!is_datatype_valid(datatype)) {
retval = MPI_ERR_TYPE;
} else {
size = smpi_datatype_size(datatype);
retval = MPI_ERR_TYPE;
} else {
size = smpi_datatype_size(datatype);
+int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){
+ NOT_YET_IMPLEMENTED
+}
int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){
NOT_YET_IMPLEMENTED
int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){
NOT_YET_IMPLEMENTED
-int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent, MPI_Datatype *newtype){
- NOT_YET_IMPLEMENTED
-}
-
int PMPI_Type_create_subarray(int ndims,int *array_of_sizes, int *array_of_subsizes, int *array_of_starts, int order, MPI_Datatype oldtype, MPI_Datatype *newtype){
NOT_YET_IMPLEMENTED
}
int PMPI_Type_create_subarray(int ndims,int *array_of_sizes, int *array_of_subsizes, int *array_of_starts, int order, MPI_Datatype oldtype, MPI_Datatype *newtype){
NOT_YET_IMPLEMENTED
}