Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2011-05-01 21:42:41 +0400
committerCorinna Vinschen <corinna@vinschen.de>2011-05-01 21:42:41 +0400
commita91ac4dca9f8edca7945593509267beff5a504fe (patch)
treeab305094a97533163362a0efcdb93ac9df1b8270 /winsup/cygwin
parent1112b2c38f39f33daefd03bb1eebe9e1f84eabaf (diff)
* fhandler_windows.cc (fhandler_windows::read): Use
pthread::get_cancel_event to fetch thread's cancel event. * flock.cc (lf_setlock): Ditto. * posix_ipc.cc (ipc_cond_timedwait): Ditto. * thread.cc (pthread::get_cancel_event): New static method. * thread.h (pthread::get_cancel_event): Declare.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog9
-rw-r--r--winsup/cygwin/fhandler_windows.cc6
-rw-r--r--winsup/cygwin/flock.cc5
-rw-r--r--winsup/cygwin/posix_ipc.cc7
-rw-r--r--winsup/cygwin/thread.cc13
-rw-r--r--winsup/cygwin/thread.h1
6 files changed, 28 insertions, 13 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 338ddbc0f..989437a0b 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,14 @@
2011-05-01 Corinna Vinschen <corinna@vinschen.de>
+ * fhandler_windows.cc (fhandler_windows::read): Use
+ pthread::get_cancel_event to fetch thread's cancel event.
+ * flock.cc (lf_setlock): Ditto.
+ * posix_ipc.cc (ipc_cond_timedwait): Ditto.
+ * thread.cc (pthread::get_cancel_event): New static method.
+ * thread.h (pthread::get_cancel_event): Declare.
+
+2011-05-01 Corinna Vinschen <corinna@vinschen.de>
+
* libc/minires-os-if.c (get_dns_info): Remove unnecessary test for
existence of DnsQuery_A.
diff --git a/winsup/cygwin/fhandler_windows.cc b/winsup/cygwin/fhandler_windows.cc
index 119266093..d4c39d4c0 100644
--- a/winsup/cygwin/fhandler_windows.cc
+++ b/winsup/cygwin/fhandler_windows.cc
@@ -98,10 +98,8 @@ fhandler_windows::read (void *buf, size_t& len)
HANDLE w4[3] = { get_handle (), signal_arrived, NULL };
DWORD cnt = 2;
- pthread_t thread = pthread::self ();
- if (thread && thread->cancel_event
- && thread->cancelstate != PTHREAD_CANCEL_DISABLE)
- w4[cnt++] = thread->cancel_event;
+ if ((w4[cnt] = pthread::get_cancel_event ()) != NULL)
+ ++cnt;
restart:
switch (MsgWaitForMultipleObjectsEx (cnt, w4,
is_nonblocking () ? 0 : INFINITE,
diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc
index b4ef9e6a9..426b1044f 100644
--- a/winsup/cygwin/flock.cc
+++ b/winsup/cygwin/flock.cc
@@ -958,10 +958,7 @@ lf_setlock (lockf_t *lock, inode_t *node, lockf_t **clean, HANDLE fhdl)
return EDEADLK;
}
- pthread_t thread = pthread::self ();
- HANDLE cancel_event = (thread && thread->cancel_event
- && thread->cancelstate != PTHREAD_CANCEL_DISABLE)
- ? thread->cancel_event : NULL;
+ HANDLE cancel_event = pthread::get_cancel_event ();
int wait_count = 0;
/* The lock is always the first object. */
diff --git a/winsup/cygwin/posix_ipc.cc b/winsup/cygwin/posix_ipc.cc
index ec6b6c76a..9f98e9d10 100644
--- a/winsup/cygwin/posix_ipc.cc
+++ b/winsup/cygwin/posix_ipc.cc
@@ -174,16 +174,13 @@ ipc_cond_init (HANDLE *pevt, const char *name, char sr)
static int
ipc_cond_timedwait (HANDLE evt, HANDLE mtx, const struct timespec *abstime)
{
- pthread_t thread;
HANDLE w4[4] = { evt, signal_arrived, NULL, NULL };
DWORD cnt = 2;
DWORD timer_idx = 0;
int ret = 0;
- thread = pthread::self ();
- if (thread && thread->cancel_event
- && thread->cancelstate != PTHREAD_CANCEL_DISABLE)
- w4[cnt++] = thread->cancel_event;
+ if ((w4[cnt] = pthread::get_cancel_event ()) != NULL)
+ ++cnt;
if (abstime)
{
if (abstime->tv_sec < 0
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index b4a9b2982..3de53f6fa 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -885,6 +885,19 @@ pthread::testcancel ()
}
}
+/* Return cancel event handle if it exists *and* cancel is not disabled.
+ This function is supposed to be used from other functions which are
+ cancelable and need the cancel event in a WFMO call. */
+HANDLE
+pthread::get_cancel_event ()
+{
+ pthread_t thread = pthread::self ();
+
+ return (thread && thread->cancel_event
+ && thread->cancelstate != PTHREAD_CANCEL_DISABLE)
+ ? thread->cancel_event : NULL;
+}
+
void
pthread::static_cancel_self ()
{
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
index 2453630f8..4ffbc4c01 100644
--- a/winsup/cygwin/thread.h
+++ b/winsup/cygwin/thread.h
@@ -399,6 +399,7 @@ public:
virtual int cancel ();
virtual void testcancel ();
+ static HANDLE get_cancel_event ();
static void static_cancel_self ();
virtual int setcancelstate (int state, int *oldstate);