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:
Jason Evans 2010-09-20 16:05:41 -07:00
parent 28177d466f
commit a09f55c87d
4 changed files with 32 additions and 10 deletions

View File

@ -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);

View File

@ -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");

View File

@ -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");

View File

@ -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)
{ {