From 2f4879251e92b9ef667c20764e450969a9cdb039 Mon Sep 17 00:00:00 2001 From: tkoenig Date: Wed, 22 Aug 2018 21:29:49 +0000 Subject: [PATCH] 2018-08-22 Thomas Koenig * gfortran.texi: Mention that asynchronous I/O does not work on systems which lack condition variables, such as AIX. 2018-08-22 Thomas Koenig * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@263788 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/gfortran.texi | 3 ++- libgfortran/ChangeLog | 6 ++++++ libgfortran/io/async.h | 23 +++++++++++++---------- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6bbf99c0e05..56e9c952795 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-08-22 Thomas Koenig + + * gfortran.texi: Mention that asynchronous I/O does + not work on systems which lack condition variables, such + as AIX. + 2018-08-22 Janus Weil PR fortran/86935 diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index 0f3f454ff83..30934046a49 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 63d01e705ad..8f5211866ac 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2018-08-22 Thomas Koenig + + * 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 Thomas Koenig diff --git a/libgfortran/io/async.h b/libgfortran/io/async.h index 7dfbc8bd696..47081a15151 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 *); -- 2.11.4.GIT