This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]