mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-23 13:09:58 +08:00
htl: avoid cancelling threads inside critical sections
Like hurd_thread_cancel does. * sysdeps/mach/hurd/htl/pt-docancel.c: Include <hurd/signal.h> (__pthread_do_cancel): Lock target thread's critical_section_lock and ss lock around thread mangling.
This commit is contained in:
parent
b9ca3f3efb
commit
726117e01b
@ -17,6 +17,7 @@
|
|||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <hurd/signal.h>
|
||||||
|
|
||||||
#include <pt-internal.h>
|
#include <pt-internal.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
@ -47,10 +48,16 @@ __pthread_do_cancel (struct __pthread *p)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
error_t err;
|
error_t err;
|
||||||
|
struct hurd_sigstate *ss = _hurd_thread_sigstate (p->kernel_thread);
|
||||||
|
|
||||||
|
__spin_lock (&ss->critical_section_lock);
|
||||||
|
__spin_lock (&ss->lock);
|
||||||
|
|
||||||
err = __thread_suspend (p->kernel_thread);
|
err = __thread_suspend (p->kernel_thread);
|
||||||
assert_perror (err);
|
assert_perror (err);
|
||||||
|
|
||||||
|
__spin_unlock (&ss->lock);
|
||||||
|
|
||||||
err = __thread_abort (p->kernel_thread);
|
err = __thread_abort (p->kernel_thread);
|
||||||
assert_perror (err);
|
assert_perror (err);
|
||||||
|
|
||||||
@ -60,6 +67,8 @@ __pthread_do_cancel (struct __pthread *p)
|
|||||||
|
|
||||||
err = __thread_resume (p->kernel_thread);
|
err = __thread_resume (p->kernel_thread);
|
||||||
assert_perror (err);
|
assert_perror (err);
|
||||||
|
|
||||||
|
_hurd_critical_section_unlock (ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user