From c6d1382a1a597ce5992696534bf8b08b0fd4679d Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 26 Feb 2015 17:00:11 +0000 Subject: [PATCH] * posix_ipc.cc (ipc_mutex_lock): Add bool parameter to influence if cygwait should be in EINTR or in restart mode. Call signal handler if in EINTR mode. (mq_getattr): Call ipc_mutex_lock in restart mode. (mq_setattr): Ditto. (mq_notify): Ditto. (_mq_send): Call ipc_mutex_lock in EINTR mode. (_mq_receive): Ditto. --- winsup/cygwin/ChangeLog | 11 +++++++++++ winsup/cygwin/posix_ipc.cc | 18 ++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c4edd694f..d96aafcfd 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,14 @@ +2015-02-26 Corinna Vinschen + + * posix_ipc.cc (ipc_mutex_lock): Add bool parameter to influence if + cygwait should be in EINTR or in restart mode. Call signal handler + if in EINTR mode. + (mq_getattr): Call ipc_mutex_lock in restart mode. + (mq_setattr): Ditto. + (mq_notify): Ditto. + (_mq_send): Call ipc_mutex_lock in EINTR mode. + (_mq_receive): Ditto. + 2015-02-26 Corinna Vinschen * fhandler_termios.cc (fhandler_termios::line_edit): Fix condition diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc index 067fa5bb0..5ae49ae50 100644 --- a/winsup/cygwin/posix_ipc.cc +++ b/winsup/cygwin/posix_ipc.cc @@ -1,6 +1,6 @@ /* posix_ipc.cc: POSIX IPC API for Cygwin. - Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2014 Red Hat, Inc. + Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2014, 2015 Red Hat, Inc. This file is part of Cygwin. @@ -117,14 +117,16 @@ ipc_mutex_init (HANDLE *pmtx, const char *name) } static int -ipc_mutex_lock (HANDLE mtx) +ipc_mutex_lock (HANDLE mtx, bool eintr) { - switch (cygwait (mtx, cw_infinite, cw_sig_eintr | cw_cancel | cw_cancel_self)) + switch (cygwait (mtx, cw_infinite, cw_cancel | cw_cancel_self + | (eintr ? cw_sig_eintr : cw_sig_restart))) { case WAIT_OBJECT_0: case WAIT_ABANDONED_0: return 0; case WAIT_SIGNALED: + _my_tls.call_signal_handler (); set_errno (EINTR); return 1; default: @@ -662,7 +664,7 @@ mq_getattr (mqd_t mqd, struct mq_attr *mqstat) } mqhdr = mqinfo->mqi_hdr; attr = &mqhdr->mqh_attr; - if ((n = ipc_mutex_lock (mqinfo->mqi_lock)) != 0) + if ((n = ipc_mutex_lock (mqinfo->mqi_lock, false)) != 0) { errno = n; __leave; @@ -698,7 +700,7 @@ mq_setattr (mqd_t mqd, const struct mq_attr *mqstat, struct mq_attr *omqstat) } mqhdr = mqinfo->mqi_hdr; attr = &mqhdr->mqh_attr; - if ((n = ipc_mutex_lock (mqinfo->mqi_lock)) != 0) + if ((n = ipc_mutex_lock (mqinfo->mqi_lock, false)) != 0) { errno = n; __leave; @@ -742,7 +744,7 @@ mq_notify (mqd_t mqd, const struct sigevent *notification) __leave; } mqhdr = mqinfo->mqi_hdr; - if ((n = ipc_mutex_lock (mqinfo->mqi_lock)) != 0) + if ((n = ipc_mutex_lock (mqinfo->mqi_lock, false)) != 0) { errno = n; __leave; @@ -810,7 +812,7 @@ _mq_send (mqd_t mqd, const char *ptr, size_t len, unsigned int prio, mqhdr = mqinfo->mqi_hdr; /* struct pointer */ mptr = (int8_t *) mqhdr; /* byte pointer */ attr = &mqhdr->mqh_attr; - if ((n = ipc_mutex_lock (mqinfo->mqi_lock)) != 0) + if ((n = ipc_mutex_lock (mqinfo->mqi_lock, true)) != 0) { errno = n; __leave; @@ -938,7 +940,7 @@ _mq_receive (mqd_t mqd, char *ptr, size_t maxlen, unsigned int *priop, mqhdr = mqinfo->mqi_hdr; /* struct pointer */ mptr = (int8_t *) mqhdr; /* byte pointer */ attr = &mqhdr->mqh_attr; - if ((n = ipc_mutex_lock (mqinfo->mqi_lock)) != 0) + if ((n = ipc_mutex_lock (mqinfo->mqi_lock, true)) != 0) { errno = n; __leave;