diff options
author | neal <neal> | 2008-08-16 13:35:09 +0000 |
---|---|---|
committer | neal <neal> | 2008-08-16 13:35:09 +0000 |
commit | d98fd43d82e69ca8d2b28c1e597ade33a555207e (patch) | |
tree | cbc7fdd74223ce6ee122d24bb59c55a79e5f16fe | |
parent | 66da40a602fe373aab0bfdf22e711cb74dfc91f4 (diff) |
hurd/
2008-08-16 Neal H. Walfield <neal@gnu.org>
* thread.h (thread_start_sp_ip): New function.
libpthread/
2008-08-16 Neal H. Walfield <neal@gnu.org>
* sysdeps/l4/hurd/pt-docancel.c: New file.
-rw-r--r-- | hurd/ChangeLog | 4 | ||||
-rw-r--r-- | hurd/thread.h | 15 | ||||
-rw-r--r-- | libpthread/ChangeLog | 4 | ||||
-rw-r--r-- | libpthread/sysdeps/l4/hurd/pt-docancel.c | 41 |
4 files changed, 64 insertions, 0 deletions
diff --git a/hurd/ChangeLog b/hurd/ChangeLog index 25b5827..ed94ead 100644 --- a/hurd/ChangeLog +++ b/hurd/ChangeLog @@ -1,3 +1,7 @@ +2008-08-16 Neal H. Walfield <neal@gnu.org> + + * thread.h (thread_start_sp_ip): New function. + 2008-07-04 Neal H. Walfield <neal@gnu.org> * mutex.h (ss_mutex_lock): Only complain about a possible deadlock diff --git a/hurd/thread.h b/hurd/thread.h index fd504b0..c583723 100644 --- a/hurd/thread.h +++ b/hurd/thread.h @@ -212,6 +212,21 @@ thread_start (addr_t thread) } static inline error_t +thread_start_sp_ip (addr_t thread, uintptr_t sp, uintptr_t ip) +{ + struct hurd_thread_exregs_in in; + struct hurd_thread_exregs_out out; + + in.sp = sp; + in.ip = ip; + + return rm_thread_exregs (ADDR_VOID, thread, + HURD_EXREGS_START | HURD_EXREGS_ABORT_IPC + | HURD_EXREGS_SET_SP_IP, + in, &out); +} + +static inline error_t thread_stop (addr_t thread) { struct hurd_thread_exregs_in in; diff --git a/libpthread/ChangeLog b/libpthread/ChangeLog index 35565d5..fdd7b4b 100644 --- a/libpthread/ChangeLog +++ b/libpthread/ChangeLog @@ -1,5 +1,9 @@ 2008-08-16 Neal H. Walfield <neal@gnu.org> + * sysdeps/l4/hurd/pt-docancel.c: New file. + +2008-08-16 Neal H. Walfield <neal@gnu.org> + * pthread/pt-alloc.c: Don't include <atomic.h>. (__pthread_free_threads): Change to a struct __pthread *. (__pthread_free_threads_lock): New variable. diff --git a/libpthread/sysdeps/l4/hurd/pt-docancel.c b/libpthread/sysdeps/l4/hurd/pt-docancel.c new file mode 100644 index 0000000..2fb3f6f --- /dev/null +++ b/libpthread/sysdeps/l4/hurd/pt-docancel.c @@ -0,0 +1,41 @@ +/* Cancel a thread. Viengoos version. + Copyright (C) 2002, 2007, 2008 Free Software Foundation, Inc. + This file is part of the GNU Hurd. + + GNU Hurd is free software: you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with GNU Hurd. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <pthread.h> + +#include <pt-internal.h> + +static void +call_exit (void) +{ + pthread_exit (0); +} + +int +__pthread_do_cancel (struct __pthread *p) +{ + assert (p->cancel_pending == 1); + assert (p->cancel_state == PTHREAD_CANCEL_ENABLE); + + if (l4_is_thread_equal (l4_myself (), p->threadid)) + call_exit (); + else + thread_start_sp_ip (p->object, + p->mcontext.sp, (uintptr_t) call_exit); + return 0; +} |