#ifndef JEMALLOC_INTERNAL_DECLS_H #define JEMALLOC_INTERNAL_DECLS_H #include #ifdef _WIN32 # include # include "msvc_compat/windows_extra.h" # include "msvc_compat/strings.h" # ifdef _WIN64 # if LG_VADDR <= 32 # error Generate the headers using x64 vcargs # endif # else # if LG_VADDR > 32 # undef LG_VADDR # define LG_VADDR 32 # endif # endif #else # include # include # if !defined(__pnacl__) && !defined(__native_client__) # include # if !defined(SYS_write) && defined(__NR_write) # define SYS_write __NR_write # endif # if defined(SYS_open) && defined(__aarch64__) /* Android headers may define SYS_open to __NR_open even though * __NR_open may not exist on AArch64 (superseded by __NR_openat). */ # undef SYS_open # endif # include # endif # include # if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) # include # include # if defined(__FreeBSD__) # define cpu_set_t cpuset_t # endif # endif # include # ifdef JEMALLOC_OS_UNFAIR_LOCK # include # endif # ifdef JEMALLOC_GLIBC_MALLOC_HOOK # include # endif # include # include # include # ifdef JEMALLOC_HAVE_MACH_ABSOLUTE_TIME # include # endif #endif #include #include #ifndef SIZE_T_MAX # define SIZE_T_MAX SIZE_MAX #endif #ifndef SSIZE_MAX # define SSIZE_MAX ((ssize_t)(SIZE_T_MAX >> 1)) #endif #include #include #include #include #include #include #ifndef offsetof # define offsetof(type, member) ((size_t)&(((type *)NULL)->member)) #endif #include #include #include #ifdef _MSC_VER # include typedef intptr_t ssize_t; # define PATH_MAX 1024 # define STDERR_FILENO 2 # define __func__ __FUNCTION__ # ifdef JEMALLOC_HAS_RESTRICT # define restrict __restrict # endif /* Disable warnings about deprecated system functions. */ # pragma warning(disable: 4996) #if _MSC_VER < 1800 static int isblank(int c) { return (c == '\t' || c == ' '); } #endif #else # include #endif #include /* * The Win32 midl compiler has #define small char; we don't use midl, but * "small" is a nice identifier to have available when talking about size * classes. */ #ifdef small # undef small #endif /* * Oftentimes we'd like to perform some kind of arithmetic to obtain * a pointer from another pointer but with some offset or mask applied. * Naively you would accomplish this by casting the source pointer to * `uintptr_t`, performing all of the relevant arithmetic, and then casting * the result to the desired pointer type. However, this has the unfortunate * side-effect of concealing pointer provenance, hiding useful information for * optimization from the compiler (see here for details: * https://clang.llvm.org/extra/clang-tidy/checks/performance/no-int-to-ptr.html * ) * Instead what one should do is cast the source pointer to `char *` and perform * the equivalent arithmetic (since `char` of course represents one byte). But * because `char *` has the semantic meaning of "string", we define this typedef * simply to make it clearer where we are performing such pointer arithmetic. */ typedef char byte_t; #endif /* JEMALLOC_INTERNAL_H */