-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010-2013. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
static xbt_dict_t op_lookup = NULL;
static int running_processes = 0;
-
-
-/* Convert between Fortran and C MPI_BOTTOM */
-#define F2C_BOTTOM(addr) ((addr!=MPI_IN_PLACE && *(int*)addr == MPI_FORTRAN_BOTTOM) ? MPI_BOTTOM : (addr))
-#define F2C_IN_PLACE(addr) ((addr!=MPI_BOTTOM &&*(int*)addr == MPI_FORTRAN_IN_PLACE) ? MPI_IN_PLACE : (addr))
+/* Bindings for MPI special values */
+union u_smpi_common {
+ struct s_smpi_common {
+ integer mpi_in_place;
+ integer mpi_bottom;
+ integer mpi_status_ignore;
+ integer mpi_statuses_ignore;
+ } f90; /* with gftortran */
+ struct s_smpi_common *f77; /* with f2c */
+} smpi_;
+
+/* Convert between Fortran and C */
+static XBT_INLINE void *f2c_addr(void *addr, void *cval, void *chk1, void *chk2)
+{
+ return (addr == chk1 || addr == chk2) ? cval : addr;
+}
+#define F2C_ADDR(addr, cval, fval) \
+ f2c_addr(addr, cval, &smpi_.f90.fval, &smpi_.f77[smpi_current_rank].fval)
+#define F2C_BOTTOM(addr) \
+ F2C_ADDR(addr, MPI_BOTTOM, mpi_bottom)
+#define F2C_IN_PLACE(addr) \
+ F2C_ADDR(addr, MPI_IN_PLACE, mpi_in_place)
+#define F2C_STATUS_IGNORE(addr) \
+ F2C_ADDR(addr, MPI_STATUS_IGNORE, mpi_status_ignore)
+#define F2C_STATUSES_IGNORE(addr) \
+ F2C_ADDR(addr, MPI_STATUSES_IGNORE, mpi_statuses_ignore)
#define KEY_SIZE (sizeof(int) * 2 + 1)
running_processes--;
if(running_processes==0){
xbt_dict_free(&op_lookup);
- op_lookup = NULL;
xbt_dict_free(&datatype_lookup);
- datatype_lookup = NULL;
xbt_dict_free(&request_lookup);
- request_lookup = NULL;
+ xbt_dict_free(&group_lookup);
xbt_dict_free(&comm_lookup);
- comm_lookup = NULL;
}
}
int* comm, MPI_Status* status, int* ierr) {
*ierr = MPI_Sendrecv(sendbuf, *sendcount, get_datatype(*sendtype), *dst,
*sendtag, recvbuf, *recvcount,get_datatype(*recvtype), *src, *recvtag,
- get_comm(*comm), status);
+ get_comm(*comm), F2C_STATUS_IGNORE(status));
}
void mpi_recv_init_(void *buf, int* count, int* datatype, int* src, int* tag,
void mpi_wait_(int* request, MPI_Status* status, int* ierr) {
MPI_Request req = find_request(*request);
- *ierr = MPI_Wait(&req, status);
+ *ierr = MPI_Wait(&req, F2C_STATUS_IGNORE(status));
if(req==MPI_REQUEST_NULL){
free_request(*request);
*request=MPI_FORTRAN_REQUEST_NULL;
for(i = 0; i < *count; i++) {
reqs[i] = find_request(requests[i]);
}
- *ierr = MPI_Waitall(*count, reqs, status);
+ *ierr = MPI_Waitall(*count, reqs, F2C_STATUSES_IGNORE(status));
for(i = 0; i < *count; i++) {
if(reqs[i]==MPI_REQUEST_NULL){
free_request(requests[i]);
void mpi_test_ (int * request, int *flag, MPI_Status * status, int* ierr){
MPI_Request req = find_request(*request);
- *ierr= MPI_Test(&req, flag, status);
+ *ierr= MPI_Test(&req, flag, F2C_STATUS_IGNORE(status));
if(req==MPI_REQUEST_NULL){
free_request(*request);
*request=MPI_FORTRAN_REQUEST_NULL;
for(i = 0; i < *count; i++) {
reqs[i] = find_request(requests[i]);
}
- *ierr= MPI_Testall(*count, reqs, flag, statuses);
+ *ierr= MPI_Testall(*count, reqs, flag, F2C_STATUSES_IGNORE(statuses));
for(i = 0; i < *count; i++) {
if(reqs[i]==MPI_REQUEST_NULL){
free_request(requests[i]);
}
void mpi_get_count_(MPI_Status * status, int* datatype, int *count, int* ierr){
- *ierr = MPI_Get_count(status, get_datatype(*datatype), count);
+ *ierr = MPI_Get_count(F2C_STATUS_IGNORE(status), get_datatype(*datatype), count);
}
void mpi_attr_get_(int* comm, int* keyval, void* attr_value, int* flag, int* ierr ){
{
*ierr = MPI_Sendrecv_replace(buf, *count, get_datatype(*datatype), *dst, *sendtag, *src,
- *recvtag, get_comm(*comm), status);
+ *recvtag, get_comm(*comm), F2C_STATUS_IGNORE(status));
}
void mpi_testany_ (int* count, int* requests, int *index, int *flag, MPI_Status* status, int* ierr)
for(i = 0; i < *count; i++) {
reqs[i] = find_request(requests[i]);
}
- *ierr = MPI_Testany(*count, reqs, index, flag, status);
+ *ierr = MPI_Testany(*count, reqs, index, flag, F2C_STATUS_IGNORE(status));
if(*index!=MPI_UNDEFINED)
if(reqs[*index]==MPI_REQUEST_NULL){
free_request(requests[*index]);
*ierr = MPI_Errhandler_set(get_comm(*comm), *(MPI_Errhandler*)errhandler);
}
+void mpi_comm_get_errhandler_ (int* comm, void* errhandler, int* ierr) {
+ *ierr = MPI_Errhandler_set(get_comm(*comm), (MPI_Errhandler*)errhandler);
+}
+
void mpi_type_contiguous_ (int* count, int* old_type, int* newtype, int* ierr) {
MPI_Datatype tmp;
*ierr = MPI_Type_contiguous(*count, get_datatype(*old_type), &tmp);
reqs[i] = find_request(requests[i]);
indices[i]=0;
}
- *ierr = MPI_Testsome(*incount, reqs, outcount, indices, statuses);
+ *ierr = MPI_Testsome(*incount, reqs, outcount, indices, F2C_STATUSES_IGNORE(statuses));
for(i=0;i<*incount;i++){
if(indices[i]){
if(reqs[indices[i]]==MPI_REQUEST_NULL){
}
void mpi_probe_ (int* source, int* tag, int* comm, MPI_Status* status, int* ierr) {
- *ierr = MPI_Probe(*source, *tag, get_comm(*comm), status);
+ *ierr = MPI_Probe(*source, *tag, get_comm(*comm), F2C_STATUS_IGNORE(status));
}
void mpi_attr_delete_ (int* comm, int* keyval, int* ierr) {