Patchwork [Fortran] Minor libcaf cleanup

login
register
mail settings
Submitter Tobias Burnus
Date May 5, 2011, 7:18 p.m.
Message ID <4DC2F80D.3060201@net-b.de>
Download mbox | patch
Permalink /patch/94300/
State New
Headers show

Comments

Tobias Burnus - May 5, 2011, 7:18 p.m.
Changes:
- Remove (not working) critical functions; a normal coarray of LOCK type 
should be used instead. (Stub left in until it is removed the the front 
end.)

- Added prototypes and stub implementations for 
registering/deregistering coarray (currently unused).

- Small bug fixes.

OK for the trunk?

Tobias
Daniel Kraft - May 6, 2011, 5:12 p.m.
On 05/05/11 21:18, Tobias Burnus wrote:
> Changes:
> - Remove (not working) critical functions; a normal coarray of LOCK type
> should be used instead. (Stub left in until it is removed the the front
> end.)
>
> - Added prototypes and stub implementations for
> registering/deregistering coarray (currently unused).
>
> - Small bug fixes.
>
> OK for the trunk?

Ok.

Yours,
Daniel

Patch

2011-05-05  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.

diff --git a/libgfortran/caf/libcaf.h b/libgfortran/caf/libcaf.h
index 8a66ef3..7b19f0d 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 <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  */
diff --git a/libgfortran/caf/mpi.c b/libgfortran/caf/mpi.c
index 9e4db91..9b7bb33 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 <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
diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c
index 7ee37b3..c5c66b4 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 <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)
 {