1 #ifndef foomemoryhfoo
2 #define foomemoryhfoo
3
4 /***
5 This file is part of PulseAudio.
6
7 Copyright 2004-2006 Lennart Poettering
8
9 PulseAudio is free software; you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License as published
11 by the Free Software Foundation; either version 2.1 of the License,
12 or (at your option) any later version.
13
14 PulseAudio is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
18
19 You should have received a copy of the GNU Lesser General Public License
20 along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
21 ***/
22
23 #include <sys/types.h>
24 #include <stdlib.h>
25 #include <limits.h>
26 #include <assert.h>
27
28 #include <pulse/cdecl.h>
29 #include <pulse/gccmacro.h>
30 #include <pulse/version.h>
31
32 /** \file
33 * Memory allocation functions.
34 */
35
36 PA_C_DECL_BEGIN
37
38 /** Allocate the specified number of bytes, just like malloc() does. However, in case of OOM, terminate */
39 void* pa_xmalloc(size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(1);
40
41 /** Same as pa_xmalloc(), but initialize allocated memory to 0 */
42 void *pa_xmalloc0(size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(1);
43
44 /** The combination of pa_xmalloc() and realloc() */
45 void *pa_xrealloc(void *ptr, size_t size) PA_GCC_ALLOC_SIZE(2);
46
47 /** Free allocated memory */
48 void pa_xfree(void *p);
49
50 /** Duplicate the specified string, allocating memory with pa_xmalloc() */
51 char *pa_xstrdup(const char *s) PA_GCC_MALLOC;
52
53 /** Duplicate the specified string, but truncate after l characters */
54 char *pa_xstrndup(const char *s, size_t l) PA_GCC_MALLOC;
55
56 /** Duplicate the specified memory block */
57 void* pa_xmemdup(const void *p, size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(2);
58
59 /** Internal helper for pa_xnew() */
60 static void* _pa_xnew_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
61
_pa_xnew_internal(size_t n,size_t k)62 static inline void* _pa_xnew_internal(size_t n, size_t k) {
63 assert(n < INT_MAX/k);
64 return pa_xmalloc(n*k);
65 }
66
67 /** Allocate n new structures of the specified type. */
68 #define pa_xnew(type, n) ((type*) _pa_xnew_internal((n), sizeof(type)))
69
70 /** Internal helper for pa_xnew0() */
71 static void* _pa_xnew0_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
72
_pa_xnew0_internal(size_t n,size_t k)73 static inline void* _pa_xnew0_internal(size_t n, size_t k) {
74 assert(n < INT_MAX/k);
75 return pa_xmalloc0(n*k);
76 }
77
78 /** Same as pa_xnew() but set the memory to zero */
79 #define pa_xnew0(type, n) ((type*) _pa_xnew0_internal((n), sizeof(type)))
80
81 /** Internal helper for pa_xnew0() */
82 static void* _pa_xnewdup_internal(const void *p, size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(2,3);
83
_pa_xnewdup_internal(const void * p,size_t n,size_t k)84 static inline void* _pa_xnewdup_internal(const void *p, size_t n, size_t k) {
85 assert(n < INT_MAX/k);
86 return pa_xmemdup(p, n*k);
87 }
88
89 /** Same as pa_xnew() but duplicate the specified data */
90 #define pa_xnewdup(type, p, n) ((type*) _pa_xnewdup_internal((p), (n), sizeof(type)))
91
92 /** Internal helper for pa_xrenew() */
93 static void* _pa_xrenew_internal(void *p, size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(2,3);
94
_pa_xrenew_internal(void * p,size_t n,size_t k)95 static inline void* _pa_xrenew_internal(void *p, size_t n, size_t k) {
96 assert(n < INT_MAX/k);
97 return pa_xrealloc(p, n*k);
98 }
99
100 /** Reallocate n new structures of the specified type. */
101 #define pa_xrenew(type, p, n) ((type*) _pa_xrenew_internal(p, (n), sizeof(type)))
102
103 PA_C_DECL_END
104
105 #endif
106