83 lines
2.1 KiB
C
83 lines
2.1 KiB
C
|
/*-------------------------------------------------------------------------
|
||
|
*
|
||
|
* memdebug.h
|
||
|
* Memory debugging support.
|
||
|
*
|
||
|
* Currently, this file either wraps <valgrind/memcheck.h> or substitutes
|
||
|
* empty definitions for Valgrind client request macros we use.
|
||
|
*
|
||
|
*
|
||
|
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
||
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||
|
*
|
||
|
* src/include/utils/memdebug.h
|
||
|
*
|
||
|
*-------------------------------------------------------------------------
|
||
|
*/
|
||
|
#ifndef MEMDEBUG_H
|
||
|
#define MEMDEBUG_H
|
||
|
|
||
|
#ifdef USE_VALGRIND
|
||
|
#include <valgrind/memcheck.h>
|
||
|
#else
|
||
|
#define VALGRIND_CHECK_MEM_IS_DEFINED(addr, size) do {} while (0)
|
||
|
#define VALGRIND_CREATE_MEMPOOL(context, redzones, zeroed) do {} while (0)
|
||
|
#define VALGRIND_DESTROY_MEMPOOL(context) do {} while (0)
|
||
|
#define VALGRIND_MAKE_MEM_DEFINED(addr, size) do {} while (0)
|
||
|
#define VALGRIND_MAKE_MEM_NOACCESS(addr, size) do {} while (0)
|
||
|
#define VALGRIND_MAKE_MEM_UNDEFINED(addr, size) do {} while (0)
|
||
|
#define VALGRIND_MEMPOOL_ALLOC(context, addr, size) do {} while (0)
|
||
|
#define VALGRIND_MEMPOOL_FREE(context, addr) do {} while (0)
|
||
|
#define VALGRIND_MEMPOOL_CHANGE(context, optr, nptr, size) do {} while (0)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef CLOBBER_FREED_MEMORY
|
||
|
|
||
|
/* Wipe freed memory for debugging purposes */
|
||
|
static inline void
|
||
|
wipe_mem(void *ptr, size_t size)
|
||
|
{
|
||
|
VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);
|
||
|
memset(ptr, 0x7F, size);
|
||
|
VALGRIND_MAKE_MEM_NOACCESS(ptr, size);
|
||
|
}
|
||
|
|
||
|
#endif /* CLOBBER_FREED_MEMORY */
|
||
|
|
||
|
#ifdef MEMORY_CONTEXT_CHECKING
|
||
|
|
||
|
static inline void
|
||
|
set_sentinel(void *base, Size offset)
|
||
|
{
|
||
|
char *ptr = (char *) base + offset;
|
||
|
|
||
|
VALGRIND_MAKE_MEM_UNDEFINED(ptr, 1);
|
||
|
*ptr = 0x7E;
|
||
|
VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
|
||
|
}
|
||
|
|
||
|
static inline bool
|
||
|
sentinel_ok(const void *base, Size offset)
|
||
|
{
|
||
|
const char *ptr = (const char *) base + offset;
|
||
|
bool ret;
|
||
|
|
||
|
VALGRIND_MAKE_MEM_DEFINED(ptr, 1);
|
||
|
ret = *ptr == 0x7E;
|
||
|
VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#endif /* MEMORY_CONTEXT_CHECKING */
|
||
|
|
||
|
#ifdef RANDOMIZE_ALLOCATED_MEMORY
|
||
|
|
||
|
void randomize_mem(char *ptr, size_t size);
|
||
|
|
||
|
#endif /* RANDOMIZE_ALLOCATED_MEMORY */
|
||
|
|
||
|
|
||
|
#endif /* MEMDEBUG_H */
|