]> sourceware.org Git - newlib-cygwin.git/commitdiff
cygwin: Implement pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock
authorCorinna Vinschen <corinna@vinschen.de>
Thu, 3 Aug 2017 19:31:38 +0000 (21:31 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Thu, 3 Aug 2017 19:31:38 +0000 (21:31 +0200)
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
winsup/cygwin/common.din
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/release/2.9.0
winsup/cygwin/thread.cc
winsup/cygwin/thread.h
winsup/doc/new-features.xml
winsup/doc/posix.xml

index 9c8da379dd05015296c342ed4c72882414f1b6be..8da432b8a94a971da87db1095d26be2b5616a2be 100644 (file)
@@ -1085,6 +1085,8 @@ pthread_once SIGFE
 pthread_rwlock_destroy SIGFE
 pthread_rwlock_init SIGFE
 pthread_rwlock_rdlock SIGFE
+pthread_rwlock_timedrdlock SIGFE
+pthread_rwlock_timedwrlock SIGFE
 pthread_rwlock_tryrdlock SIGFE
 pthread_rwlock_trywrlock SIGFE
 pthread_rwlock_unlock SIGFE
index a8424213231e889c6f8f3c05c6fa73e6b9f0fae2..efd4ac017f4d4203bb8d8ef799c34c00e00482ec 100644 (file)
@@ -480,12 +480,13 @@ details. */
   313: Export fls, flsl, flsll.
   314: Export explicit_bzero.
   315: Export pthread_mutex_timedlock.
+  316: Export pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock.
 
   Note that we forgot to bump the api for ualarm, strtoll, strtoull,
   sigaltstack, sethostname. */
 
 #define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 315
+#define CYGWIN_VERSION_API_MINOR 316
 
 /* There is also a compatibity version number associated with the shared memory
    regions.  It is incremented when incompatible changes are made to the shared
index 0fb4a070bbf2c89832104fc5f206e32bf1c78c99..421d6f24f944ce04641e244279adaa3fa6b055b3 100644 (file)
@@ -1,7 +1,10 @@
 What's new:
 -----------
 
-- New APIs: explicit_bzero, pthread_mutex_timedwait.
+- New APIs: explicit_bzero.
+
+- New APIs: pthread_mutex_timedwait, pthread_rwlock_timedrdlock,
+           pthread_rwlock_timedwrlock.
 
 
 What changed:
index c06c077c8c5c21cbe5298e08880f32d0021f22fd..963c4017b7831a3cfcb4102318c87242d9eaed88 100644 (file)
@@ -1413,7 +1413,7 @@ pthread_rwlock::~pthread_rwlock ()
 }
 
 int
-pthread_rwlock::rdlock ()
+pthread_rwlock::rdlock (PLARGE_INTEGER timeout)
 {
   int result = 0;
   struct RWLOCK_READER *reader;
@@ -1435,7 +1435,7 @@ pthread_rwlock::rdlock ()
       pthread_cleanup_push (pthread_rwlock::rdlock_cleanup, this);
 
       ++waiting_readers;
-      cond_readers.wait (&mtx);
+      cond_readers.wait (&mtx, timeout);
       --waiting_readers;
 
       pthread_cleanup_pop (0);
@@ -1481,7 +1481,7 @@ pthread_rwlock::tryrdlock ()
 }
 
 int
-pthread_rwlock::wrlock ()
+pthread_rwlock::wrlock (PLARGE_INTEGER timeout)
 {
   int result = 0;
   pthread_t self = pthread::self ();
@@ -1499,7 +1499,7 @@ pthread_rwlock::wrlock ()
       pthread_cleanup_push (pthread_rwlock::wrlock_cleanup, this);
 
       ++waiting_writers;
-      cond_writers.wait (&mtx);
+      cond_writers.wait (&mtx, timeout);
       --waiting_writers;
 
       pthread_cleanup_pop (0);
@@ -3045,6 +3045,37 @@ pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
   return (*rwlock)->rdlock ();
 }
 
+extern "C" int
+pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock,
+                           const struct timespec *abstime)
+{
+  LARGE_INTEGER timeout;
+
+  pthread_testcancel ();
+
+  if (pthread_rwlock::is_initializer (rwlock))
+    pthread_rwlock::init (rwlock, NULL);
+  if (!pthread_rwlock::is_good_object (rwlock))
+    return EINVAL;
+
+  /* According to SUSv3, abstime need not be checked for validity,
+     if the rwlock can be locked immediately. */
+  if (!(*rwlock)->tryrdlock ())
+    return 0;
+
+  __try
+    {
+      int err = pthread_convert_abstime (CLOCK_REALTIME, abstime, &timeout);
+      if (err)
+       return err;
+
+      return (*rwlock)->rdlock (&timeout);
+    }
+  __except (NO_ERROR) {}
+  __endtry
+  return EINVAL;
+}
+
 extern "C" int
 pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock)
 {
@@ -3069,6 +3100,37 @@ pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
   return (*rwlock)->wrlock ();
 }
 
+extern "C" int
+pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock,
+                           const struct timespec *abstime)
+{
+  LARGE_INTEGER timeout;
+
+  pthread_testcancel ();
+
+  if (pthread_rwlock::is_initializer (rwlock))
+    pthread_rwlock::init (rwlock, NULL);
+  if (!pthread_rwlock::is_good_object (rwlock))
+    return EINVAL;
+
+  /* According to SUSv3, abstime need not be checked for validity,
+     if the rwlock can be locked immediately. */
+  if (!(*rwlock)->trywrlock ())
+    return 0;
+
+  __try
+    {
+      int err = pthread_convert_abstime (CLOCK_REALTIME, abstime, &timeout);
+      if (err)
+       return err;
+
+      return (*rwlock)->wrlock (&timeout);
+    }
+  __except (NO_ERROR) {}
+  __endtry
+  return EINVAL;
+}
+
 extern "C" int
 pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock)
 {
index 88586ac4e184c4cf3b15643f84bcdbc4f1246942..12a9ef26d381ae5e58d0b0d90bda288837d758b0 100644 (file)
@@ -587,10 +587,10 @@ public:
   } *readers;
   fast_mutex readers_mx;
 
-  int rdlock ();
+  int rdlock (PLARGE_INTEGER timeout = NULL);
   int tryrdlock ();
 
-  int wrlock ();
+  int wrlock (PLARGE_INTEGER timeout = NULL);
   int trywrlock ();
 
   int unlock ();
index d7acd9b389186e10cea5690a44401e6b4f83c7a1..23673d1e0827744e02e0a67cef013d48d14ee547 100644 (file)
@@ -9,7 +9,12 @@
 <itemizedlist mark="bullet">
 
 <listitem><para>
-New APIs: explicit_bzero, pthread_mutex_timedwait.
+New APIs: explicit_bzero.
+</para></listitem>
+
+<listitem><para>
+New APIs: pthread_mutex_timedwait, pthread_rwlock_timedrdlock,
+pthread_rwlock_timedwrlock.
 </para></listitem>
 
 <listitem><para>
index c9f4f00ecceed102fc19882bf4bbfe02fcba36fe..a2fffeebf402316b0c038224fca4223f6b72640e 100644 (file)
@@ -723,6 +723,8 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
     pthread_rwlock_destroy
     pthread_rwlock_init
     pthread_rwlock_rdlock
+    pthread_rwlock_timedrdlock
+    pthread_rwlock_timedwrlock
     pthread_rwlock_tryrdlock
     pthread_rwlock_trywrlock
     pthread_rwlock_unlock
@@ -1575,8 +1577,6 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
     pthread_mutexattr_getrobust
     pthread_mutexattr_setrobust
     pthread_mutex_consistent
-    pthread_rwlock_timedrdlock
-    pthread_rwlock_timedwrlock
     putmsg
     setnetent
     sigtimedwait
This page took 0.039507 seconds and 5 git commands to generate.