1
1

More fortran wrappers, and a little bit of help code.

Reviewed: Tim Woodall

This commit was SVN r1477.
Этот коммит содержится в:
Ginger Young 2004-06-25 14:29:21 +00:00
родитель 99e268b9ff
Коммит 108fe10084
4 изменённых файлов: 71 добавлений и 2 удалений

Просмотреть файл

@ -6,6 +6,9 @@
#include "mpi.h" #include "mpi.h"
#include "mpi/c/bindings.h" #include "mpi/c/bindings.h"
#include "request/request.h"
#include "errhandler/errhandler.h"
#include "communicator/communicator.h"
#if OMPI_HAVE_WEAK_SYMBOLS && OMPI_PROFILING_DEFINES #if OMPI_HAVE_WEAK_SYMBOLS && OMPI_PROFILING_DEFINES
#pragma weak MPI_Request_c2f = PMPI_Request_c2f #pragma weak MPI_Request_c2f = PMPI_Request_c2f
@ -16,5 +19,20 @@
#endif #endif
MPI_Fint MPI_Request_c2f(MPI_Request request) { MPI_Fint MPI_Request_c2f(MPI_Request request) {
return (MPI_Fint)0; /* local variables */
ompi_request_t *request_c;
/* error checking */
if( MPI_PARAM_CHECK ) {
/* check for MPI_REQUEST_NULL */
if( (NULL == request) ) {
return (MPI_Fint)
OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_REQUEST,
"MPI_Request_c2f");
}
}
request_c=(ompi_request_t *)request;
return (MPI_Fint) (request_c->req_f_to_c_index) ;
} }

Просмотреть файл

@ -6,6 +6,9 @@
#include "mpi.h" #include "mpi.h"
#include "mpi/c/bindings.h" #include "mpi/c/bindings.h"
#include "request/request.h"
#include "errhandler/errhandler.h"
#include "communicator/communicator.h"
#if OMPI_HAVE_WEAK_SYMBOLS && OMPI_PROFILING_DEFINES #if OMPI_HAVE_WEAK_SYMBOLS && OMPI_PROFILING_DEFINES
#pragma weak MPI_Request_f2c = PMPI_Request_f2c #pragma weak MPI_Request_f2c = PMPI_Request_f2c
@ -16,5 +19,26 @@
#endif #endif
MPI_Request MPI_Request_f2c(MPI_Fint request) { MPI_Request MPI_Request_f2c(MPI_Fint request) {
return (MPI_Request)0; /* local variables */
ompi_request_t *request_c;
size_t request_index;
request_index = (size_t) request;
/* Error checks */
if (MPI_PARAM_CHECK) {
if (0 > request_index) {
(void)OMPI_ERRHANDLER_INVOKE( MPI_COMM_WORLD, MPI_ERR_REQUEST,
"MPI_Request_f2c");
}
}
if (request_index >= ompi_req_f_to_c_table->size) {
(void) OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_REQUEST,
"MPI_Request_f2c - II");
return MPI_REQUEST_NULL;
}
request_c = ompi_req_f_to_c_table->addr[request_index];
return (MPI_Request) request_c;
} }

Просмотреть файл

@ -3,16 +3,36 @@
*/ */
#include "request/request.h" #include "request/request.h"
#include "include/constants.h"
/*
* Table for Fortran <-> C Request handle conversion
*/
ompi_pointer_array_t *ompi_req_f_to_c_table;
ompi_pointer_array_t ompi_req_table;
static void ompi_request_construct(ompi_request_t* req) static void ompi_request_construct(ompi_request_t* req)
{ {
int ret_val;
/* assign entry in fortran <-> c translation array */
ret_val = ompi_pointer_array_add(ompi_req_f_to_c_table, req);
req->req_f_to_c_index = ret_val;
req->req_state = OMPI_REQUEST_INVALID; req->req_state = OMPI_REQUEST_INVALID;
} }
static void ompi_request_destruct(ompi_request_t* req) static void ompi_request_destruct(ompi_request_t* req)
{ {
/* reset the ompi_req_f_to_c_table entry - make sure that the
* entry is in the table */
if (NULL != ompi_pointer_array_get_item(ompi_req_f_to_c_table,
req->req_f_to_c_index)) {
ompi_pointer_array_set_item(ompi_req_f_to_c_table,
req->req_f_to_c_index, NULL);
}
req->req_state = OMPI_REQUEST_INVALID; req->req_state = OMPI_REQUEST_INVALID;
} }

Просмотреть файл

@ -7,6 +7,7 @@
#include "mpi.h" #include "mpi.h"
#include "class/ompi_list.h" #include "class/ompi_list.h"
#include "class/ompi_pointer_array.h"
OBJ_CLASS_DECLARATION(ompi_request_t); OBJ_CLASS_DECLARATION(ompi_request_t);
@ -29,6 +30,7 @@ struct ompi_request_t {
ompi_list_item_t super; ompi_list_item_t super;
ompi_request_type_t req_type; ompi_request_type_t req_type;
volatile int req_state; volatile int req_state;
int req_f_to_c_index; /**< index in Fortran <-> C translation array */
}; };
typedef struct ompi_request_t ompi_request_t; typedef struct ompi_request_t ompi_request_t;
@ -36,6 +38,7 @@ typedef struct ompi_request_t ompi_request_t;
#define OMPI_REQUEST_INIT(request) \ #define OMPI_REQUEST_INIT(request) \
do { \ do { \
(request)->req_state = OMPI_REQUEST_INACTIVE; \ (request)->req_state = OMPI_REQUEST_INACTIVE; \
(request)->req_f_to_c_index = 0; \
} while(0); } while(0);
#define OMPI_REQUEST_FINI(request) \ #define OMPI_REQUEST_FINI(request) \
@ -43,6 +46,10 @@ typedef struct ompi_request_t ompi_request_t;
(request)->req_state = OMPI_REQUEST_INVALID; \ (request)->req_state = OMPI_REQUEST_INVALID; \
} while(0); } while(0);
/**
* Table for Fortran <-> C request handle conversion
*/
extern ompi_pointer_array_t *ompi_req_f_to_c_table;
#endif #endif