From 5f37fc132a8f41994f37b6712feb2d4fd34c2be0 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 3 Aug 2011 19:57:46 -0400 Subject: [PATCH] further debloat cancellation handlers cleanup push and pop are also no-ops if pthread_exit is not reachable. this can make a big difference for library code which needs to protect itself against cancellation, but which is unlikely to actually be used in programs with threads/cancellation. --- src/thread/cancellation.c | 18 ++++-------------- src/thread/cancellation2.c | 0 .../i386/{cancellation2.s => cancellation.s} | 16 +++++++++++++--- src/thread/pthread_create.c | 13 +++++++++++++ 4 files changed, 30 insertions(+), 17 deletions(-) delete mode 100644 src/thread/cancellation2.c rename src/thread/i386/{cancellation2.s => cancellation.s} (53%) diff --git a/src/thread/cancellation.c b/src/thread/cancellation.c index 6dfee539..b02cdfb0 100644 --- a/src/thread/cancellation.c +++ b/src/thread/cancellation.c @@ -1,18 +1,11 @@ #include "pthread_impl.h" -#ifdef __pthread_register_cancel -#undef __pthread_register_cancel -#undef __pthread_unregister_cancel -#undef __pthread_unwind_next -#define __pthread_register_cancel __pthread_register_cancel_3 -#define __pthread_unregister_cancel __pthread_unregister_cancel_3 -#define __pthread_unwind_next __pthread_unwind_next_3 -#endif - static void dummy(struct __ptcb *cb) { } weak_alias(dummy, __pthread_do_unwind); +weak_alias(dummy, __pthread_do_register); +weak_alias(dummy, __pthread_do_unregister); void __pthread_unwind_next(struct __ptcb *cb) { @@ -21,13 +14,10 @@ void __pthread_unwind_next(struct __ptcb *cb) void __pthread_register_cancel(struct __ptcb *cb) { - struct pthread *self = pthread_self(); - cb->__next = self->cancelbuf; - self->cancelbuf = cb; + __pthread_do_register(cb); } void __pthread_unregister_cancel(struct __ptcb *cb) { - struct pthread *self = __pthread_self(); - self->cancelbuf = self->cancelbuf->__next; + __pthread_do_unregister(cb); } diff --git a/src/thread/cancellation2.c b/src/thread/cancellation2.c deleted file mode 100644 index e69de29b..00000000 diff --git a/src/thread/i386/cancellation2.s b/src/thread/i386/cancellation.s similarity index 53% rename from src/thread/i386/cancellation2.s rename to src/thread/i386/cancellation.s index beeffb91..75dc6091 100644 --- a/src/thread/i386/cancellation2.s +++ b/src/thread/i386/cancellation.s @@ -3,7 +3,7 @@ .type __pthread_register_cancel,@function __pthread_register_cancel: pushl %eax - call __pthread_register_cancel_3 + call __pthread_do_register popl %eax ret @@ -11,7 +11,7 @@ __pthread_register_cancel: .type __pthread_unregister_cancel,@function __pthread_unregister_cancel: pushl %eax - call __pthread_unregister_cancel_3 + call __pthread_do_unregister popl %eax ret @@ -19,6 +19,16 @@ __pthread_unregister_cancel: .type __pthread_unwind_next,@function __pthread_unwind_next: pushl %eax - call __pthread_unwind_next_3 + call __pthread_do_unwind popl %eax +__pthread_do_unwind: +__pthread_do_register: +__pthread_do_unregister: ret + +.weak __pthread_do_unwind +.weak __pthread_do_register +.weak __pthread_do_unregister +.type __pthread_do_unwind,@function +.type __pthread_do_register,@function +.type __pthread_do_unregister,@function diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 0e955911..7be58b99 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -39,6 +39,19 @@ void __pthread_do_unwind(struct __ptcb *cb) __syscall(SYS_exit, 0); } +void __pthread_do_register(struct __ptcb *cb) +{ + struct pthread *self = pthread_self(); + cb->__next = self->cancelbuf; + self->cancelbuf = cb; +} + +void __pthread_do_unregister(struct __ptcb *cb) +{ + struct pthread *self = __pthread_self(); + self->cancelbuf = self->cancelbuf->__next; +} + static int start(void *p) { struct pthread *self = p; -- 2.20.1