diff options
author | Wolfgang Hommel <wolfcw@users.noreply.github.com> | 2023-02-25 12:58:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-25 12:58:03 +0100 |
commit | 6d072025c0c7ffb2e4cca38b3b4b1b9ce013131a (patch) | |
tree | 4fde438d98fafc5786a412d270fc9eaaab94ac04 | |
parent | 6fc4ae74f43bd906be74515778c35b2658672958 (diff) | |
parent | 8ef74e33b636a53a757a945d8ebc51d0986f0d81 (diff) | |
download | libfaketime-6d072025c0c7ffb2e4cca38b3b4b1b9ce013131a.tar.gz |
Merge pull request #422 from fixindan/dead_lock_no_return
Swapped out pthread_rwlock_xxlock(), which doesn't return if it can't…
-rw-r--r-- | src/libfaketime.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/libfaketime.c b/src/libfaketime.c index e8d0441..5fa8152 100644 --- a/src/libfaketime.c +++ b/src/libfaketime.c @@ -3602,9 +3602,9 @@ int pthread_cond_init_232(pthread_cond_t *restrict cond, const pthread_condattr_ struct pthread_cond_monotonic *e = (struct pthread_cond_monotonic*)malloc(sizeof(struct pthread_cond_monotonic)); e->ptr = cond; - if (pthread_rwlock_wrlock(&monotonic_conds_lock) != 0) { - fprintf(stderr,"can't acquire write monotonic_conds_lock\n"); - exit(-1); + if (pthread_rwlock_trywrlock(&monotonic_conds_lock) != 0) { + sched_yield(); + return EAGAIN; } HASH_ADD_PTR(monotonic_conds, ptr, e); pthread_rwlock_unlock(&monotonic_conds_lock); @@ -3617,9 +3617,9 @@ int pthread_cond_destroy_232(pthread_cond_t *cond) { struct pthread_cond_monotonic* e; - if (pthread_rwlock_wrlock(&monotonic_conds_lock) != 0) { - fprintf(stderr,"can't acquire write monotonic_conds_lock\n"); - exit(-1); + if (pthread_rwlock_trywrlock(&monotonic_conds_lock) != 0) { + sched_yield(); + return EBUSY; } HASH_FIND_PTR(monotonic_conds, &cond, e); if (e) { @@ -3701,9 +3701,9 @@ int pthread_cond_timedwait_common(pthread_cond_t *cond, pthread_mutex_t *mutex, if (abstime != NULL) { - if (pthread_rwlock_rdlock(&monotonic_conds_lock) != 0) { - fprintf(stderr,"can't acquire read monotonic_conds_lock\n"); - exit(-1); + if (pthread_rwlock_tryrdlock(&monotonic_conds_lock) != 0) { + sched_yield(); + return EAGAIN; } HASH_FIND_PTR(monotonic_conds, &cond, e); pthread_rwlock_unlock(&monotonic_conds_lock); |