This fixes the cleanup call from __qsort_r
---
 htl/Makefile                                |  2 +-
 htl/Versions                                |  3 +--
 htl/forward.c                               |  3 ---
 htl/pt-cleanup.c                            | 10 ++++++++--
 htl/pt-initialize.c                         |  1 -
 sysdeps/htl/include/bits/cancelation.h      |  5 +++++
 sysdeps/htl/libc-lock.h                     | 19 ++++---------------
 sysdeps/htl/pthread-functions.h             |  2 --
 sysdeps/htl/pthreadP.h                      |  2 +-
 sysdeps/mach/hurd/Makefile                  |  3 ++-
 sysdeps/mach/hurd/i386/libc.abilist         |  1 +
 sysdeps/mach/hurd/i386/libpthread.abilist   |  1 -
 sysdeps/mach/hurd/x86_64/libpthread.abilist |  1 -
 13 files changed, 23 insertions(+), 30 deletions(-)
 create mode 100644 sysdeps/htl/include/bits/cancelation.h

diff --git a/htl/Makefile b/htl/Makefile
index c4780479e3..82b7803c88 100644
--- a/htl/Makefile
+++ b/htl/Makefile
@@ -35,7 +35,6 @@ libpthread-routines := \
   pt-initialize \
   pt-join \
   pt-spin-inlines \
-  pt-cleanup \
   pt-testcancel \
   pt-cancel \
   pt-mutex-transfer-np \
@@ -143,6 +142,7 @@ routines := \
   pt-barrierattr-setpshared \
   pt-block \
   pt-block-intr \
+  pt-cleanup \
   pt-cond \
   pt-cond-brdcast \
   pt-cond-destroy \
diff --git a/htl/Versions b/htl/Versions
index 0052f82264..40ee2748a7 100644
--- a/htl/Versions
+++ b/htl/Versions
@@ -2,6 +2,7 @@ libc {
 
   GLIBC_2.12 {
     pthread_self;
+    __pthread_get_cleanup_stack;
     __pthread_key_create;
     __pthread_self;
     pthread_attr_getdetachstate;
@@ -242,8 +243,6 @@ libpthread {
     __errno_location; __h_errno_location;
   }
   GLIBC_2.12 {
-    __pthread_get_cleanup_stack;
-
     __pthread_mutex_transfer_np;
 
     cthread_detach;
diff --git a/htl/forward.c b/htl/forward.c
index 0a7a69644d..21acf664f4 100644
--- a/htl/forward.c
+++ b/htl/forward.c
@@ -57,6 +57,3 @@ name decl                                                     
              \
 FORWARD_NORETURN (__pthread_exit, void, (void *retval), (retval),
                  exit (EXIT_SUCCESS))
 strong_alias (__pthread_exit, pthread_exit);
-
-FORWARD2 (__pthread_get_cleanup_stack, struct __pthread_cancelation_handler **,
-         (void), (), return &__pthread_cleanup_stack);
diff --git a/htl/pt-cleanup.c b/htl/pt-cleanup.c
index 863c38f5ae..76fdbe2918 100644
--- a/htl/pt-cleanup.c
+++ b/htl/pt-cleanup.c
@@ -19,10 +19,16 @@
 #include <pthread.h>
 
 #include <pt-internal.h>
+#include <shlib-compat.h>
 
 struct __pthread_cancelation_handler **
-__pthread_get_cleanup_stack (void)
+___pthread_get_cleanup_stack (void)
 {
   return &__pthread_cleanup_stack;
 }
-hidden_def(__pthread_get_cleanup_stack)
+versioned_symbol (libc, ___pthread_get_cleanup_stack, 
__pthread_get_cleanup_stack, GLIBC_2_21);
+libc_hidden_ver (___pthread_get_cleanup_stack, __pthread_get_cleanup_stack)
+
+#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_12, GLIBC_2_21)
+compat_symbol (libpthread, ___pthread_get_cleanup_stack, 
__pthread_get_cleanup_stack, GLIBC_2_12);
+#endif
diff --git a/htl/pt-initialize.c b/htl/pt-initialize.c
index 5ffee38bb3..b4e8b15b47 100644
--- a/htl/pt-initialize.c
+++ b/htl/pt-initialize.c
@@ -28,7 +28,6 @@
 #if IS_IN (libpthread)
 static const struct pthread_functions pthread_functions = {
   .ptr___pthread_exit = __pthread_exit,
-  .ptr___pthread_get_cleanup_stack = __pthread_get_cleanup_stack,
   .ptr__IO_flockfile = _cthreads_flockfile,
   .ptr__IO_funlockfile = _cthreads_funlockfile,
   .ptr__IO_ftrylockfile = _cthreads_ftrylockfile,
diff --git a/sysdeps/htl/include/bits/cancelation.h 
b/sysdeps/htl/include/bits/cancelation.h
new file mode 100644
index 0000000000..ef2cd703de
--- /dev/null
+++ b/sysdeps/htl/include/bits/cancelation.h
@@ -0,0 +1,5 @@
+#include_next <bits/cancelation.h>
+
+#ifndef _ISOMAC
+#include <pthreadP.h>
+#endif
diff --git a/sysdeps/htl/libc-lock.h b/sysdeps/htl/libc-lock.h
index 66779b9f6e..8e764a72f1 100644
--- a/sysdeps/htl/libc-lock.h
+++ b/sysdeps/htl/libc-lock.h
@@ -37,13 +37,10 @@
       {                                                                        
      \
        __handler.__handler = FCT;                                            \
        __handler.__arg = ARG;                                                \
-       if (__pthread_get_cleanup_stack != NULL)                              \
-         {                                                                   \
-           __handlers = __pthread_get_cleanup_stack ();                      \
-           __handler.__next = *__handlers;                                   \
-           *__handlers = &__handler;                                         \
-           __registered = 1;                                                 \
-         }                                                                   \
+       __handlers = __pthread_get_cleanup_stack ();                          \
+       __handler.__next = *__handlers;                                       \
+       *__handlers = &__handler;                                             \
+       __registered = 1;                                                     \
       }                                                                        
      \
 
 #define __libc_cleanup_end(DOIT) \
@@ -59,12 +56,4 @@
 #define __libc_cleanup_push(fct, arg) __libc_cleanup_region_start (1, fct, arg)
 #define __libc_cleanup_pop(execute) __libc_cleanup_region_end (execute)
 
-#if !IS_IN (libpthread)
-# ifdef weak_extern
-weak_extern (__pthread_get_cleanup_stack)
-# else
-#  pragma weak __pthread_get_cleanup_stack
-# endif
-#endif
-
 #endif
diff --git a/sysdeps/htl/pthread-functions.h b/sysdeps/htl/pthread-functions.h
index 053649fe5d..aec13a6022 100644
--- a/sysdeps/htl/pthread-functions.h
+++ b/sysdeps/htl/pthread-functions.h
@@ -22,7 +22,6 @@
 #include <pthread.h>
 
 void __pthread_exit (void *) __attribute__ ((__noreturn__));
-struct __pthread_cancelation_handler **__pthread_get_cleanup_stack (void);
 
 void _cthreads_flockfile (FILE *);
 void _cthreads_funlockfile (FILE *);
@@ -34,7 +33,6 @@ int _cthreads_ftrylockfile (FILE *);
 struct pthread_functions
 {
   void (*ptr___pthread_exit) (void *) __attribute__ ((__noreturn__));
-  struct __pthread_cancelation_handler **(*ptr___pthread_get_cleanup_stack) 
(void);
   void (*ptr__IO_flockfile) (FILE *);
   void (*ptr__IO_funlockfile) (FILE *);
   int (*ptr__IO_ftrylockfile) (FILE *);
diff --git a/sysdeps/htl/pthreadP.h b/sysdeps/htl/pthreadP.h
index 64db024cc8..535740f5ea 100644
--- a/sysdeps/htl/pthreadP.h
+++ b/sysdeps/htl/pthreadP.h
@@ -216,11 +216,11 @@ int __pthread_condattr_init (pthread_condattr_t *attr);
 libc_hidden_proto (__pthread_self)
 libc_hidden_proto (__pthread_attr_init)
 libc_hidden_proto (__pthread_condattr_init)
+libc_hidden_proto (__pthread_get_cleanup_stack)
 
 #if IS_IN (libpthread)
 hidden_proto (__pthread_create)
 hidden_proto (__pthread_detach)
-hidden_proto (__pthread_get_cleanup_stack)
 #endif
 
 #if !defined(__NO_WEAK_PTHREAD_ALIASES) && !IS_IN (libpthread)
diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile
index f5ea3240c5..32bba616f1 100644
--- a/sysdeps/mach/hurd/Makefile
+++ b/sysdeps/mach/hurd/Makefile
@@ -337,7 +337,8 @@ ifeq ($(subdir),stdlib)
 tests-unsupported += test-bz22786 tst-strtod-overflow
 # pthread_cleanup_combined_push/pthread_cleanup_combined_pop requires cleanup
 # support (BZ 32058).
-test-xfail-tst-qsortx7 = yes
+test-xfail-tst-qsort7-mem = yes
+test-xfail-tst-qsortx7-mem = yes
 endif
 ifeq ($(subdir),timezone)
 tests-unsupported += tst-tzset
diff --git a/sysdeps/mach/hurd/i386/libc.abilist 
b/sysdeps/mach/hurd/i386/libc.abilist
index a0e686afc7..aac3cb3319 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -28,6 +28,7 @@ GLIBC_2.11 mkostemps F
 GLIBC_2.11 mkostemps64 F
 GLIBC_2.11 mkstemps F
 GLIBC_2.11 mkstemps64 F
+GLIBC_2.12 __pthread_get_cleanup_stack F
 GLIBC_2.12 __pthread_key_create F
 GLIBC_2.12 __pthread_self F
 GLIBC_2.12 pthread_attr_destroy F
diff --git a/sysdeps/mach/hurd/i386/libpthread.abilist 
b/sysdeps/mach/hurd/i386/libpthread.abilist
index 51535ac1c4..9d2c4cd742 100644
--- a/sysdeps/mach/hurd/i386/libpthread.abilist
+++ b/sysdeps/mach/hurd/i386/libpthread.abilist
@@ -1,6 +1,5 @@
 GLIBC_2.12 __mutex_lock_solid F
 GLIBC_2.12 __mutex_unlock_solid F
-GLIBC_2.12 __pthread_get_cleanup_stack F
 GLIBC_2.12 __pthread_kill F
 GLIBC_2.12 __pthread_mutex_transfer_np F
 GLIBC_2.12 __pthread_spin_destroy F
diff --git a/sysdeps/mach/hurd/x86_64/libpthread.abilist 
b/sysdeps/mach/hurd/x86_64/libpthread.abilist
index a1ff462ba9..81d355a94b 100644
--- a/sysdeps/mach/hurd/x86_64/libpthread.abilist
+++ b/sysdeps/mach/hurd/x86_64/libpthread.abilist
@@ -5,7 +5,6 @@ GLIBC_2.38 __errno_location F
 GLIBC_2.38 __h_errno_location F
 GLIBC_2.38 __mutex_lock_solid F
 GLIBC_2.38 __mutex_unlock_solid F
-GLIBC_2.38 __pthread_get_cleanup_stack F
 GLIBC_2.38 __pthread_kill F
 GLIBC_2.38 __pthread_mutex_transfer_np F
 GLIBC_2.38 __pthread_spin_destroy F
-- 
2.47.2


Reply via email to