diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 7e081ccf83b..e40450087de 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,19 @@ +2011-05-06 Tobias Burnus + + PR fortran/18918 + * caf/libcaf.h: Cleanup headers. + (_gfortran_caf_critical, _gfortran_caf_end_critical): Make stub. + (caf_register_t): New enum. + (_gfortran_caf_register, _gfortran_caf_deregister): New prototype. + * caf/single.c (_gfortran_caf_critical, + _gfortran_caf_end_critical): Remove. + (_gfortran_caf_register, _gfortran_caf_deregister): New functions. + * caf/mpi.c (_gfortran_caf_critical, + _gfortran_caf_end_critical): Remove. + (_gfortran_caf_register, _gfortran_caf_deregister): New functions. + (caf_world_window): Remove global variable. + (_gfortran_caf_init): Fix off-by-one error of this_image. + 2011-05-04 Jerry DeLisle PR libgfortran/48787 diff --git a/libgfortran/caf/libcaf.h b/libgfortran/caf/libcaf.h index 8a66ef3deff..7b19f0d2dd0 100644 --- a/libgfortran/caf/libcaf.h +++ b/libgfortran/caf/libcaf.h @@ -27,8 +27,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #ifndef LIBCAF_H #define LIBCAF_H -#include -#include +#include /* For int32_t. */ +#include /* For ptrdiff_t. */ + /* Definitions of the Fortran 2008 standard; need to kept in sync with ISO_FORTRAN_ENV, cf. libgfortran.h. */ @@ -38,16 +39,32 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define STAT_STOPPED_IMAGE 3 +typedef enum caf_register_t { + CAF_REGTYPE_COARRAY, + CAF_REGTYPE_LOCK, + CAF_REGTYPE_LOCK_COMP +} +caf_register_t; + + void _gfortran_caf_init (int *, char ***, int *, int *); void _gfortran_caf_finalize (void); +void * _gfortran_caf_register (ptrdiff_t, caf_register_t, void **); +int _gfortran_caf_deregister (void **); + + int _gfortran_caf_sync_all (char *, int); -int _gfortran_caf_sync_images (int count, int images[], char *, int); +int _gfortran_caf_sync_images (int, int[], char *, int); -void _gfortran_caf_critical (void); -void _gfortran_caf_end_critical (void); +/* FIXME: The CRITICAL functions should be removed; + the functionality is better represented using Coarray's lock feature. */ +void _gfortran_caf_critical (void) { } +void _gfortran_caf_end_critical (void) { } -void _gfortran_caf_error_stop_str (const char *, int32_t) __attribute__ ((noreturn)); + +void _gfortran_caf_error_stop_str (const char *, int32_t) + __attribute__ ((noreturn)); void _gfortran_caf_error_stop (int32_t) __attribute__ ((noreturn)); #endif /* LIBCAF_H */ diff --git a/libgfortran/caf/mpi.c b/libgfortran/caf/mpi.c index 9e4db916c85..9b7bb333c22 100644 --- a/libgfortran/caf/mpi.c +++ b/libgfortran/caf/mpi.c @@ -27,8 +27,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "libcaf.h" #include #include +#include /* For memcpy. */ #include + /* Define GFC_CAF_CHECK to enable run-time checking. */ /* #define GFC_CAF_CHECK 1 */ @@ -39,7 +41,6 @@ static void error_stop (int error) __attribute__ ((noreturn)); static int caf_mpi_initialized; static int caf_this_image; static int caf_num_images; -static MPI_Win caf_world_window; /* Initialize coarray program. This routine assumes that no other @@ -58,13 +59,9 @@ _gfortran_caf_init (int *argc, char ***argv, int *this_image, int *num_images) MPI_Init (argc, argv); MPI_Comm_rank (MPI_COMM_WORLD, &caf_this_image); - *this_image = caf_this_image + 1; + *this_image = ++caf_this_image; MPI_Comm_size (MPI_COMM_WORLD, &caf_num_images); *num_images = caf_num_images; - - /* Obtain window for CRITICAL section locking. */ - MPI_Win_create (NULL, 0, 1, MPI_INFO_NULL, MPI_COMM_WORLD, - &caf_world_window); } @@ -73,13 +70,28 @@ _gfortran_caf_init (int *argc, char ***argv, int *this_image, int *num_images) void _gfortran_caf_finalize (void) { - MPI_Win_free (&caf_world_window); - if (!caf_mpi_initialized) MPI_Finalize (); } +void * +_gfortran_caf_register (ptrdiff_t size, + caf_register_t type __attribute__ ((unused)), + void **token) +{ + *token = NULL; + return malloc (size); +} + + +int +_gfortran_caf_deregister (void **token __attribute__ ((unused))) +{ + return 0; +} + + /* SYNC ALL - the return value matches Fortran's STAT argument. */ int @@ -156,22 +168,6 @@ _gfortran_caf_sync_images (int count, int images[], char *errmsg, } -/* CRITICAL BLOCK. */ - -void -_gfortran_caf_critical (void) -{ - MPI_Win_lock (MPI_LOCK_SHARED, 0, 0, caf_world_window); -} - - -void -_gfortran_caf_end_critical (void) -{ - MPI_Win_unlock (0, caf_world_window); -} - - /* ERROR STOP the other images. */ static void diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c index 7ee37b3a99d..c5c66b4b955 100644 --- a/libgfortran/caf/single.c +++ b/libgfortran/caf/single.c @@ -26,16 +26,16 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "libcaf.h" #include /* For fputs and fprintf. */ -#include /* For exit. */ +#include /* For exit and malloc. */ /* Define GFC_CAF_CHECK to enable run-time checking. */ /* #define GFC_CAF_CHECK 1 */ - /* Single-image implementation of the CAF library. Note: For performance reasons -fcoarry=single should be used rather than this library. */ + void _gfortran_caf_init (int *argc __attribute__ ((unused)), char ***argv __attribute__ ((unused)), @@ -45,11 +45,30 @@ _gfortran_caf_init (int *argc __attribute__ ((unused)), *num_images = 1; } + void _gfortran_caf_finalize (void) { } + +void * +_gfortran_caf_register (ptrdiff_t size, + caf_register_t type __attribute__ ((unused)), + void **token) +{ + *token = NULL; + return malloc (size); +} + + +int +_gfortran_caf_deregister (void **token __attribute__ ((unused))) +{ + return 0; +} + + int _gfortran_caf_sync_all (char *errmsg __attribute__ ((unused)), int errmsg_len __attribute__ ((unused))) @@ -78,15 +97,6 @@ _gfortran_caf_sync_images (int count __attribute__ ((unused)), return 0; } -void -_gfortran_caf_critical (void) -{ -} - -void -_gfortran_caf_end_critical (void) -{ -} void _gfortran_caf_error_stop_str (const char *string, int32_t len) @@ -99,6 +109,7 @@ _gfortran_caf_error_stop_str (const char *string, int32_t len) exit (1); } + void _gfortran_caf_error_stop (int32_t error) {