cygwin: Implement pthread_mutex_timedlock

- pthread_mutex::lock now takes a PLARGE_INTEGER timeout pointer
  and uses that in the call to cygwait.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2017-08-03 19:13:21 +02:00
parent 68217c3178
commit 37738448a0
5 changed files with 35 additions and 4 deletions

View File

@ -1068,6 +1068,7 @@ pthread_mutex_getprioceiling SIGFE
pthread_mutex_init SIGFE pthread_mutex_init SIGFE
pthread_mutex_lock SIGFE pthread_mutex_lock SIGFE
pthread_mutex_setprioceiling SIGFE pthread_mutex_setprioceiling SIGFE
pthread_mutex_timedlock SIGFE
pthread_mutex_trylock SIGFE pthread_mutex_trylock SIGFE
pthread_mutex_unlock SIGFE pthread_mutex_unlock SIGFE
pthread_mutexattr_destroy SIGFE pthread_mutexattr_destroy SIGFE

View File

@ -479,12 +479,13 @@ details. */
312: Export strverscmp, versionsort. 312: Export strverscmp, versionsort.
313: Export fls, flsl, flsll. 313: Export fls, flsl, flsll.
314: Export explicit_bzero. 314: Export explicit_bzero.
315: Export pthread_mutex_timedlock.
Note that we forgot to bump the api for ualarm, strtoll, strtoull, Note that we forgot to bump the api for ualarm, strtoll, strtoull,
sigaltstack, sethostname. */ sigaltstack, sethostname. */
#define CYGWIN_VERSION_API_MAJOR 0 #define CYGWIN_VERSION_API_MAJOR 0
#define CYGWIN_VERSION_API_MINOR 314 #define CYGWIN_VERSION_API_MINOR 315
/* There is also a compatibity version number associated with the shared memory /* There is also a compatibity version number associated with the shared memory
regions. It is incremented when incompatible changes are made to the shared regions. It is incremented when incompatible changes are made to the shared

View File

@ -163,6 +163,7 @@ int pthread_mutex_getprioceiling (const pthread_mutex_t *, int *);
int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *); int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
int pthread_mutex_lock (pthread_mutex_t *); int pthread_mutex_lock (pthread_mutex_t *);
int pthread_mutex_setprioceiling (pthread_mutex_t *, int, int *); int pthread_mutex_setprioceiling (pthread_mutex_t *, int, int *);
int pthread_mutex_timedlock (pthread_mutex_t *, const struct timespec *);
int pthread_mutex_trylock (pthread_mutex_t *); int pthread_mutex_trylock (pthread_mutex_t *);
int pthread_mutex_unlock (pthread_mutex_t *); int pthread_mutex_unlock (pthread_mutex_t *);
int pthread_mutexattr_destroy (pthread_mutexattr_t *); int pthread_mutexattr_destroy (pthread_mutexattr_t *);

View File

@ -1765,7 +1765,7 @@ pthread_mutex::~pthread_mutex ()
} }
int int
pthread_mutex::lock () pthread_mutex::lock (PLARGE_INTEGER timeout)
{ {
pthread_t self = ::pthread_self (); pthread_t self = ::pthread_self ();
int result = 0; int result = 0;
@ -1775,7 +1775,7 @@ pthread_mutex::lock ()
else if (type == PTHREAD_MUTEX_NORMAL /* potentially causes deadlock */ else if (type == PTHREAD_MUTEX_NORMAL /* potentially causes deadlock */
|| !pthread::equal (owner, self)) || !pthread::equal (owner, self))
{ {
cygwait (win32_obj_id, cw_infinite, cw_sig | cw_sig_restart); cygwait (win32_obj_id, timeout, cw_sig | cw_sig_restart);
set_owner (self); set_owner (self);
} }
else else
@ -3284,6 +3284,34 @@ pthread_mutex_lock (pthread_mutex_t *mutex)
return (*mutex)->lock (); return (*mutex)->lock ();
} }
extern "C" int
pthread_mutex_timedlock (pthread_mutex_t *mutex, const struct timespec *abstime)
{
LARGE_INTEGER timeout;
if (pthread_mutex::is_initializer (mutex))
pthread_mutex::init (mutex, NULL, *mutex);
if (!pthread_mutex::is_good_object (mutex))
return EINVAL;
/* According to SUSv3, abstime need not be checked for validity,
if the mutex can be locked immediately. */
if (!(*mutex)->trylock ())
return 0;
__try
{
int err = pthread_convert_abstime (CLOCK_REALTIME, abstime, &timeout);
if (err)
return err;
return (*mutex)->lock (&timeout);
}
__except (NO_ERROR) {}
__endtry
return EINVAL;
}
extern "C" int extern "C" int
pthread_mutex_trylock (pthread_mutex_t *mutex) pthread_mutex_trylock (pthread_mutex_t *mutex)
{ {

View File

@ -267,7 +267,7 @@ public:
static bool is_initializer_or_object (pthread_mutex_t const *); static bool is_initializer_or_object (pthread_mutex_t const *);
static bool is_initializer_or_bad_object (pthread_mutex_t const *); static bool is_initializer_or_bad_object (pthread_mutex_t const *);
int lock (); int lock (PLARGE_INTEGER timeout = NULL);
int trylock (); int trylock ();
int unlock (); int unlock ();
int destroy (); int destroy ();