@@ -650,8 +650,13 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
650650#endif  /* HDflock */ 
651651
652652#if  defined(H5_HAVE_WIN32_API ) ||  defined(H5_HAVE_DARWIN ) ||  (defined(__FreeBSD__ ) &&  __FreeBSD__  <  14 )
653- H5_DLL  void  HDqsort_context (void  * base , size_t  nel , size_t  size ,
654-                             int  (* compar )(const  void  * , const  void  * , void  * ), void  * arg );
653+ H5_DLL  herr_t  HDqsort_context (void  * base , size_t  nel , size_t  size ,
654+                               int  (* compar )(const  void  * , const  void  * , void  * ), void  * arg );
655+ #endif 
656+ 
657+ #ifndef  H5_HAVE_QSORT_REENTRANT 
658+ H5_DLL  herr_t  HDqsort_fallback (void  * base , size_t  nel , size_t  size ,
659+                                int  (* compar )(const  void  * , const  void  * , void  * ), void  * arg );
655660#endif 
656661
657662#ifndef  HDfseek 
@@ -770,10 +775,17 @@ H5_DLL void HDqsort_context(void *base, size_t nel, size_t size,
770775#define  HDunsetenv (S ) unsetenv(S)
771776#endif 
772777#ifndef  HDqsort_r 
773- #ifdef  H5_HAVE_DARWIN 
778+ #ifdef  H5_HAVE_QSORT_REENTRANT 
779+ #if  defined(H5_HAVE_DARWIN ) ||  (defined(__FreeBSD__ ) &&  __FreeBSD__  <  14 )
780+ /* Darwin and FreeBSD < 14 use BSD-style qsort_r with different signature/argument order */ 
774781#define  HDqsort_r (B , N , S , C , A ) HDqsort_context(B, N, S, C, A)
775782#else 
776- #define  HDqsort_r (B , N , S , C , A ) qsort_r(B, N, S, C, A)
783+ /* Wrap native GNU qsort_r to vacuously return success */ 
784+ #define  HDqsort_r (B , N , S , C , A ) (qsort_r(B, N, S, C, A), SUCCEED)
785+ #endif 
786+ #else 
787+ /* No native qsort_r/qsort_s available - use fallback implementation */ 
788+ #define  HDqsort_r (B , N , S , C , A ) HDqsort_fallback(B, N, S, C, A)
777789#endif 
778790#endif 
779791#ifndef  HDvasprintf 
0 commit comments