File: dbgmal.h

package info (click to toggle)
virtuoso-opensource 7.2.5.1%2Bdfsg1-0.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 285,240 kB
  • sloc: ansic: 641,220; sql: 490,413; xml: 269,570; java: 83,893; javascript: 79,900; cpp: 36,927; sh: 31,653; cs: 25,702; php: 12,690; yacc: 10,227; lex: 7,601; makefile: 7,129; jsp: 4,523; awk: 1,697; perl: 1,013; ruby: 1,003; python: 326
file content (152 lines) | stat: -rw-r--r-- 4,685 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
 *  dbgmal.h
 *
 *  $Id$
 *
 *  Debugging malloc package
 *  
 *  This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
 *  project.
 *  
 *  Copyright (C) 1998-2018 OpenLink Software
 *  
 *  This project is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the
 *  Free Software Foundation; only version 2 of the License, dated June 1991.
 *  
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 *  
 *  
*/

#ifndef _DBGMAL_H
#define _DBGMAL_H
#include <string.h>

/*
 *  Signal that causes memory trace to be written
 *  If not specified, then no handler will be installed
 */
#ifdef UNIX
# define DBGMAL_SIGNAL	SIGUSR2
#endif

#ifndef MALLOC_DEBUG
#ifdef MALLOC_STRESS
!!! Using MALLOC_STRESS has no sence if MALLOC_DEBUG is not set
#endif
#endif

#define DBGMAL_MAGIC_OK			0xA110CA99
#define DBGMAL_MAGIC_FREED		0xA110CA98
#define DBGMAL_MAGIC_POOL_OK		0xA110CA97
#define DBGMAL_MAGIC_POOL_FREED		0xA110CA96
#define DBGMAL_MAGIC_COUNT_OK		0xA110CA95
#define DBGMAL_MAGIC_COUNT_FREED	0xA110CA94

#ifdef MALLOC_DEBUG
# define malloc(X)	dbg_malloc(__FILE__,__LINE__,X)
# define realloc(B,S)	dbg_realloc(__FILE__,__LINE__,B,S)
# define calloc(X,Y)	dbg_calloc(__FILE__,__LINE__,X,Y)
# define free(X)	dbg_free(__FILE__,__LINE__,X)
# define mallocp(X,P)	dbg_mallocp(__FILE__,__LINE__,X,P)
# define callocp(X,Y,P)	dbg_callocp(__FILE__,__LINE__,X,Y,P)
# define freep(X,P)	dbg_freep(__FILE__,__LINE__,X,P)
# ifndef __GNUC__
#  undef strdup
#  define strdup(s)	dbg_strdup (__FILE__, __LINE__, s)
# else
#  undef strdup
#  define strdup(s) \
    ({ const char *tmp = s; \
       strcpy (malloc (strlen (tmp) + 1), tmp); \
     })
extern int dbg_allows_free_nulls;
# endif

#else
#define mallocp(X,P) malloc (X)
#define callocp(X,P) calloc (X)
#define freep(X,P) free (X)
#endif

#define AAAL_BUCKETS_COUNT 43 /* should be a prime */

typedef struct malrec_s
{
  const char *	mr_fname;
  u_int		mr_linenum;
  long		mr_numalloc;
  long		mr_prevalloc;
  long		mr_numfree;
  long		mr_prevfree;
  size_t	mr_totalsize;
  size_t	mr_prevsize;
  void *	mr_aaal_malhdrs[AAAL_BUCKETS_COUNT];
  long		mr_aaal_count;
} malrec_t;

typedef struct malhdr_s
{
  uint32	magic;
  malrec_t *	origin;
  size_t	size;
  void *	pool;
  void *	next_malhdr;
} malhdr_t;

extern void * dbgmal_mtx;
#define	dbgmal_is_enabled() (NULL != dbgmal_mtx)

BEGIN_CPLUSPLUS

void	dbg_malloc_enable(void);
void *	dbg_malloc (const char *file, u_int line, size_t size);
void *	dbg_realloc (const char *file, u_int line, void *old, size_t size);
void *	dbg_calloc (const char *file, u_int line, size_t num, size_t size);
void	dbg_free (const char *file, u_int line, void *data);
void	dbg_free_sized (const char *file, u_int line, void *data, size_t sz);
void *	dbg_mallocp (const char *file, u_int line, size_t size, void *pool);
void *	dbg_callocp (const char *file, u_int line, size_t num, size_t size, void *pool);
void	dbg_freep (const char *file, u_int line, void *data, void *pool);
char *	dbg_strdup (const char *file, u_int line, const char *str);
void	dbg_count_like_malloc (const char *file, u_int line, malhdr_t *thing, size_t size);
void	dbg_count_like_free (const char *file, u_int line, malhdr_t *thing);
#define DBG_MALSTATS_ALL 0
#define DBG_MALSTATS_NEW 1
#define DBG_MALSTATS_LEAKS 2
void	dbg_malstats (FILE *, int mode);
int	dbg_mark (const char *name);
int	dbg_unmark (const char *name);
size_t  dbg_mal_count (const char *name, u_int line);

void	 dbg_dump_mem(void);

extern uint32 dbg_malloc_magic_of_data (void *data);
extern void *dbg_mp_of_data (void *data);

const char *dbg_find_allocation_error (void *data, void *expected_pool);

size_t dbg_malloc_get_current_total (void);
#ifdef MALLOC_STRESS
extern void dbg_malloc_set_hard_memlimit (size_t consumption);
#define dbg_malloc_hit(N) dbg_malloc_hit_impl(__FILE__, __LINE__, (N))
extern void dbg_malloc_hit_impl (const char *file, u_int line, const char *name);
extern void dbg_malloc_set_hit_memlimit (const char *name, size_t consumption);
#else
#define dbg_malloc_set_hard_memlimit(C) do { ; } while (0)
#define dbg_malloc_hit(N) do { ; } while (0)
#define dbg_malloc_set_hit_memlimit(N,C) do { ; } while (0)
#endif

END_CPLUSPLUS

#endif