re PR fortran/18918 (Eventually support Fortran 2008's coarrays [co-arrays])
authorTobias Burnus <burnus@net-b.de>
Fri, 6 May 2011 18:35:00 +0000 (20:35 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Fri, 6 May 2011 18:35:00 +0000 (20:35 +0200)
2011-05-06  Tobias Burnus  <burnus@net-b.de>

        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.

From-SVN: r173505

libgfortran/ChangeLog
libgfortran/caf/libcaf.h
libgfortran/caf/mpi.c
libgfortran/caf/single.c

index 7e081ccf83b6a2be8d0d131cc9038849a9fe5fe6..e40450087de2164b42c2859134a071f94e557bbe 100644 (file)
@@ -1,3 +1,19 @@
+2011-05-06  Tobias Burnus  <burnus@net-b.de>
+
+       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  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/48787
index 8a66ef3deff1e35315497b043a2cd2928b256a5d..7b19f0d2dd098aa2855b65e4f9def651c51d39b9 100644 (file)
@@ -27,8 +27,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #ifndef LIBCAF_H
 #define LIBCAF_H
 
-#include <stdint.h>
-#include <string.h>
+#include <stdint.h>    /* For int32_t.  */
+#include <stddef.h>    /* 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);
+
+/* 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_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  */
index 9e4db916c85fbe92813ce3e98a70c9cacb380f2b..9b7bb333c2283560d48d07c795577fe941410e65 100644 (file)
@@ -27,8 +27,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "libcaf.h"
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>    /* For memcpy.  */
 #include <mpi.h>
 
+
 /* 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
index 7ee37b3a99de430ca8767ea41cd961153b4022f2..c5c66b4b95549b1b3bcd7d2e0d4d9fd84368fb28 100644 (file)
@@ -26,16 +26,16 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #include "libcaf.h"
 #include <stdio.h>  /* For fputs and fprintf.  */
-#include <stdlib.h> /* For exit.  */
+#include <stdlib.h> /* 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)
 {