diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2021-01-10 13:21:26 +0100 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2021-01-10 13:25:09 +0100 |
commit | 1b152d44acc2fb7992711a3cb2e8cd2322aecb30 (patch) | |
tree | 030ccf1e21510df4320341dc74b9d86d22bd1ca4 | |
parent | 5ec390b478ec20d11fab41065a4e90fb0ecd74fc (diff) |
Add error checking to mutexes and condition variables.
After the discussions about PTHREAD_PROCESS_SHARED and after
observing that on Cygwin the program simply hangs because
this flag is not implemented there, the best way is to check
for errors and exit with a clear error message instead of
some mysterious hang.
libgfortran/ChangeLog:
* caf_shared/util.c (ERRCHECK): New macro.
(initialize_shared_mutex): Use it to check return codes.
(initialize_shared_condition): Likewise.
-rw-r--r-- | libgfortran/caf_shared/util.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/libgfortran/caf_shared/util.c b/libgfortran/caf_shared/util.c index 683e2f36d63..65b347e7a8c 100644 --- a/libgfortran/caf_shared/util.c +++ b/libgfortran/caf_shared/util.c @@ -48,24 +48,33 @@ next_power_of_two (size_t size) return 1 << (PTR_BITS - __builtin_clzl (size - 1)); } +#define ERRCHECK(a) do { \ + int rc = a; \ + if (rc) { \ + errno = rc; \ + perror (#a " failed"); \ + exit (1); \ + } \ +} while(0) + void initialize_shared_mutex (pthread_mutex_t *mutex) { pthread_mutexattr_t mattr; - pthread_mutexattr_init (&mattr); - pthread_mutexattr_setpshared (&mattr, PTHREAD_PROCESS_SHARED); - pthread_mutex_init (mutex, &mattr); - pthread_mutexattr_destroy (&mattr); + ERRCHECK (pthread_mutexattr_init (&mattr)); + ERRCHECK (pthread_mutexattr_setpshared (&mattr, PTHREAD_PROCESS_SHARED)); + ERRCHECK (pthread_mutex_init (mutex, &mattr)); + ERRCHECK (pthread_mutexattr_destroy (&mattr)); } void initialize_shared_condition (pthread_cond_t *cond) { pthread_condattr_t cattr; - pthread_condattr_init (&cattr); - pthread_condattr_setpshared (&cattr, PTHREAD_PROCESS_SHARED); - pthread_cond_init (cond, &cattr); - pthread_condattr_destroy (&cattr); + ERRCHECK (pthread_condattr_init (&cattr)); + ERRCHECK (pthread_condattr_setpshared (&cattr, PTHREAD_PROCESS_SHARED)); + ERRCHECK (pthread_cond_init (cond, &cattr)); + ERRCHECK (pthread_condattr_destroy (&cattr)); } int |