diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2017-08-03 21:31:38 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2017-08-03 21:31:38 +0200 |
commit | 8128f5482f2b1889e2336488e9d45a33c9972d11 (patch) | |
tree | da7ca6ff5cceb861015df635a47bf532356a825d /winsup | |
parent | eb206317a84a0f4f9f1b673a63e33cd95e50994f (diff) | |
download | cygnal-8128f5482f2b1889e2336488e9d45a33c9972d11.tar.gz cygnal-8128f5482f2b1889e2336488e9d45a33c9972d11.tar.bz2 cygnal-8128f5482f2b1889e2336488e9d45a33c9972d11.zip |
cygwin: Implement pthread_rwlock_timedrdlock, pthread_rwlock_timedwrlock
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/common.din | 2 | ||||
-rw-r--r-- | winsup/cygwin/include/cygwin/version.h | 3 | ||||
-rw-r--r-- | winsup/cygwin/release/2.9.0 | 5 | ||||
-rw-r--r-- | winsup/cygwin/thread.cc | 70 | ||||
-rw-r--r-- | winsup/cygwin/thread.h | 4 | ||||
-rw-r--r-- | winsup/doc/new-features.xml | 7 | ||||
-rw-r--r-- | winsup/doc/posix.xml | 4 |
7 files changed, 84 insertions, 11 deletions
diff --git a/winsup/cygwin/common.din b/winsup/cygwin/common.din index 9c8da379d..8da432b8a 100644 --- a/winsup/cygwin/common.din +++ b/winsup/cygwin/common.din @@ -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 diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index a84242132..efd4ac017 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -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 diff --git a/winsup/cygwin/release/2.9.0 b/winsup/cygwin/release/2.9.0 index 0fb4a070b..421d6f24f 100644 --- a/winsup/cygwin/release/2.9.0 +++ b/winsup/cygwin/release/2.9.0 @@ -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: diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index c06c077c8..963c4017b 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -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); @@ -3046,6 +3046,37 @@ pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) } 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) { if (pthread_rwlock::is_initializer (rwlock)) @@ -3070,6 +3101,37 @@ pthread_rwlock_wrlock (pthread_rwlock_t *rwlock) } 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) { if (pthread_rwlock::is_initializer (rwlock)) diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index 88586ac4e..12a9ef26d 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -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 (); diff --git a/winsup/doc/new-features.xml b/winsup/doc/new-features.xml index d7acd9b38..23673d1e0 100644 --- a/winsup/doc/new-features.xml +++ b/winsup/doc/new-features.xml @@ -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> diff --git a/winsup/doc/posix.xml b/winsup/doc/posix.xml index c9f4f00ec..a2fffeebf 100644 --- a/winsup/doc/posix.xml +++ b/winsup/doc/posix.xml @@ -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 |