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:
Samuel Thibault 2020-06-27 02:34:18 +02:00
parent b9ca3f3efb
commit 726117e01b

View File

@ -17,6 +17,7 @@
<https://www.gnu.org/licenses/>. */
#include <pthread.h>
#include <hurd/signal.h>
#include <pt-internal.h>
#include <pthreadP.h>
@ -47,10 +48,16 @@ __pthread_do_cancel (struct __pthread *p)
else
{
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);
assert_perror (err);
__spin_unlock (&ss->lock);
err = __thread_abort (p->kernel_thread);
assert_perror (err);
@ -60,6 +67,8 @@ __pthread_do_cancel (struct __pthread *p)
err = __thread_resume (p->kernel_thread);
assert_perror (err);
_hurd_critical_section_unlock (ss);
}
return 0;