void __pthread_perform_cleanup(char *currentframe) { pthread_descr self = thread_self(); struct _pthread_cleanup_buffer * c; for (c = THREAD_GETMEM(self, p_cleanup); c != NULL; c = c->__prev) { #ifdef _STACK_GROWS_DOWN if ((char *) c <= currentframe) break; #elif defined _STACK_GROWS_UP if ((char *) c >= currentframe) break; #else # error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" #endif c->__routine(c->__arg); } #ifdef __UCLIBC_HAS_RPC__ /* And the TSD which needs special help. */ if (THREAD_GETMEM(self, p_libc_specific[_LIBC_TSD_KEY_RPC_VARS]) != NULL) __rpc_thread_destroy (); #endif }
void __pthread_perform_cleanup(char *currentframe) { pthread_descr self = thread_self(); struct _pthread_cleanup_buffer *c = THREAD_GETMEM(self, p_cleanup); struct _pthread_cleanup_buffer *last; if (c != NULL) while (FRAME_LEFT (currentframe, c)) { last = c; c = c->__prev; if (c == NULL || FRAME_LEFT (last, c)) { c = NULL; break; } } while (c != NULL) { c->__routine(c->__arg); last = c; c = c->__prev; if (FRAME_LEFT (last, c)) break; } /* And the TSD which needs special help. */ if (THREAD_GETMEM(self, p_libc_specific[_LIBC_TSD_KEY_RPC_VARS]) != NULL) __rpc_thread_destroy (); }
void __pthread_perform_cleanup(void) { pthread_descr self = thread_self(); struct _pthread_cleanup_buffer * c; for (c = THREAD_GETMEM(self, p_cleanup); c != NULL; c = c->__prev) c->__routine(c->__arg); #ifdef __UCLIBC_HAS_RPC__ /* And the TSD which needs special help. */ if (THREAD_GETMEM(self, p_libc_specific[_LIBC_TSD_KEY_RPC_VARS]) != NULL) __rpc_thread_destroy (); #endif }