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:
authorChristopher Faylor <me@cgf.cx>2012-06-19 04:52:59 +0400
committerChristopher Faylor <me@cgf.cx>2012-06-19 04:52:59 +0400
commit978441cc0ea58a2f3fd5d84f1d0f50bc8307b34a (patch)
tree3afb58a7fcc101fd407582a1c38b020526797e1e
parent2addde8cb1e794a9818b9417839524dbc05401da (diff)
* cygwait.h (LARGE_NULL): Define.
(cancelable_wait): Define variant which accepts DWORD time argument. (cygwait): Use cancelable_wait with DWORD argument. (cygwait): Use cancelable_wait with DWORD argument and cw_sig_eintr for timeout-only case. * exceptions.cc (handle_sigsuspend): Use LARGE_NULL as second argument to distinguish between cancelable_wait variants. * thread.cc (pthread_mutex::lock): Ditto. (pthread::join): Ditto. (semaphore::_timedwait): Ditto. * thread.h (fast_mutex::lock): Ditto. * wait.cc (wait4): Ditto.
-rw-r--r--winsup/cygwin/ChangeLog15
-rw-r--r--winsup/cygwin/cygwait.h13
-rw-r--r--winsup/cygwin/exceptions.cc2
-rw-r--r--winsup/cygwin/thread.cc6
-rw-r--r--winsup/cygwin/thread.h2
-rw-r--r--winsup/cygwin/wait.cc2
6 files changed, 31 insertions, 9 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 9302d8b21..84e1ede2b 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,20 @@
2012-06-18 Christopher Faylor <me.cygwin2012@cgf.cx>
+ * cygwait.h (LARGE_NULL): Define.
+ (cancelable_wait): Define variant which accepts DWORD time argument.
+ (cygwait): Use cancelable_wait with DWORD argument.
+ (cygwait): Use cancelable_wait with DWORD argument and cw_sig_eintr for
+ timeout-only case.
+ * exceptions.cc (handle_sigsuspend): Use LARGE_NULL as second argument
+ to distinguish between cancelable_wait variants.
+ * thread.cc (pthread_mutex::lock): Ditto.
+ (pthread::join): Ditto.
+ (semaphore::_timedwait): Ditto.
+ * thread.h (fast_mutex::lock): Ditto.
+ * wait.cc (wait4): Ditto.
+
+2012-06-18 Christopher Faylor <me.cygwin2012@cgf.cx>
+
* cygwait.cc (cancelable_wait): Mimic old cygwait behavior more closely
wrt handling of call_signal_handler.
* cygwait.h (WAIT_CANCELED): Move here and redefine.
diff --git a/winsup/cygwin/cygwait.h b/winsup/cygwin/cygwait.h
index 9b2be02ac..9a49be7ff 100644
--- a/winsup/cygwin/cygwait.h
+++ b/winsup/cygwin/cygwait.h
@@ -22,6 +22,7 @@ enum cw_wait_mask
cw_sig_eintr = 0x0008
};
+#define LARGE_NULL ((PLARGE_INTEGER) NULL)
const unsigned cw_std_mask = cw_cancel | cw_cancel_self | cw_sig;
DWORD cancelable_wait (HANDLE, PLARGE_INTEGER timeout = NULL,
@@ -29,7 +30,7 @@ DWORD cancelable_wait (HANDLE, PLARGE_INTEGER timeout = NULL,
__attribute__ ((regparm (3)));
static inline DWORD __attribute__ ((always_inline))
-cygwait (HANDLE h, DWORD howlong = INFINITE)
+cancelable_wait (HANDLE h, DWORD howlong, unsigned mask)
{
PLARGE_INTEGER pli_howlong;
LARGE_INTEGER li_howlong;
@@ -40,11 +41,17 @@ cygwait (HANDLE h, DWORD howlong = INFINITE)
li_howlong.QuadPart = 10000ULL * howlong;
pli_howlong = &li_howlong;
}
- return cancelable_wait (h, pli_howlong, cw_cancel | cw_sig);
+ return cancelable_wait (h, pli_howlong, mask);
+}
+
+static inline DWORD __attribute__ ((always_inline))
+cygwait (HANDLE h, DWORD howlong = INFINITE)
+{
+ return cancelable_wait (h, howlong, cw_cancel | cw_sig);
}
static inline DWORD __attribute__ ((always_inline))
cygwait (DWORD howlong)
{
- return cygwait ((HANDLE) NULL, howlong);
+ return cancelable_wait (NULL, howlong, cw_cancel | cw_sig_eintr);
}
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 3c22e35c3..be3840fff 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -715,7 +715,7 @@ handle_sigsuspend (sigset_t tempmask)
sigproc_printf ("oldmask %p, newmask %p", oldmask, tempmask);
pthread_testcancel ();
- cancelable_wait (signal_arrived, NULL, cw_cancel | cw_cancel_self);
+ cancelable_wait (signal_arrived, LARGE_NULL, cw_cancel | cw_cancel_self);
set_sig_errno (EINTR); // Per POSIX
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index f3ff336f4..5caf5ca73 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -1744,7 +1744,7 @@ pthread_mutex::lock ()
|| !pthread::equal (owner, self))
{
/* FIXME: no cancel? */
- cancelable_wait (win32_obj_id, NULL, cw_sig);
+ cancelable_wait (win32_obj_id, LARGE_NULL, cw_sig);
set_owner (self);
}
else
@@ -2364,7 +2364,7 @@ pthread::join (pthread_t *thread, void **return_val)
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
(*thread)->mutex.unlock ();
- switch (cancelable_wait ((*thread)->win32_obj_id, NULL, cw_sig | cw_cancel))
+ switch (cancelable_wait ((*thread)->win32_obj_id, LARGE_NULL, cw_sig | cw_cancel))
{
case WAIT_OBJECT_0:
if (return_val)
@@ -3501,7 +3501,7 @@ semaphore::_timedwait (const struct timespec *abstime)
int
semaphore::_wait ()
{
- switch (cancelable_wait (win32_obj_id, NULL, cw_cancel | cw_cancel_self | cw_sig_eintr))
+ switch (cancelable_wait (win32_obj_id, LARGE_NULL, cw_cancel | cw_cancel_self | cw_sig_eintr))
{
case WAIT_OBJECT_0:
currentvalue--;
diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h
index 62a06f60b..a4f5a952c 100644
--- a/winsup/cygwin/thread.h
+++ b/winsup/cygwin/thread.h
@@ -60,7 +60,7 @@ public:
void lock ()
{
if (InterlockedIncrement ((long *) &lock_counter) != 1)
- cancelable_wait (win32_obj_id, NULL, cw_sig);
+ cancelable_wait (win32_obj_id, LARGE_NULL, cw_sig);
}
void unlock ()
diff --git a/winsup/cygwin/wait.cc b/winsup/cygwin/wait.cc
index 829c123bd..714a9e26e 100644
--- a/winsup/cygwin/wait.cc
+++ b/winsup/cygwin/wait.cc
@@ -80,7 +80,7 @@ wait4 (int intpid, int *status, int options, struct rusage *r)
if ((waitfor = w->ev) == NULL)
goto nochildren;
- res = cancelable_wait (waitfor, NULL, cw_cancel | cw_cancel_self);
+ res = cancelable_wait (waitfor, LARGE_NULL, cw_cancel | cw_cancel_self);
sigproc_printf ("%d = cancelable_wait (...)", res);