Wrap strerror_r().
Create the buferror() function, which wraps strerror_r(). This is necessary because glibc provides a non-standard strerror_r().
This commit is contained in:
parent
28177d466f
commit
a09f55c87d
@ -101,8 +101,8 @@ extern void (*JEMALLOC_P(malloc_message))(void *wcbopaque, const char *s);
|
|||||||
# define JEMALLOC_INLINE static inline
|
# define JEMALLOC_INLINE static inline
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Size of stack-allocated buffer passed to strerror_r(). */
|
/* Size of stack-allocated buffer passed to buferror(). */
|
||||||
#define STRERROR_BUF 64
|
#define BUFERROR_BUF 64
|
||||||
|
|
||||||
/* Minimum alignment of allocations is 2^LG_QUANTUM bytes. */
|
/* Minimum alignment of allocations is 2^LG_QUANTUM bytes. */
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
@ -289,6 +289,7 @@ extern unsigned narenas;
|
|||||||
|
|
||||||
arena_t *arenas_extend(unsigned ind);
|
arena_t *arenas_extend(unsigned ind);
|
||||||
arena_t *choose_arena_hard(void);
|
arena_t *choose_arena_hard(void);
|
||||||
|
int buferror(int errnum, char *buf, size_t buflen);
|
||||||
void jemalloc_prefork(void);
|
void jemalloc_prefork(void);
|
||||||
void jemalloc_postfork(void);
|
void jemalloc_postfork(void);
|
||||||
|
|
||||||
|
@ -28,7 +28,8 @@ static pthread_key_t mmap_unaligned_tsd;
|
|||||||
|
|
||||||
static void *pages_map(void *addr, size_t size, bool noreserve);
|
static void *pages_map(void *addr, size_t size, bool noreserve);
|
||||||
static void pages_unmap(void *addr, size_t size);
|
static void pages_unmap(void *addr, size_t size);
|
||||||
static void *chunk_alloc_mmap_slow(size_t size, bool unaligned, bool noreserve);
|
static void *chunk_alloc_mmap_slow(size_t size, bool unaligned,
|
||||||
|
bool noreserve);
|
||||||
static void *chunk_alloc_mmap_internal(size_t size, bool noreserve);
|
static void *chunk_alloc_mmap_internal(size_t size, bool noreserve);
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
@ -57,9 +58,9 @@ pages_map(void *addr, size_t size, bool noreserve)
|
|||||||
* We succeeded in mapping memory, but not in the right place.
|
* We succeeded in mapping memory, but not in the right place.
|
||||||
*/
|
*/
|
||||||
if (munmap(ret, size) == -1) {
|
if (munmap(ret, size) == -1) {
|
||||||
char buf[STRERROR_BUF];
|
char buf[BUFERROR_BUF];
|
||||||
|
|
||||||
strerror_r(errno, buf, sizeof(buf));
|
buferror(errno, buf, sizeof(buf));
|
||||||
malloc_write("<jemalloc>: Error in munmap(): ");
|
malloc_write("<jemalloc>: Error in munmap(): ");
|
||||||
malloc_write(buf);
|
malloc_write(buf);
|
||||||
malloc_write("\n");
|
malloc_write("\n");
|
||||||
@ -79,9 +80,9 @@ pages_unmap(void *addr, size_t size)
|
|||||||
{
|
{
|
||||||
|
|
||||||
if (munmap(addr, size) == -1) {
|
if (munmap(addr, size) == -1) {
|
||||||
char buf[STRERROR_BUF];
|
char buf[BUFERROR_BUF];
|
||||||
|
|
||||||
strerror_r(errno, buf, sizeof(buf));
|
buferror(errno, buf, sizeof(buf));
|
||||||
malloc_write("<jemalloc>: Error in munmap(): ");
|
malloc_write("<jemalloc>: Error in munmap(): ");
|
||||||
malloc_write(buf);
|
malloc_write(buf);
|
||||||
malloc_write("\n");
|
malloc_write("\n");
|
||||||
|
@ -294,9 +294,10 @@ chunk_swap_enable(const int *fds, unsigned nfds, bool prezeroed)
|
|||||||
void *addr = mmap((void *)((uintptr_t)vaddr + voff), sizes[i],
|
void *addr = mmap((void *)((uintptr_t)vaddr + voff), sizes[i],
|
||||||
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fds[i], 0);
|
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fds[i], 0);
|
||||||
if (addr == MAP_FAILED) {
|
if (addr == MAP_FAILED) {
|
||||||
char buf[STRERROR_BUF];
|
char buf[BUFERROR_BUF];
|
||||||
|
|
||||||
strerror_r(errno, buf, sizeof(buf));
|
|
||||||
|
buferror(errno, buf, sizeof(buf));
|
||||||
malloc_write(
|
malloc_write(
|
||||||
"<jemalloc>: Error in mmap(..., MAP_FIXED, ...): ");
|
"<jemalloc>: Error in mmap(..., MAP_FIXED, ...): ");
|
||||||
malloc_write(buf);
|
malloc_write(buf);
|
||||||
@ -304,7 +305,7 @@ chunk_swap_enable(const int *fds, unsigned nfds, bool prezeroed)
|
|||||||
if (opt_abort)
|
if (opt_abort)
|
||||||
abort();
|
abort();
|
||||||
if (munmap(vaddr, voff) == -1) {
|
if (munmap(vaddr, voff) == -1) {
|
||||||
strerror_r(errno, buf, sizeof(buf));
|
buferror(errno, buf, sizeof(buf));
|
||||||
malloc_write("<jemalloc>: Error in munmap(): ");
|
malloc_write("<jemalloc>: Error in munmap(): ");
|
||||||
malloc_write(buf);
|
malloc_write(buf);
|
||||||
malloc_write("\n");
|
malloc_write("\n");
|
||||||
|
@ -139,6 +139,25 @@ choose_arena_hard(void)
|
|||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* glibc provides a non-standard strerror_r() when _GNU_SOURCE is defined, so
|
||||||
|
* provide a wrapper.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
buferror(int errnum, char *buf, size_t buflen)
|
||||||
|
{
|
||||||
|
#ifdef _GNU_SOURCE
|
||||||
|
char *b = strerror_r(errno, buf, buflen);
|
||||||
|
if (b != buf) {
|
||||||
|
strncpy(buf, b, buflen);
|
||||||
|
buf[buflen-1] = '\0';
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
#else
|
||||||
|
return (strerror_r(errno, buf, buflen));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
stats_print_atexit(void)
|
stats_print_atexit(void)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user