* thread.cc (pthread::pop_cleanup_handler): Move setting the cancelstate

to PTHREAD_CANCEL_DISABLE from here...
	(pthread::pop_all_cleanup_handlers): ...to here, otherwise any explicit
	call to pthread_cleanup_pop disables cancellation for this thread.
This commit is contained in:
Corinna Vinschen 2012-05-23 13:18:34 +00:00
parent 2ca9ed527e
commit dacf4be3fa
2 changed files with 10 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2012-05-23 Corinna Vinschen <corinna@vinschen.de>
* thread.cc (pthread::pop_cleanup_handler): Move setting the cancelstate
to PTHREAD_CANCEL_DISABLE from here...
(pthread::pop_all_cleanup_handlers): ...to here, otherwise any explicit
call to pthread_cleanup_pop disables cancellation for this thread.
2012-05-23 Corinna Vinschen <corinna@vinschen.de>
* fhandler.h (refcnt): Add i interlocked. Explain why.

View File

@ -1069,9 +1069,6 @@ pthread::pop_cleanup_handler (int const execute)
mutex.lock ();
/* We will no honor cancels since the thread is exiting. */
cancelstate = PTHREAD_CANCEL_DISABLE;
if (cleanup_stack != NULL)
{
__pthread_cleanup_handler *handler = cleanup_stack;
@ -1087,6 +1084,9 @@ pthread::pop_cleanup_handler (int const execute)
void
pthread::pop_all_cleanup_handlers ()
{
/* We will no honor cancels since the thread is exiting. */
cancelstate = PTHREAD_CANCEL_DISABLE;
while (cleanup_stack != NULL)
pop_cleanup_handler (1);
}