diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-02-09 02:33:08 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-02-09 02:33:08 -0500 |
commit | afc35d5efde48b82a7786d9c89b115965da6b637 (patch) | |
tree | d71e3007272b5eaa392feb84064459d8de9d82f5 /arch/i386 | |
parent | ed2911a11317729c1a13e779237fed736c676c1b (diff) | |
download | musl-afc35d5efde48b82a7786d9c89b115965da6b637.tar.gz musl-afc35d5efde48b82a7786d9c89b115965da6b637.tar.bz2 musl-afc35d5efde48b82a7786d9c89b115965da6b637.tar.xz musl-afc35d5efde48b82a7786d9c89b115965da6b637.zip |
replace bad cancellation cleanup abi with a sane one
the old abi was intended to duplicate glibc's abi at the expense of
being ugly and slow, but it turns out glib was not even using that abi
except on non-gcc-compatible compilers (which it doesn't even support)
and was instead using an exceptions-in-c/unwind-based approach whose
abi we could not duplicate anyway without nasty dwarf2/unwind
integration.
the new abi is copied from a very old glibc abi, which seems to still
be supported/present in current glibc. it avoids all unwinding,
whether by sjlj or exceptions, and merely maintains a linked list of
cleanup functions to be called from the context of pthread_exit. i've
made some care to ensure that longjmp out of a cleanup function should
work, even though it is not required to.
this change breaks abi compatibility with programs which were using
pthread cancellation, which is unfortunate, but that's why i'm making
the change now rather than later. considering that most pthread
features have not been usable until recently anyway, i don't see it as
a major issue at this point.
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/bits/pthread.h | 25 |
1 files changed, 0 insertions, 25 deletions
diff --git a/arch/i386/bits/pthread.h b/arch/i386/bits/pthread.h deleted file mode 100644 index c119dc8a..00000000 --- a/arch/i386/bits/pthread.h +++ /dev/null @@ -1,25 +0,0 @@ -struct __ptcb { - long __jb[7]; - int __dummy; - struct __ptcb *__next; - void *__ptrs[3]; -}; - -static inline void __pthread_register_cancel_2(struct __ptcb *__cb) -{ - __asm__ __volatile__( "call __pthread_register_cancel" : : "a"(__cb) : "ecx", "edx", "memory" ); -} - -static inline void __pthread_unregister_cancel_2(struct __ptcb *__cb) -{ - __asm__ __volatile__( "call __pthread_unregister_cancel" : : "a"(__cb) : "ecx", "edx", "memory" ); -} - -static inline void __pthread_unwind_next_2(struct __ptcb *__cb) -{ - __asm__ __volatile__( "call __pthread_unwind_next" : : "a"(__cb) : "ecx", "edx", "memory" ); -} - -#define __pthread_register_cancel __pthread_register_cancel_2 -#define __pthread_unregister_cancel __pthread_unregister_cancel_2 -#define __pthread_unwind_next __pthread_unwind_next_2 |