Remove MinGW support
[blender-staging.git] / intern / guardedalloc / intern / mallocn_intern.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2013 by Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Sergey Sharybin
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file guardedalloc/intern/mallocn_intern.h
29  *  \ingroup MEM
30  */
31
32 #ifndef __MALLOCN_INTERN_H__
33 #define __MALLOCN_INTERN_H__
34
35 /* mmap exception */
36 #if defined(WIN32)
37 #  include "mmap_win.h"
38 #else
39 #  include <sys/mman.h>
40 #endif
41
42 #if defined(_MSC_VER)
43 #  define __func__ __FUNCTION__
44 #endif
45
46 #ifdef __GNUC__
47 #  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
48 #else
49 #  define UNUSED(x) UNUSED_ ## x
50 #endif
51
52 #undef HAVE_MALLOC_STATS
53 #define USE_MALLOC_USABLE_SIZE  /* internal, when we have malloc_usable_size() */
54
55 #if defined(__linux__) || (defined(__FreeBSD_kernel__) && !defined(__FreeBSD__)) || defined(__GLIBC__)
56 #  include <malloc.h>
57 #  define HAVE_MALLOC_STATS
58 #elif defined(__FreeBSD__)
59 #  include <malloc_np.h>
60 #elif defined(__APPLE__)
61 #  include <malloc/malloc.h>
62 #  define malloc_usable_size malloc_size
63 #elif defined(WIN32)
64 #  include <malloc.h>
65 #  define malloc_usable_size _msize
66 #else
67 #  pragma message "We don't know how to use malloc_usable_size on your platform"
68 #  undef USE_MALLOC_USABLE_SIZE
69 #endif
70
71 /* Blame Microsoft for LLP64 and no inttypes.h, quick workaround needed: */
72 #if defined(WIN64)
73 #  define SIZET_FORMAT "%I64u"
74 #  define SIZET_ARG(a) ((unsigned long long)(a))
75 #else
76 #  define SIZET_FORMAT "%lu"
77 #  define SIZET_ARG(a) ((unsigned long)(a))
78 #endif
79
80 #define SIZET_ALIGN_4(len) ((len + 3) & ~(size_t)3)
81
82 #ifdef __GNUC__
83 #  define LIKELY(x)       __builtin_expect(!!(x), 1)
84 #  define UNLIKELY(x)     __builtin_expect(!!(x), 0)
85 #else
86 #  define LIKELY(x)       (x)
87 #  define UNLIKELY(x)     (x)
88 #endif
89
90 #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__NetBSD__)
91 // Needed for memalign on Linux and _aligned_alloc on Windows.
92
93 #  include <malloc.h>
94 #else
95 // Apple's malloc is 16-byte aligned, and does not have malloc.h, so include
96 // stdilb instead.
97 #  include <stdlib.h>
98 #endif
99
100 /* visual studio 2012 does not define inline for C */
101 #ifdef _MSC_VER
102 #  define MEM_INLINE static __inline
103 #else
104 #  define MEM_INLINE static inline
105 #endif
106
107 #define IS_POW2(a) (((a) & ((a) - 1)) == 0)
108
109 /* Extra padding which needs to be applied on MemHead to make it aligned. */
110 #define MEMHEAD_ALIGN_PADDING(alignment) ((size_t)alignment - (sizeof(MemHeadAligned) % (size_t)alignment))
111
112 /* Real pointer returned by the malloc or aligned_alloc. */
113 #define MEMHEAD_REAL_PTR(memh) ((char *)memh - MEMHEAD_ALIGN_PADDING(memh->alignment))
114
115 void *aligned_malloc(size_t size, size_t alignment);
116 void aligned_free(void *ptr);
117
118 /* Prototypes for counted allocator functions */
119 size_t MEM_lockfree_allocN_len(const void *vmemh) ATTR_WARN_UNUSED_RESULT;
120 void MEM_lockfree_freeN(void *vmemh);
121 void *MEM_lockfree_dupallocN(const void *vmemh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
122 void *MEM_lockfree_reallocN_id(void *vmemh, size_t len, const char *UNUSED(str))  ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(2);
123 void *MEM_lockfree_recallocN_id(void *vmemh, size_t len, const char *UNUSED(str))  ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(2);
124 void *MEM_lockfree_callocN(size_t len, const char *UNUSED(str))  ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2);
125 void *MEM_lockfree_mallocN(size_t len, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2);
126 void *MEM_lockfree_mallocN_aligned(size_t len, size_t alignment, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(3);
127 void *MEM_lockfree_mapallocN(size_t len, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2);
128 void MEM_lockfree_printmemlist_pydict(void);
129 void MEM_lockfree_printmemlist(void);
130 void MEM_lockfree_callbackmemlist(void (*func)(void *));
131 void MEM_lockfree_printmemlist_stats(void);
132 void MEM_lockfree_set_error_callback(void (*func)(const char *));
133 bool MEM_lockfree_check_memory_integrity(void);
134 void MEM_lockfree_set_lock_callback(void (*lock)(void), void (*unlock)(void));
135 void MEM_lockfree_set_memory_debug(void);
136 size_t MEM_lockfree_get_memory_in_use(void);
137 size_t MEM_lockfree_get_mapped_memory_in_use(void);
138 unsigned int MEM_lockfree_get_memory_blocks_in_use(void);
139 void MEM_lockfree_reset_peak_memory(void);
140 size_t MEM_lockfree_get_peak_memory(void) ATTR_WARN_UNUSED_RESULT;
141 #ifndef NDEBUG
142 const char *MEM_lockfree_name_ptr(void *vmemh);
143 #endif
144
145 /* Prototypes for fully guarded allocator functions */
146 size_t MEM_guarded_allocN_len(const void *vmemh) ATTR_WARN_UNUSED_RESULT;
147 void MEM_guarded_freeN(void *vmemh);
148 void *MEM_guarded_dupallocN(const void *vmemh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT;
149 void *MEM_guarded_reallocN_id(void *vmemh, size_t len, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(2);
150 void *MEM_guarded_recallocN_id(void *vmemh, size_t len, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(2);
151 void *MEM_guarded_callocN(size_t len, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2);
152 void *MEM_guarded_mallocN(size_t len, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2);
153 void *MEM_guarded_mallocN_aligned(size_t len, size_t alignment, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(3);
154 void *MEM_guarded_mapallocN(size_t len, const char *UNUSED(str)) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_ALLOC_SIZE(1) ATTR_NONNULL(2);
155 void MEM_guarded_printmemlist_pydict(void);
156 void MEM_guarded_printmemlist(void);
157 void MEM_guarded_callbackmemlist(void (*func)(void *));
158 void MEM_guarded_printmemlist_stats(void);
159 void MEM_guarded_set_error_callback(void (*func)(const char *));
160 bool MEM_guarded_check_memory_integrity(void);
161 void MEM_guarded_set_lock_callback(void (*lock)(void), void (*unlock)(void));
162 void MEM_guarded_set_memory_debug(void);
163 size_t MEM_guarded_get_memory_in_use(void);
164 size_t MEM_guarded_get_mapped_memory_in_use(void);
165 unsigned int MEM_guarded_get_memory_blocks_in_use(void);
166 void MEM_guarded_reset_peak_memory(void);
167 size_t MEM_guarded_get_peak_memory(void) ATTR_WARN_UNUSED_RESULT;
168 #ifndef NDEBUG
169 const char *MEM_guarded_name_ptr(void *vmemh);
170 #endif
171
172 #endif  /* __MALLOCN_INTERN_H__ */