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