mirror of
https://github.com/gperftools/gperftools
synced 2025-01-02 20:52:03 +00:00
e78238d94d
In most practical terms, this expands "official" heap leak checker support to Linux/arm64 and Linux/riscv (mips-en and legacy arm are likely to work & pass tests too now). The code is now explicitly Linux-only, without trying to pretend otherwise. Main goal of this change is to finally amputate linux_syscall_support.h, which we historically had trouble maintaining well. Biggest challenge was around thread listing facility which uses clone (ptrace explicitly fails between threads) and that causes difficulties around parent and child tasks sharing errno. linux_syscall_support stuff had special feature to "redirect" errno accesses. But it caused us for more trouble. We switched to regular syscalls, and errno stamping avoidance is now simply via careful programming. A number of other cleanups is made (such us thread finding codes in procfs which clearly was built for some ages old and odd kernels). sem_post/sem_wait synchronization was previously potentially prone to deadlock (if parent died at bad time). We now use pipe pair for this synchronization and it is fully robust.
300 lines
8.9 KiB
C
300 lines
8.9 KiB
C
/* Sometimes we accidentally #include this config.h instead of the one
|
|
in .. -- this is particularly true for msys/mingw, which uses the
|
|
unix config.h but also runs code in the windows directory.
|
|
*/
|
|
#ifdef __MINGW32__
|
|
#include "../config.h"
|
|
#define GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_
|
|
#endif
|
|
|
|
#ifndef GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_
|
|
#define GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_
|
|
/* used by tcmalloc.h */
|
|
#define GPERFTOOLS_CONFIG_H_
|
|
|
|
/* Enable aggressive decommit by default */
|
|
#cmakedefine ENABLE_AGGRESSIVE_DECOMMIT_BY_DEFAULT
|
|
|
|
/* Build new/delete operators for overaligned types */
|
|
#cmakedefine ENABLE_ALIGNED_NEW_DELETE
|
|
|
|
/* Build runtime detection for sized delete */
|
|
#cmakedefine ENABLE_DYNAMIC_SIZED_DELETE
|
|
|
|
/* Report large allocation */
|
|
#cmakedefine ENABLE_LARGE_ALLOC_REPORT
|
|
|
|
/* Build sized deletion operators */
|
|
#cmakedefine ENABLE_SIZED_DELETE
|
|
|
|
/* Define to 1 if you have the <asm/ptrace.h> header file. */
|
|
#cmakedefine HAVE_ASM_PTRACE_H
|
|
|
|
/* Define to 1 if you have the <cygwin/signal.h> header file. */
|
|
#cmakedefine HAVE_CYGWIN_SIGNAL_H
|
|
|
|
/* Define to 1 if you have the declaration of `backtrace', and to 0 if you
|
|
don't. */
|
|
#cmakedefine01 HAVE_DECL_BACKTRACE
|
|
|
|
/* Define to 1 if you have the declaration of `cfree', and to 0 if you don't.
|
|
*/
|
|
#cmakedefine01 HAVE_DECL_CFREE
|
|
|
|
/* Define to 1 if you have the declaration of `memalign', and to 0 if you
|
|
don't. */
|
|
#cmakedefine01 HAVE_DECL_MEMALIGN
|
|
|
|
/* Define to 1 if you have the declaration of `nanosleep', and to 0 if you
|
|
don't. */
|
|
#cmakedefine01 HAVE_DECL_NANOSLEEP
|
|
|
|
/* Define to 1 if you have the declaration of `posix_memalign', and to 0 if
|
|
you don't. */
|
|
#cmakedefine01 HAVE_DECL_POSIX_MEMALIGN
|
|
|
|
/* Define to 1 if you have the declaration of `pvalloc', and to 0 if you
|
|
don't. */
|
|
#cmakedefine01 HAVE_DECL_PVALLOC
|
|
|
|
/* Define to 1 if you have the declaration of `sleep', and to 0 if you don't.
|
|
*/
|
|
#cmakedefine01 HAVE_DECL_SLEEP
|
|
|
|
/* Define to 1 if you have the declaration of `valloc', and to 0 if you don't.
|
|
*/
|
|
#cmakedefine01 HAVE_DECL_VALLOC
|
|
|
|
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
#cmakedefine HAVE_DLFCN_H
|
|
|
|
/* Define to 1 if the system has the type `Elf32_Versym'. */
|
|
#cmakedefine HAVE_ELF32_VERSYM
|
|
|
|
/* Define to 1 if you have the <execinfo.h> header file. */
|
|
#cmakedefine HAVE_EXECINFO_H
|
|
|
|
/* Define to 1 if you have the <fcntl.h> header file. */
|
|
#cmakedefine HAVE_FCNTL_H
|
|
|
|
/* Define to 1 if you have the <features.h> header file. */
|
|
#cmakedefine HAVE_FEATURES_H
|
|
|
|
/* Define to 1 if you have the `fork' function. */
|
|
#cmakedefine HAVE_FORK
|
|
|
|
/* Define to 1 if you have the `geteuid' function. */
|
|
#cmakedefine HAVE_GETEUID
|
|
|
|
/* Define to 1 if you have the <glob.h> header file. */
|
|
#cmakedefine HAVE_GLOB_H
|
|
|
|
/* Define to 1 if you have the <grp.h> header file. */
|
|
#cmakedefine HAVE_GRP_H
|
|
|
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
#cmakedefine HAVE_INTTYPES_H
|
|
|
|
/* Define to 1 if you have the <libunwind.h> header file. */
|
|
#cmakedefine HAVE_LIBUNWIND_H
|
|
|
|
#cmakedefine USE_LIBUNWIND
|
|
|
|
/* Define if this is Linux that has SIGEV_THREAD_ID */
|
|
#cmakedefine01 HAVE_LINUX_SIGEV_THREAD_ID
|
|
|
|
/* Define to 1 if you have the <malloc.h> header file. */
|
|
#cmakedefine HAVE_MALLOC_H
|
|
|
|
/* Define to 1 if you have the <malloc/malloc.h> header file. */
|
|
#cmakedefine HAVE_MALLOC_MALLOC_H
|
|
|
|
/* Define to 1 if you have the <memory.h> header file. */
|
|
#cmakedefine HAVE_MEMORY_H
|
|
|
|
/* Define to 1 if you have a working `mmap' system call. */
|
|
#cmakedefine HAVE_MMAP
|
|
|
|
/* Define to 1 if you have the <poll.h> header file. */
|
|
#cmakedefine HAVE_POLL_H
|
|
|
|
/* define if libc has program_invocation_name */
|
|
#cmakedefine HAVE_PROGRAM_INVOCATION_NAME
|
|
|
|
/* Define if you have POSIX threads libraries and header files. */
|
|
#cmakedefine HAVE_PTHREAD
|
|
|
|
/* defined to 1 if pthread symbols are exposed even without include pthread.h
|
|
*/
|
|
#cmakedefine HAVE_PTHREAD_DESPITE_ASKING_FOR
|
|
|
|
/* Define to 1 if you have the <pwd.h> header file. */
|
|
#cmakedefine HAVE_PWD_H
|
|
|
|
/* Define to 1 if you have the `sbrk' function. */
|
|
#cmakedefine HAVE_SBRK
|
|
|
|
/* Define to 1 if you have the <sched.h> header file. */
|
|
#cmakedefine HAVE_SCHED_H
|
|
|
|
/* Define to 1 if you have the <stdint.h> header file. */
|
|
#cmakedefine HAVE_STDINT_H
|
|
|
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
#cmakedefine HAVE_STDLIB_H 1
|
|
|
|
/* Define to 1 if you have the <strings.h> header file. */
|
|
#cmakedefine HAVE_STRINGS_H
|
|
|
|
/* Define to 1 if you have the <string.h> header file. */
|
|
#cmakedefine HAVE_STRING_H
|
|
|
|
/* Define to 1 if the system has the type `struct mallinfo'. */
|
|
#cmakedefine HAVE_STRUCT_MALLINFO
|
|
|
|
/* Define to 1 if you have the <sys/cdefs.h> header file. */
|
|
#cmakedefine HAVE_SYS_CDEFS_H
|
|
|
|
/* Define to 1 if you have the <sys/malloc.h> header file. */
|
|
#cmakedefine HAVE_SYS_MALLOC_H
|
|
|
|
/* Define to 1 if you have the <sys/resource.h> header file. */
|
|
#cmakedefine HAVE_SYS_RESOURCE_H
|
|
|
|
/* Define to 1 if you have the <sys/socket.h> header file. */
|
|
#cmakedefine HAVE_SYS_SOCKET_H
|
|
|
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
#cmakedefine HAVE_SYS_STAT_H
|
|
|
|
/* Define to 1 if you have the <sys/syscall.h> header file. */
|
|
#cmakedefine HAVE_SYS_SYSCALL_H
|
|
|
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
#cmakedefine HAVE_SYS_TYPES_H
|
|
|
|
/* Define to 1 if you have the <sys/ucontext.h> header file. */
|
|
#cmakedefine HAVE_SYS_UCONTEXT_H
|
|
|
|
/* Define to 1 if you have the <sys/wait.h> header file. */
|
|
#cmakedefine HAVE_SYS_WAIT_H
|
|
|
|
/* Define to 1 if compiler supports __thread */
|
|
#cmakedefine HAVE_TLS
|
|
|
|
/* Define to 1 if you have the <ucontext.h> header file. */
|
|
#cmakedefine HAVE_UCONTEXT_H
|
|
|
|
/* Define to 1 if you have the <unistd.h> header file. */
|
|
#cmakedefine HAVE_UNISTD_H
|
|
|
|
/* Whether <unwind.h> contains _Unwind_Backtrace */
|
|
#cmakedefine HAVE_UNWIND_BACKTRACE
|
|
|
|
/* Define to 1 if you have the <unwind.h> header file. */
|
|
#cmakedefine HAVE_UNWIND_H
|
|
|
|
/* define if your compiler has __attribute__ */
|
|
#cmakedefine HAVE___ATTRIBUTE__
|
|
|
|
/* define if your compiler supports alignment of functions */
|
|
#cmakedefine HAVE___ATTRIBUTE__ALIGNED_FN
|
|
|
|
/* Define to 1 if compiler supports __environ */
|
|
#cmakedefine HAVE___ENVIRON
|
|
|
|
/* Define to 1 if you have the `__sbrk' function. */
|
|
#cmakedefine HAVE___SBRK
|
|
|
|
/* prefix where we look for installed files */
|
|
#cmakedefine INSTALL_PREFIX
|
|
|
|
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
|
#cmakedefine LT_OBJDIR
|
|
|
|
/* Name of package */
|
|
#define PACKAGE "@PROJECT_NAME@"
|
|
|
|
/* Define to the address where bug reports for this package should be sent. */
|
|
#define PACKAGE_BUGREPORT "gperftools@googlegroups.com"
|
|
|
|
/* Define to the full name of this package. */
|
|
#define PACKAGE_NAME "@PROJECT_NAME@"
|
|
|
|
/* Define to the full name and version of this package. */
|
|
#define PACKAGE_STRING "@PROJECT_NAME@ @PROJECT_VERSION@"
|
|
|
|
/* Define to the one symbol short name of this package. */
|
|
#define PACKAGE_TARNAME "@PROJECT_NAME@"
|
|
|
|
/* Define to the home page for this package. */
|
|
#cmakedefine PACKAGE_URL
|
|
|
|
/* Define to the version of this package. */
|
|
#define PACKAGE_VERSION "@PROJECT_VERSION@"
|
|
|
|
/* How to access the PC from a struct ucontext */
|
|
#define PC_FROM_UCONTEXT @PC_FROM_UCONTEXT_DEF@
|
|
|
|
/* Always the empty-string on non-windows systems. On windows, should be
|
|
"__declspec(dllexport)". This way, when we compile the dll, we export our
|
|
functions/classes. It's safe to define this here because config.h is only
|
|
used internally, to compile the DLL, and every DLL source file #includes
|
|
"config.h" before anything else. */
|
|
#ifndef WIN32
|
|
#cmakedefine WIN32
|
|
#endif
|
|
#if defined(WIN32)
|
|
#ifndef PERFTOOLS_DLL_DECL
|
|
# define PERFTOOLS_IS_A_DLL 1
|
|
# define PERFTOOLS_DLL_DECL __declspec(dllexport)
|
|
# define PERFTOOLS_DLL_DECL_FOR_UNITTESTS __declspec(dllimport)
|
|
#endif
|
|
#else
|
|
#ifndef PERFTOOLS_DLL_DECL
|
|
# define PERFTOOLS_DLL_DECL
|
|
# define PERFTOOLS_DLL_DECL_FOR_UNITTESTS
|
|
#endif
|
|
#endif
|
|
|
|
/* Mark the systems where we know it's bad if pthreads runs too
|
|
early before main (before threads are initialized, presumably). */
|
|
#ifdef __FreeBSD__
|
|
#define PTHREADS_CRASHES_IF_RUN_TOO_EARLY 1
|
|
#endif
|
|
|
|
/* Define 8 bytes of allocation alignment for tcmalloc */
|
|
#cmakedefine TCMALLOC_ALIGN_8BYTES
|
|
|
|
/* Define internal page size for tcmalloc as number of left bitshift */
|
|
#cmakedefine TCMALLOC_PAGE_SIZE_SHIFT
|
|
|
|
/* Version number of package */
|
|
#define VERSION @PROJECT_VERSION@
|
|
|
|
/* C99 says: define this to get the PRI... macros from stdint.h */
|
|
#ifndef __STDC_FORMAT_MACROS
|
|
# define __STDC_FORMAT_MACROS 1
|
|
#endif
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Extra stuff not found in config.h.in
|
|
#if defined(WIN32)
|
|
|
|
// This must be defined before the windows.h is included. We need at
|
|
// least 0x0400 for mutex.h to have access to TryLock, and at least
|
|
// 0x0501 for patch_functions.cc to have access to GetModuleHandleEx.
|
|
// (This latter is an optimization we could take out if need be.)
|
|
#ifndef _WIN32_WINNT
|
|
# define _WIN32_WINNT 0x0501
|
|
#endif
|
|
|
|
// We want to make sure not to ever try to #include heap-checker.h
|
|
#define NO_HEAP_CHECK 1
|
|
|
|
// TODO(csilvers): include windows/port.h in every relevant source file instead?
|
|
#include "windows/port.h"
|
|
|
|
#endif
|
|
#endif /* GOOGLE_PERFTOOLS_WINDOWS_CONFIG_H_ */
|