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
This commit is contained in:
Thomas Koenig 2018-08-22 21:29:49 +00:00
parent bcddf743dd
commit 2532f0f5e6
4 changed files with 27 additions and 11 deletions

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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 *);