Hi Ulrich,
The problem is that io/asynch.h unconditionally uses a couple of
features that are not provided by gthr-simplex, in particular
__gthread_cond_t
and
__gthread_equal / __gthread_self
According to the documentation in gthr.h, the former is only available
if __GTHREAD_HAS_COND is defined, and the latter are only available if
__GTHREADS_CXX0X is defined. Neither is true for gthr-simple.h.
Thanks for the analysis, and the pointer to the macros.
Because the functionality depends on these features, it is best to
remove them if it is not present. So, here is a patch which does
just that.
This was reg-tested on Linux, which showed that the functionality is
still there. I tried bootstrapping on AIX on gcc119, but this failed
due to an unrelated issue (problem with compiling the inline
libraries).
Would it be possible to check if this restores bootstrap in the next
10 hours or so? If so, I would like to commit this. Otherwise, Nicolas
and I will not be able to fix this for a week or so, and it would be
best to revert the async I/O patch :-(
Regards
Thomas
2018-07-25 Thomas Koenig <tkoe...@gcc.gnu.org>
* io/async.h: Test for feature macros for __gthread_cond_t and
__gthread_equal. Define ASYNC_IO if both are present.
(SIGNAL): Define as no-op if ASYNC_IO is not defined.
(WAIT_SIGNAL_MUTEX): Likewise.
(REVOLE_SIGNAL): Likewise.
(transfer_args): Define as useless struct if ASYNC_IO is not
defined.
(adv_cond): Likewise.
(async_unit): Likewise.
* io/async.c (init_async_unit): If ASYNC_IO is not defined,
define alternate function which does nothing.
(enqueue_transfer): Likewise.
(enqueue_done_id): Likewise.
(enqueue_done): Likewise.
(enqueue_close): Likewise.
(enqueue_data_transfer_init): Likewise.
(collect_async_errors): Likewise.
(async_wait_id): Likewise.
(async_wait): Likewise.
(async_close): Likewise.
Index: io/async.h
===================================================================
--- io/async.h (revision 262978)
+++ io/async.h (working copy)
@@ -25,6 +25,16 @@
#ifndef ASYNC_H
#define ASYNC_H
+/* Async I/O will not work on targets which do not support
+ __gthread_cond_t and __gthread_equal / __gthread_self. Check
+ this. */
+
+#if defined(__GTHREAD_HAS_COND) && defined(__GTHREADS_CXX0X)
+#define ASYNC_IO 1
+#else
+#undef ASYNC_IO
+#endif
+
/* Defining DEBUG_ASYNC will enable somewhat verbose debugging
output for async I/O. */
@@ -217,6 +227,8 @@
#define INTERN_UNLOCK(mutex) T_ERROR (__gthread_mutex_unlock, mutex);
+#if ASYNC_IO
+
#define SIGNAL(advcond) do{ \
INTERN_LOCK (&(advcond)->lock); \
(advcond)->pending = 1; \
@@ -257,6 +269,15 @@
INTERN_UNLOCK (&(advcond)->lock); \
} while (0)
+#else
+
+#define SIGNAL(advcond) do{} while(0)
+#define WAIT_SIGNAL_MUTEX(advcond, condition, mutex) do{} while(0)
+#define REVOKE_SIGNAL(advcond) do{} while(0)
+
+#endif
+
+#if ASYNC_IO
DEBUG_LINE (extern __thread const char *aio_prefix);
DEBUG_LINE (typedef struct aio_lock_debug{
@@ -274,6 +295,7 @@ DEBUG_LINE (extern __gthread_mutex_t debug_queue_l
error reporting. */
extern __thread gfc_unit *thread_unit;
+#endif
enum aio_do {
AIO_INVALID = 0,
@@ -285,6 +307,8 @@ enum aio_do {
AIO_CLOSE
};
+#if ASYNC_IO
+
typedef union transfer_args
{
struct
@@ -342,6 +366,23 @@ typedef struct async_unit
} async_unit;
+#else
+typedef union transfer_args
+{
+ int x;
+};
+
+struct adv_cond
+{
+ int x;
+};
+
+typedef struct async_unit
+{
+ int x;
+};
+#endif
+
void init_async_unit (gfc_unit *);
internal_proto (init_async_unit);
Index: io/async.c
===================================================================
--- io/async.c (revision 262978)
+++ io/async.c (working copy)
@@ -36,6 +36,7 @@
#include <sys/types.h>
#include "async.h"
+#if ASYNC_IO
DEBUG_LINE (__thread const char *aio_prefix = MPREFIX);
@@ -481,3 +482,88 @@ async_close (async_unit *au)
T_ERROR (__gthread_join, au->thread, NULL);
free_async_unit (au);
}
+
+#else
+
+/* Do-nothing function, which will not be called. */
+
+void
+init_async_unit (gfc_unit *u)
+{
+ u->au = NULL;
+ return;
+}
+
+/* Do-nothing function, which will not be called. */
+
+void
+enqueue_transfer (async_unit *au, transfer_args *arg, enum aio_do type)
+{
+ return;
+}
+
+/* Do-nothing function, which will not be called. */
+
+int
+enqueue_done_id (async_unit *au, enum aio_do type)
+{
+ return 0;
+}
+
+/* Do-nothing function, which will not be called. */
+
+void
+enqueue_done (async_unit *au, enum aio_do type)
+{
+ return;
+}
+
+/* Do-nothing function, which will not be called. */
+
+void
+enqueue_close (async_unit *au)
+{
+ return;
+}
+
+/* Do-nothing function, which will not be called. */
+
+void
+enqueue_data_transfer_init (async_unit *au, st_parameter_dt *dt, int read_flag)
+{
+ return;
+}
+
+/* Do-nothing function, which will not be called. */
+
+bool
+collect_async_errors (st_parameter_common *cmp, async_unit *au)
+{
+ return false;
+}
+
+/* Do-nothing function, which will not be called. */
+
+bool
+async_wait_id (st_parameter_common *cmp, async_unit *au, int i)
+{
+ return false;
+}
+
+/* Do-nothing function, which will not be called. */
+
+bool
+async_wait (st_parameter_common *cmp, async_unit *au)
+{
+ return false;
+}
+
+/* Do-nothing function, which will not be called. */
+
+void
+async_close (async_unit *au)
+{
+ return;
+}
+
+#endif