+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
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
+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>
__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
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;
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;
int family;
bool fatal_error;
} error;
-
+#endif
} async_unit;
void init_async_unit (gfc_unit *);