Home | History | Annotate | Line # | Download | only in internal
      1 #ifndef JEMALLOC_INTERNAL_MALLOC_IO_H
      2 #define JEMALLOC_INTERNAL_MALLOC_IO_H
      3 
      4 #ifdef _WIN32
      5 #  ifdef _WIN64
      6 #    define FMT64_PREFIX "ll"
      7 #    define FMTPTR_PREFIX "ll"
      8 #  else
      9 #    define FMT64_PREFIX "ll"
     10 #    define FMTPTR_PREFIX ""
     11 #  endif
     12 #  define FMTd32 "d"
     13 #  define FMTu32 "u"
     14 #  define FMTx32 "x"
     15 #  define FMTd64 FMT64_PREFIX "d"
     16 #  define FMTu64 FMT64_PREFIX "u"
     17 #  define FMTx64 FMT64_PREFIX "x"
     18 #  define FMTdPTR FMTPTR_PREFIX "d"
     19 #  define FMTuPTR FMTPTR_PREFIX "u"
     20 #  define FMTxPTR FMTPTR_PREFIX "x"
     21 #else
     22 #  include <inttypes.h>
     23 #  define FMTd32 PRId32
     24 #  define FMTu32 PRIu32
     25 #  define FMTx32 PRIx32
     26 #  define FMTd64 PRId64
     27 #  define FMTu64 PRIu64
     28 #  define FMTx64 PRIx64
     29 #  define FMTdPTR PRIdPTR
     30 #  define FMTuPTR PRIuPTR
     31 #  define FMTxPTR PRIxPTR
     32 #endif
     33 
     34 /* Size of stack-allocated buffer passed to buferror(). */
     35 #define BUFERROR_BUF		64
     36 
     37 /*
     38  * Size of stack-allocated buffer used by malloc_{,v,vc}printf().  This must be
     39  * large enough for all possible uses within jemalloc.
     40  */
     41 #define MALLOC_PRINTF_BUFSIZE	4096
     42 
     43 int buferror(int err, char *buf, size_t buflen);
     44 uintmax_t malloc_strtoumax(const char *restrict nptr, const char **restrict endptr,
     45     int base);
     46 void malloc_write(const char *s);
     47 
     48 /*
     49  * malloc_vsnprintf() supports a subset of snprintf(3) that avoids floating
     50  * point math.
     51  */
     52 size_t malloc_vsnprintf(char *str, size_t size, const char *format,
     53     va_list ap);
     54 size_t malloc_snprintf(char *str, size_t size, const char *format, ...)
     55     JEMALLOC_FORMAT_PRINTF(3, 4);
     56 /*
     57  * The caller can set write_cb and cbopaque to null to choose to print with the
     58  * je_malloc_message hook.
     59  */
     60 void malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque,
     61     const char *format, va_list ap);
     62 void malloc_cprintf(void (*write_cb)(void *, const char *), void *cbopaque,
     63     const char *format, ...) JEMALLOC_FORMAT_PRINTF(3, 4);
     64 void malloc_printf(const char *format, ...) JEMALLOC_FORMAT_PRINTF(1, 2);
     65 
     66 static inline ssize_t
     67 malloc_write_fd(int fd, const void *buf, size_t count) {
     68 #if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_write)
     69 	/*
     70 	 * Use syscall(2) rather than write(2) when possible in order to avoid
     71 	 * the possibility of memory allocation within libc.  This is necessary
     72 	 * on FreeBSD; most operating systems do not have this problem though.
     73 	 *
     74 	 * syscall() returns long or int, depending on platform, so capture the
     75 	 * result in the widest plausible type to avoid compiler warnings.
     76 	 */
     77 	long result = syscall(SYS_write, fd, buf, count);
     78 #else
     79 	ssize_t result = (ssize_t)write(fd, buf,
     80 #ifdef _WIN32
     81 	    (unsigned int)
     82 #endif
     83 	    count);
     84 #endif
     85 	return (ssize_t)result;
     86 }
     87 
     88 static inline ssize_t
     89 malloc_read_fd(int fd, void *buf, size_t count) {
     90 #if defined(JEMALLOC_USE_SYSCALL) && defined(SYS_read)
     91 	long result = syscall(SYS_read, fd, buf, count);
     92 #else
     93 	ssize_t result = read(fd, buf,
     94 #ifdef _WIN32
     95 	    (unsigned int)
     96 #endif
     97 	    count);
     98 #endif
     99 	return (ssize_t)result;
    100 }
    101 
    102 #endif /* JEMALLOC_INTERNAL_MALLOC_IO_H */
    103