aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2018-08-22 21:29:49 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2018-08-22 21:29:49 +0000
commit2532f0f5e60f7de0a06f3f824f6be618649c216b (patch)
treeb91d1a612866680c53415ca99b53c32ffcde9d8b
parentbcddf743dd356082eca0a580881da0df683fe5ea (diff)
downloadgcc-2532f0f5e60f7de0a06f3f824f6be618649c216b.zip
gcc-2532f0f5e60f7de0a06f3f824f6be618649c216b.tar.gz
gcc-2532f0f5e60f7de0a06f3f824f6be618649c216b.tar.bz2
gfortran.texi: Mention that asynchronous I/O does not work on systems which lack condition...
2018-08-22 Thomas Koenig <tkoenig@gcc.gnu.org> * gfortran.texi: Mention that asynchronous I/O does not work on systems which lack condition variables, such as AIX. 2018-08-22 Thomas Koenig <tkoenig@gcc.gnu.org> * async.h: Set ASYNC_IO to zero if _AIX is defined. (struct adv_cond): If ASYNC_IO is zero, the struct has no members. (async_unit): If ASYNC_IO is zero, remove unneeded members. From-SVN: r263788
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/gfortran.texi3
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/io/async.h23
4 files changed, 27 insertions, 11 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6bbf99c..56e9c95 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2018-08-22 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ * gfortran.texi: Mention that asynchronous I/O does
+ not work on systems which lack condition variables, such
+ as AIX.
+
2018-08-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/86935
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 0f3f454..3093404 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -1509,7 +1509,8 @@ end program main
Asynchronous I/O is supported if the program is linked against the
POSIX thread library. If that is not the case, all I/O is performed
-as synchronous.
+as synchronous. On systems which do not support pthread condition
+variables, such as AIX, I/O is also performed as synchronous.
On some systems, such as Darwin or Solaris, the POSIX thread library
is always linked in, so asynchronous I/O is always performed. On other
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 63d01e7..8f52118 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2018-08-22 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ * async.h: Set ASYNC_IO to zero if _AIX is defined.
+ (struct adv_cond): If ASYNC_IO is zero, the struct has no members.
+ (async_unit): If ASYNC_IO is zero, remove unneeded members.
+
2018-08-21 Nicolas Koenig <koenigni@gcc.gnu.org>
Thomas Koenig <tkoenig@gcc.gnu.org>
diff --git a/libgfortran/io/async.h b/libgfortran/io/async.h
index 7dfbc8b..47081a1 100644
--- a/libgfortran/io/async.h
+++ b/libgfortran/io/async.h
@@ -29,7 +29,7 @@
__gthread_cond_t and __gthread_equal / __gthread_self. Check
this. */
-#if defined(__GTHREAD_HAS_COND) && defined(__GTHREADS_CXX0X)
+#if defined(__GTHREAD_HAS_COND) && defined(__GTHREADS_CXX0X) && !defined(_AIX)
#define ASYNC_IO 1
#else
#define ASYNC_IO 0
@@ -328,21 +328,18 @@ typedef union transfer_args
struct adv_cond
{
+#if ASYNC_IO
int pending;
__gthread_mutex_t lock;
__gthread_cond_t signal;
+#endif
};
typedef struct async_unit
{
- pthread_mutex_t lock; /* Lock for manipulating the queue structure. */
pthread_mutex_t io_lock; /* Lock for doing actual I/O. */
- struct adv_cond work;
- struct adv_cond emptysignal;
- struct st_parameter_dt *pdt;
- pthread_t thread;
- struct transfer_queue *head;
- struct transfer_queue *tail;
+ pthread_mutex_t lock; /* Lock for manipulating the queue structure. */
+ bool empty;
struct
{
int waiting;
@@ -351,7 +348,13 @@ typedef struct async_unit
struct adv_cond done;
} id;
- bool empty;
+#if ASYNC_IO
+ struct adv_cond work;
+ struct adv_cond emptysignal;
+ struct st_parameter_dt *pdt;
+ pthread_t thread;
+ struct transfer_queue *head;
+ struct transfer_queue *tail;
struct {
const char *message;
@@ -361,7 +364,7 @@ typedef struct async_unit
int family;
bool fatal_error;
} error;
-
+#endif
} async_unit;
void init_async_unit (gfc_unit *);