mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +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/>. */
|
||||
|
||||
#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;
|
||||
|
Loading…
Reference in New Issue
Block a user