Modify configure to determine return value of strerror_r.
On glibc and Android's bionic, strerror_r returns char* when _GNU_SOURCE is defined. Add a configure check for this rather than assume glibc is the only libc that behaves this way.
This commit is contained in:
parent
ba5992fe9a
commit
f78d4ca3fb
19
configure.ac
19
configure.ac
@ -2072,6 +2072,25 @@ if test "x${je_cv_pthread_mutex_adaptive_np}" = "xyes" ; then
|
|||||||
AC_DEFINE([JEMALLOC_HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], [ ])
|
AC_DEFINE([JEMALLOC_HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], [ ])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
JE_CFLAGS_SAVE()
|
||||||
|
JE_CFLAGS_ADD([-D_GNU_SOURCE])
|
||||||
|
JE_CFLAGS_ADD([-Werror])
|
||||||
|
JE_CFLAGS_ADD([-herror_on_warning])
|
||||||
|
JE_COMPILABLE([strerror_r returns char with gnu source], [
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
], [
|
||||||
|
char *buffer = (char *) malloc(100);
|
||||||
|
char *error = strerror_r(EINVAL, buffer, 100);
|
||||||
|
printf("%s\n", error);
|
||||||
|
], [je_cv_strerror_r_returns_char_with_gnu_source])
|
||||||
|
JE_CFLAGS_RESTORE()
|
||||||
|
if test "x${je_cv_strerror_r_returns_char_with_gnu_source}" = "xyes" ; then
|
||||||
|
AC_DEFINE([JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE], [ ])
|
||||||
|
fi
|
||||||
|
|
||||||
dnl ============================================================================
|
dnl ============================================================================
|
||||||
dnl Check for typedefs, structures, and compiler characteristics.
|
dnl Check for typedefs, structures, and compiler characteristics.
|
||||||
AC_HEADER_STDBOOL
|
AC_HEADER_STDBOOL
|
||||||
|
@ -358,4 +358,9 @@
|
|||||||
/* If defined, jemalloc takes the malloc/free/etc. symbol names. */
|
/* If defined, jemalloc takes the malloc/free/etc. symbol names. */
|
||||||
#undef JEMALLOC_IS_MALLOC
|
#undef JEMALLOC_IS_MALLOC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if strerror_r returns char * if _GNU_SOURCE is defined.
|
||||||
|
*/
|
||||||
|
#undef JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */
|
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */
|
||||||
|
@ -111,7 +111,7 @@ buferror(int err, char *buf, size_t buflen) {
|
|||||||
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0,
|
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0,
|
||||||
(LPSTR)buf, (DWORD)buflen, NULL);
|
(LPSTR)buf, (DWORD)buflen, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
#elif defined(__GLIBC__) && defined(_GNU_SOURCE)
|
#elif defined(JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE) && defined(_GNU_SOURCE)
|
||||||
char *b = strerror_r(err, buf, buflen);
|
char *b = strerror_r(err, buf, buflen);
|
||||||
if (b != buf) {
|
if (b != buf) {
|
||||||
strncpy(buf, b, buflen);
|
strncpy(buf, b, buflen);
|
||||||
|
Loading…
Reference in New Issue
Block a user