xref: /AOO41X/main/sal/rtl/source/alloc_impl.h (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #ifndef INCLUDED_RTL_ALLOC_IMPL_H
29*cdf0e10cSrcweir #define INCLUDED_RTL_ALLOC_IMPL_H
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "sal/types.h"
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #ifdef __cplusplus
34*cdf0e10cSrcweir extern "C" {
35*cdf0e10cSrcweir #endif
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir /** Alignment macros
39*cdf0e10cSrcweir  */
40*cdf0e10cSrcweir #if SAL_TYPES_ALIGNMENT4 > 1
41*cdf0e10cSrcweir #define RTL_MEMORY_ALIGNMENT_4 SAL_TYPES_ALIGNMENT4
42*cdf0e10cSrcweir #else
43*cdf0e10cSrcweir #define RTL_MEMORY_ALIGNMENT_4 sizeof(int)
44*cdf0e10cSrcweir #endif /* SAL_TYPES_ALIGNMENT4 */
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir #if SAL_TYPES_ALIGNMENT8 > 1
47*cdf0e10cSrcweir #define RTL_MEMORY_ALIGNMENT_8 SAL_TYPES_ALIGNMENT8
48*cdf0e10cSrcweir #else
49*cdf0e10cSrcweir #define RTL_MEMORY_ALIGNMENT_8 sizeof(void*)
50*cdf0e10cSrcweir #endif /* SAL_TYPES_ALIGNMENT8 */
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir #if 0  /* @@@ */
53*cdf0e10cSrcweir #define RTL_MEMORY_ALIGNMENT_1 8
54*cdf0e10cSrcweir #define RTL_MEMORY_ALIGNMENT_2 (sizeof(void*) * 2)
55*cdf0e10cSrcweir #endif /* @@@ */
56*cdf0e10cSrcweir 
57*cdf0e10cSrcweir #define RTL_MEMORY_ALIGN(value, align) (((value) + ((align) - 1)) & ~((align) - 1))
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir #define RTL_MEMORY_ISP2(value) (((value) & ((value) - 1)) == 0)
60*cdf0e10cSrcweir #define RTL_MEMORY_P2ALIGN(value, align) ((value) & -(sal_IntPtr)(align))
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir #define RTL_MEMORY_P2ROUNDUP(value, align) \
63*cdf0e10cSrcweir 	(-(-(sal_IntPtr)(value) & -(sal_IntPtr)(align)))
64*cdf0e10cSrcweir #define RTL_MEMORY_P2END(value, align) \
65*cdf0e10cSrcweir 	(-(~(sal_IntPtr)(value) & -(sal_IntPtr)(align)))
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir /** Function inlining macros
69*cdf0e10cSrcweir  *  (compiler dependent)
70*cdf0e10cSrcweir  */
71*cdf0e10cSrcweir #ifndef RTL_MEMORY_INLINE
72*cdf0e10cSrcweir #if defined(__GNUC__)
73*cdf0e10cSrcweir #define RTL_MEMORY_INLINE __inline__
74*cdf0e10cSrcweir #elif defined(_MSC_VER)
75*cdf0e10cSrcweir #define RTL_MEMORY_INLINE __inline
76*cdf0e10cSrcweir #else
77*cdf0e10cSrcweir #define RTL_MEMORY_INLINE
78*cdf0e10cSrcweir #endif /* __GNUC__ || _MSC_VER */
79*cdf0e10cSrcweir #endif /* RTL_MEMORY_INLINE */
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir /** printf() format specifier(s)
83*cdf0e10cSrcweir  *  (from C90 <sys/int_fmtio.h>)
84*cdf0e10cSrcweir  */
85*cdf0e10cSrcweir #ifndef PRIu64
86*cdf0e10cSrcweir #if defined(_MSC_VER)
87*cdf0e10cSrcweir #define PRIu64 "I64u"
88*cdf0e10cSrcweir #else  /* !_MSC_VER */
89*cdf0e10cSrcweir #define PRIu64 "llu"
90*cdf0e10cSrcweir #endif /* !_MSC_VER */
91*cdf0e10cSrcweir #endif /* PRIu64 */
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir /** highbit(): log2() + 1
95*cdf0e10cSrcweir  *  (complexity O(1))
96*cdf0e10cSrcweir  */
97*cdf0e10cSrcweir static RTL_MEMORY_INLINE int
98*cdf0e10cSrcweir highbit(sal_Size n)
99*cdf0e10cSrcweir {
100*cdf0e10cSrcweir   register int k = 1;
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir   if (n == 0)
103*cdf0e10cSrcweir 	return (0);
104*cdf0e10cSrcweir #if SAL_TYPES_SIZEOFLONG == 8
105*cdf0e10cSrcweir   if (n & 0xffffffff00000000ul)
106*cdf0e10cSrcweir 	k |= 32, n >>= 32;
107*cdf0e10cSrcweir #endif
108*cdf0e10cSrcweir   if (n & 0xffff0000)
109*cdf0e10cSrcweir     k |= 16, n >>= 16;
110*cdf0e10cSrcweir   if (n & 0xff00)
111*cdf0e10cSrcweir     k |= 8, n >>= 8;
112*cdf0e10cSrcweir   if (n & 0xf0)
113*cdf0e10cSrcweir 	k |= 4, n >>= 4;
114*cdf0e10cSrcweir   if (n & 0x0c)
115*cdf0e10cSrcweir     k |= 2, n >>= 2;
116*cdf0e10cSrcweir   if (n & 0x02)
117*cdf0e10cSrcweir     k++;
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir   return (k);
120*cdf0e10cSrcweir }
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir #if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
123*cdf0e10cSrcweir #pragma inline(highbit)
124*cdf0e10cSrcweir #endif /* __SUNPRO_C */
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir /** lowbit(): find first bit set
128*cdf0e10cSrcweir  *  (complexity O(1))
129*cdf0e10cSrcweir  */
130*cdf0e10cSrcweir static RTL_MEMORY_INLINE int
131*cdf0e10cSrcweir lowbit(sal_Size n)
132*cdf0e10cSrcweir {
133*cdf0e10cSrcweir   register int k = 1;
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir   if (n == 0)
136*cdf0e10cSrcweir 	return (0);
137*cdf0e10cSrcweir #if SAL_TYPES_SIZEOFLONG == 8
138*cdf0e10cSrcweir   if (!(n & 0xffffffff))
139*cdf0e10cSrcweir 	k |= 32, n >>= 32;
140*cdf0e10cSrcweir #endif
141*cdf0e10cSrcweir   if (!(n & 0xffff))
142*cdf0e10cSrcweir 	k |= 16, n >>= 16;
143*cdf0e10cSrcweir   if (!(n & 0xff))
144*cdf0e10cSrcweir 	k |= 8, n >>= 8;
145*cdf0e10cSrcweir   if (!(n & 0xf))
146*cdf0e10cSrcweir 	k |= 4, n >>= 4;
147*cdf0e10cSrcweir   if (!(n & 0x3))
148*cdf0e10cSrcweir 	k |= 2, n >>= 2;
149*cdf0e10cSrcweir   if (!(n & 0x1))
150*cdf0e10cSrcweir 	k++;
151*cdf0e10cSrcweir   return (k);
152*cdf0e10cSrcweir }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir #if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
155*cdf0e10cSrcweir #pragma inline(lowbit)
156*cdf0e10cSrcweir #endif /* __SUNPRO_C */
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir /** Queue manipulation macros
160*cdf0e10cSrcweir  *  (doubly linked circular list)
161*cdf0e10cSrcweir  *  (complexity O(1))
162*cdf0e10cSrcweir  */
163*cdf0e10cSrcweir #define QUEUE_STARTED_NAMED(entry, name) \
164*cdf0e10cSrcweir   (((entry)->m_##name##next == (entry)) && ((entry)->m_##name##prev == (entry)))
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir #define QUEUE_START_NAMED(entry, name) \
167*cdf0e10cSrcweir { \
168*cdf0e10cSrcweir   (entry)->m_##name##next = (entry); \
169*cdf0e10cSrcweir   (entry)->m_##name##prev = (entry); \
170*cdf0e10cSrcweir }
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir #define QUEUE_REMOVE_NAMED(entry, name) \
173*cdf0e10cSrcweir { \
174*cdf0e10cSrcweir   (entry)->m_##name##prev->m_##name##next = (entry)->m_##name##next; \
175*cdf0e10cSrcweir   (entry)->m_##name##next->m_##name##prev = (entry)->m_##name##prev; \
176*cdf0e10cSrcweir   QUEUE_START_NAMED(entry, name); \
177*cdf0e10cSrcweir }
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir #define QUEUE_INSERT_HEAD_NAMED(head, entry, name) \
180*cdf0e10cSrcweir { \
181*cdf0e10cSrcweir   (entry)->m_##name##prev = (head); \
182*cdf0e10cSrcweir   (entry)->m_##name##next = (head)->m_##name##next; \
183*cdf0e10cSrcweir   (head)->m_##name##next = (entry); \
184*cdf0e10cSrcweir   (entry)->m_##name##next->m_##name##prev = (entry); \
185*cdf0e10cSrcweir }
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir #define QUEUE_INSERT_TAIL_NAMED(head, entry, name) \
188*cdf0e10cSrcweir { \
189*cdf0e10cSrcweir   (entry)->m_##name##next = (head); \
190*cdf0e10cSrcweir   (entry)->m_##name##prev = (head)->m_##name##prev; \
191*cdf0e10cSrcweir   (head)->m_##name##prev = (entry); \
192*cdf0e10cSrcweir   (entry)->m_##name##prev->m_##name##next = (entry); \
193*cdf0e10cSrcweir }
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir /** rtl_memory_lock_type
197*cdf0e10cSrcweir  *  (platform dependent)
198*cdf0e10cSrcweir  */
199*cdf0e10cSrcweir #if defined(SAL_UNX) || defined(SAL_OS2)
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir #include <unistd.h>
202*cdf0e10cSrcweir #include <pthread.h>
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir typedef pthread_mutex_t rtl_memory_lock_type;
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_INIT(lock)    pthread_mutex_init((lock), NULL)
207*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_DESTROY(lock) pthread_mutex_destroy((lock))
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_ACQUIRE(lock) pthread_mutex_lock((lock))
210*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_RELEASE(lock) pthread_mutex_unlock((lock))
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir #elif defined(SAL_W32)
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir #define WIN32_LEAN_AND_MEAN
215*cdf0e10cSrcweir #ifdef _MSC_VER
216*cdf0e10cSrcweir #pragma warning(push,1) /* disable warnings within system headers */
217*cdf0e10cSrcweir #endif
218*cdf0e10cSrcweir #include <windows.h>
219*cdf0e10cSrcweir #ifdef _MSC_VER
220*cdf0e10cSrcweir #pragma warning(pop)
221*cdf0e10cSrcweir #endif
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir typedef CRITICAL_SECTION rtl_memory_lock_type;
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_INIT(lock)    InitializeCriticalSection((lock))
226*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_DESTROY(lock) DeleteCriticalSection((lock))
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_ACQUIRE(lock) EnterCriticalSection((lock))
229*cdf0e10cSrcweir #define RTL_MEMORY_LOCK_RELEASE(lock) LeaveCriticalSection((lock))
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir #else
232*cdf0e10cSrcweir #error Unknown platform
233*cdf0e10cSrcweir #endif /* SAL_UNX | SAL_W32 */
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir /** Cache creation flags.
237*cdf0e10cSrcweir  *  @internal
238*cdf0e10cSrcweir  */
239*cdf0e10cSrcweir #define RTL_CACHE_FLAG_NOMAGAZINE   (1 << 13) /* w/o magazine layer */
240*cdf0e10cSrcweir #define RTL_CACHE_FLAG_QUANTUMCACHE (2 << 13) /* used as arena quantum cache */
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir /** Valgrind support macros.
244*cdf0e10cSrcweir  */
245*cdf0e10cSrcweir #if !defined(HAVE_MEMCHECK_H) || (OSL_DEBUG_LEVEL == 0)
246*cdf0e10cSrcweir #if !defined(NVALGRIND)
247*cdf0e10cSrcweir #define NVALGRIND 1
248*cdf0e10cSrcweir #endif /* ! NVALGRIND */
249*cdf0e10cSrcweir #endif /* ! HAVE_MEMCHECK_H || (OSL_DEBUG_LEVEL == 0) */
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir #if defined(NVALGRIND)
252*cdf0e10cSrcweir #define VALGRIND_MAKE_MEM_UNDEFINED(addr, size)
253*cdf0e10cSrcweir #define VALGRIND_MAKE_MEM_DEFINED(addr, size)
254*cdf0e10cSrcweir #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)
255*cdf0e10cSrcweir #define VALGRIND_FREELIKE_BLOCK(addr, rzB)
256*cdf0e10cSrcweir #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed)
257*cdf0e10cSrcweir #define VALGRIND_DESTROY_MEMPOOL(pool)
258*cdf0e10cSrcweir #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size)
259*cdf0e10cSrcweir #define VALGRIND_MEMPOOL_FREE(pool, addr)
260*cdf0e10cSrcweir #elif defined(HAVE_MEMCHECK_H)
261*cdf0e10cSrcweir #include <memcheck.h>
262*cdf0e10cSrcweir #if !defined(FORCE_SYSALLOC)
263*cdf0e10cSrcweir #define FORCE_SYSALLOC 1
264*cdf0e10cSrcweir #endif /* !FORCE_SYSALLOC */
265*cdf0e10cSrcweir #endif /* NVALGRIND || HAVE_MEMCHECK_H */
266*cdf0e10cSrcweir 
267*cdf0e10cSrcweir #ifdef __cplusplus
268*cdf0e10cSrcweir }
269*cdf0e10cSrcweir #endif
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir #endif /* INCLUDED_RTL_ALLOC_IMPL_H */
272