|
|
|
|
|
|
#ifndef MEMORY_H |
#define MEMORY_H |
|
#include "global.h" |
#include "stralloc.h" |
|
#ifdef USE_VALGRIND |
|
#define HAVE_VALGRIND_MACROS |
|
* need. Haven't checked if it's true or not. */ |
|
#ifdef HAVE_MEMCHECK_H |
#include <memcheck.h> |
#elif defined(HAVE_VALGRIND_MEMCHECK_H) |
#include <valgrind/memcheck.h> |
#elif defined(HAVE_VALGRIND_H) |
#include <valgrind.h> |
#else |
#undef HAVE_VALGRIND_MACROS |
#endif |
|
#endif /* USE_VALGRIND */ |
|
#ifdef HAVE_VALGRIND_MACROS |
|
#ifndef VALGRIND_MAKE_MEM_NOACCESS |
#define VALGRIND_MAKE_MEM_NOACCESS VALGRIND_MAKE_NOACCESS |
#define VALGRIND_MAKE_MEM_UNDEFINED VALGRIND_MAKE_WRITABLE |
#define VALGRIND_MAKE_MEM_DEFINED VALGRIND_MAKE_READABLE |
#endif |
|
|
#define PIKE_MEM_NA(lvalue) do { \ |
PIKE_MEM_NA_RANGE(&(lvalue), sizeof (lvalue)); \ |
} while (0) |
#define PIKE_MEM_NA_RANGE(addr, bytes) do { \ |
VALGRIND_DISCARD(VALGRIND_MAKE_MEM_NOACCESS(addr, bytes)); \ |
} while (0) |
|
|
#define PIKE_MEM_WO(lvalue) do { \ |
PIKE_MEM_WO_RANGE(&(lvalue), sizeof (lvalue)); \ |
} while (0) |
#define PIKE_MEM_WO_RANGE(addr, bytes) do { \ |
VALGRIND_DISCARD(VALGRIND_MAKE_MEM_UNDEFINED(addr, bytes)); \ |
} while (0) |
|
|
#define PIKE_MEM_RW(lvalue) do { \ |
PIKE_MEM_RW_RANGE(&(lvalue), sizeof (lvalue)); \ |
} while (0) |
#define PIKE_MEM_RW_RANGE(addr, bytes) do { \ |
VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(addr, bytes)); \ |
} while (0) |
|
|
#define PIKE_MEM_RO(lvalue) do { \ |
PIKE_MEM_RO_RANGE(&(lvalue), sizeof (lvalue)); \ |
} while (0) |
#define PIKE_MEM_RO_RANGE(addr, bytes) do { \ |
VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(addr, bytes)); \ |
} while (0) |
|
|
#define PIKE_MEM_CHECKER() RUNNING_ON_VALGRIND |
|
|
|
#define PIKE_MEM_NOT_ADDR(lvalue) \ |
PIKE_MEM_NOT_ADDR_RANGE(&(lvalue), sizeof (lvalue)) |
#define PIKE_MEM_NOT_ADDR_RANGE(addr, bytes) \ |
VALGRIND_CHECK_MEM_IS_ADDRESSABLE(addr, bytes) |
|
|
|
#define PIKE_MEM_NOT_DEF(lvalue) \ |
PIKE_MEM_NOT_DEF_RANGE(&(lvalue), sizeof (lvalue)) |
#define PIKE_MEM_NOT_DEF_RANGE(addr, bytes) \ |
VALGRIND_CHECK_MEM_IS_DEFINED(addr, bytes) |
|
#else /* !HAVE_VALGRIND_MACROS */ |
|
#define PIKE_MEM_NA(lvalue) do {} while (0) |
#define PIKE_MEM_NA_RANGE(addr, bytes) do {} while (0) |
#define PIKE_MEM_WO(lvalue) do {} while (0) |
#define PIKE_MEM_WO_RANGE(addr, bytes) do {} while (0) |
#define PIKE_MEM_RW(lvalue) do {} while (0) |
#define PIKE_MEM_RW_RANGE(addr, bytes) do {} while (0) |
#define PIKE_MEM_RO(lvalue) do {} while (0) |
#define PIKE_MEM_RO_RANGE(addr, bytes) do {} while (0) |
#define PIKE_MEM_CHECKER() 0 |
#define PIKE_MEM_NOT_ADDR(lvalue) 0 |
#define PIKE_MEM_NOT_ADDR_RANGE(addr, bytes) 0 |
#define PIKE_MEM_NOT_DEF(lvalue) 0 |
#define PIKE_MEM_NOT_DEF_RANGE(addr, bytes) 0 |
|
#endif /* !HAVE_VALGRIND_MACROS */ |
|
|
#define MEMSEARCH_LINKS 512 |
|
struct link |
{ |
struct link *next; |
INT32 key; |
ptrdiff_t offset; |
}; |
|
enum methods { |
no_search, |
use_memchr, |
memchr_and_memcmp, |
hubbe_search, |
boyer_moore |
}; |
|
struct mem_searcher |
{ |
enum methods method; |
char *needle; |
size_t needlelen; |
size_t hsize, max; |
struct link links[MEMSEARCH_LINKS]; |
struct link *set[MEMSEARCH_LINKS]; |
}; |
|
|
#include "pike_search.h" |
|
#include "block_alloc_h.h" |
extern int page_size; |
|
|
PMOD_EXPORT ptrdiff_t pcharp_memcmp(PCHARP a, PCHARP b, int sz) ATTRIBUTE((pure)); |
PMOD_EXPORT long pcharp_strlen(PCHARP a) ATTRIBUTE((pure)); |
|
#define MEMCHR0 MEMCHR |
p_wchar1 *MEMCHR1(p_wchar1 *p, p_wchar2 c, ptrdiff_t e) ATTRIBUTE((pure)); |
p_wchar2 *MEMCHR2(p_wchar2 *p, p_wchar2 c, ptrdiff_t e) ATTRIBUTE((pure)); |
|
|
PMOD_EXPORT void reverse(char *memory, size_t nitems, size_t size); |
PMOD_EXPORT void reorder(char *memory, INT32 nitems, INT32 size,INT32 *order); |
|
#if (defined(__i386__) || defined(__amd64__)) && defined(__GNUC__) |
#ifdef __i386__ |
__attribute__((fastcall)) |
#endif |
size_t (*hashmem)(const void *, size_t, size_t); |
#else |
PMOD_EXPORT size_t hashmem(const void *, size_t len, size_t mlen) ATTRIBUTE((pure)); |
#endif |
|
PMOD_EXPORT void memfill(char *to, |
INT32 tolen, |
char *from, |
INT32 fromlen, |
INT32 offset); |
*/ |
#define MALLOC_FUNCTION ATTRIBUTE((malloc)) ATTRIBUTE((warn_unused_result)) |
|
PMOD_EXPORT void *debug_xalloc(size_t size) MALLOC_FUNCTION; |
PMOD_EXPORT void *debug_xmalloc(size_t s) MALLOC_FUNCTION; |
PMOD_EXPORT void debug_xfree(void *mem); |
PMOD_EXPORT void *debug_xrealloc(void *m, size_t s) MALLOC_FUNCTION; |
PMOD_EXPORT void *debug_xcalloc(size_t n, size_t s) MALLOC_FUNCTION; |
|
PMOD_EXPORT void *mexec_alloc(size_t sz) MALLOC_FUNCTION; |
PMOD_EXPORT void *mexec_realloc(void *ptr, size_t sz) MALLOC_FUNCTION; |
PMOD_EXPORT void mexec_free(void *ptr); |
void init_pike_memory (void); |
void exit_pike_memory (void); |
|
#undef BLOCK_ALLOC |
|
#ifdef HANDLES_UNALIGNED_MEMORY_ACCESS |
#define DO_IF_ELSE_UNALIGNED_MEMORY_ACCESS(IF, ELSE) IF |
#else /* !HANDLES_UNALIGNED_MEMORY_ACCESS */ |
#define DO_IF_ELSE_UNALIGNED_MEMORY_ACCESS(IF, ELSE) ELSE |
#endif /* HANDLES_UNALIGNED_MEMORY_ACCESS */ |
|
|
|
#if defined(MEXEC_USES_MMAP) || defined (_WIN32) |
#define USE_MY_MEXEC_ALLOC |
#endif |
|
#endif |
|
|