This is the mail archive of the
cygwin-cvs@cygwin.com
mailing list for the Cygwin project.
[newlib-cygwin] cygwin: pthread timed locks: actually timeout on timeout
- From: Corinna Vinschen <corinna at sourceware dot org>
- To: cygwin-cvs at sourceware dot org
- Date: 3 Aug 2017 21:15:35 -0000
- Subject: [newlib-cygwin] cygwin: pthread timed locks: actually timeout on timeout
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=65c13851b3fdb695cc415cb77c18931b8594763f
commit 65c13851b3fdb695cc415cb77c18931b8594763f
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Thu Aug 3 23:14:21 2017 +0200
cygwin: pthread timed locks: actually timeout on timeout
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/thread.cc | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 9099407..b9b2c7a 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
{