summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2017-08-03 23:14:21 +0200
committerCorinna Vinschen <corinna@vinschen.de>2017-08-03 23:14:21 +0200
commit65c13851b3fdb695cc415cb77c18931b8594763f (patch)
tree92fde61a0ccf3c158a8b88a2dd1b716cd1aa6133
parentf378384804a6ea14067d5b7468d2222a36a00a29 (diff)
downloadcygnal-65c13851b3fdb695cc415cb77c18931b8594763f.tar.gz
cygnal-65c13851b3fdb695cc415cb77c18931b8594763f.tar.bz2
cygnal-65c13851b3fdb695cc415cb77c18931b8594763f.zip
cygwin: pthread timed locks: actually timeout on timeout
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/thread.cc30
1 files changed, 26 insertions, 4 deletions
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 909940773..b9b2c7aaa 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -1432,13 +1432,21 @@ pthread_rwlock::rdlock (PLARGE_INTEGER timeout)
while (writer || waiting_writers)
{
+ int ret;
+
pthread_cleanup_push (pthread_rwlock::rdlock_cleanup, this);
++waiting_readers;
- cond_readers.wait (&mtx, timeout);
+ ret = cond_readers.wait (&mtx, timeout);
--waiting_readers;
pthread_cleanup_pop (0);
+
+ if (ret == ETIMEDOUT)
+ {
+ result = ETIMEDOUT;
+ goto DONE;
+ }
}
if ((reader = add_reader ()))
@@ -1496,13 +1504,21 @@ pthread_rwlock::wrlock (PLARGE_INTEGER timeout)
while (writer || readers)
{
+ int ret;
+
pthread_cleanup_push (pthread_rwlock::wrlock_cleanup, this);
++waiting_writers;
- cond_writers.wait (&mtx, timeout);
+ ret = cond_writers.wait (&mtx, timeout);
--waiting_writers;
pthread_cleanup_pop (0);
+
+ if (ret == ETIMEDOUT)
+ {
+ result = ETIMEDOUT;
+ goto DONE;
+ }
}
writer = self;
@@ -1775,8 +1791,14 @@ pthread_mutex::lock (PLARGE_INTEGER timeout)
else if (type == PTHREAD_MUTEX_NORMAL /* potentially causes deadlock */
|| !pthread::equal (owner, self))
{
- cygwait (win32_obj_id, timeout, cw_sig | cw_sig_restart);
- set_owner (self);
+ if (cygwait (win32_obj_id, timeout, cw_sig | cw_sig_restart)
+ != WAIT_TIMEOUT)
+ set_owner (self);
+ else
+ {
+ InterlockedDecrement (&lock_counter);
+ result = ETIMEDOUT;
+ }
}
else
{