* cygwait.h (enum cw_wait_mask): Add cw_sig_restart. Add comments
to explain the meaning of the possible values. * cygwait.cc (is_cw_sig_restart): Define. (is_cw_sig_handle): Check for cw_sig_restart as well. (cygwait): Restart always if cw_sig_restart is set. * thread.cc (pthread::join): Call cygwait with cw_sig_restart flag to avoid having to handle signals at all.
This commit is contained in:
parent
b6e4adaaf1
commit
093fe9b598
|
@ -1,3 +1,13 @@
|
||||||
|
2015-02-23 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* cygwait.h (enum cw_wait_mask): Add cw_sig_restart. Add comments
|
||||||
|
to explain the meaning of the possible values.
|
||||||
|
* cygwait.cc (is_cw_sig_restart): Define.
|
||||||
|
(is_cw_sig_handle): Check for cw_sig_restart as well.
|
||||||
|
(cygwait): Restart always if cw_sig_restart is set.
|
||||||
|
* thread.cc (pthread::join): Call cygwait with cw_sig_restart flag
|
||||||
|
to avoid having to handle signals at all.
|
||||||
|
|
||||||
2015-02-23 Corinna Vinschen <corinna@vinschen.de>
|
2015-02-23 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* cygwait.cc (cygwait): Move setting res to WAIT_SIGNALED to clarify
|
* cygwait.cc (cygwait): Move setting res to WAIT_SIGNALED to clarify
|
||||||
|
|
|
@ -18,8 +18,10 @@
|
||||||
#define is_cw_sig (mask & cw_sig)
|
#define is_cw_sig (mask & cw_sig)
|
||||||
#define is_cw_sig_eintr (mask & cw_sig_eintr)
|
#define is_cw_sig_eintr (mask & cw_sig_eintr)
|
||||||
#define is_cw_sig_cont (mask & cw_sig_cont)
|
#define is_cw_sig_cont (mask & cw_sig_cont)
|
||||||
|
#define is_cw_sig_restart (mask & cw_sig_restart)
|
||||||
|
|
||||||
#define is_cw_sig_handle (mask & (cw_sig | cw_sig_eintr | cw_sig_cont))
|
#define is_cw_sig_handle (mask & (cw_sig | cw_sig_eintr \
|
||||||
|
| cw_sig_cont | cw_sig_restart))
|
||||||
|
|
||||||
LARGE_INTEGER cw_nowait_storage;
|
LARGE_INTEGER cw_nowait_storage;
|
||||||
|
|
||||||
|
@ -88,7 +90,7 @@ cygwait (HANDLE object, PLARGE_INTEGER timeout, unsigned mask)
|
||||||
continue;
|
continue;
|
||||||
if (is_cw_sig_eintr || (is_cw_sig_cont && sig == SIGCONT))
|
if (is_cw_sig_eintr || (is_cw_sig_cont && sig == SIGCONT))
|
||||||
;
|
;
|
||||||
else if (_my_tls.call_signal_handler ())
|
else if (_my_tls.call_signal_handler () || is_cw_sig_restart)
|
||||||
continue;
|
continue;
|
||||||
res = WAIT_SIGNALED; /* caller will deal with signals */
|
res = WAIT_SIGNALED; /* caller will deal with signals */
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* cygwait.h
|
/* cygwait.h
|
||||||
|
|
||||||
Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
|
Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
|
||||||
Red Hat, Inc.
|
2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -16,11 +16,12 @@
|
||||||
|
|
||||||
enum cw_wait_mask
|
enum cw_wait_mask
|
||||||
{
|
{
|
||||||
cw_cancel = 0x0001,
|
cw_cancel = 0x0001, /* Cancellation point. Return to caller. */
|
||||||
cw_cancel_self = 0x0002,
|
cw_cancel_self = 0x0002, /* Cancellation point. Cancel self. */
|
||||||
cw_sig = 0x0004,
|
cw_sig = 0x0004, /* Handle signals. */
|
||||||
cw_sig_eintr = 0x0008,
|
cw_sig_eintr = 0x0008, /* Caller handles signals. */
|
||||||
cw_sig_cont = 0x0010
|
cw_sig_cont = 0x0010, /* Caller handles SIGCONT. */
|
||||||
|
cw_sig_restart = 0x0020 /* Restart even if SA_RESTART isn't set. */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern LARGE_INTEGER cw_nowait_storage;
|
extern LARGE_INTEGER cw_nowait_storage;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* thread.cc: Locking and threading module functions
|
/* thread.cc: Locking and threading module functions
|
||||||
|
|
||||||
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
||||||
2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
|
2009, 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -2399,7 +2399,8 @@ pthread::join (pthread_t *thread, void **return_val)
|
||||||
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
|
(*thread)->attr.joinable = PTHREAD_CREATE_DETACHED;
|
||||||
(*thread)->mutex.unlock ();
|
(*thread)->mutex.unlock ();
|
||||||
|
|
||||||
switch (cygwait ((*thread)->win32_obj_id, cw_infinite, cw_sig | cw_cancel))
|
switch (cygwait ((*thread)->win32_obj_id, cw_infinite,
|
||||||
|
cw_sig | cw_sig_restart | cw_cancel))
|
||||||
{
|
{
|
||||||
case WAIT_OBJECT_0:
|
case WAIT_OBJECT_0:
|
||||||
if (return_val)
|
if (return_val)
|
||||||
|
|
Loading…
Reference in New Issue