PulseAudio  16.0
xmalloc.h
Go to the documentation of this file.
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 
36 PA_C_DECL_BEGIN
37 
40 
43 
45 void *pa_xrealloc(void *ptr, size_t size) PA_GCC_ALLOC_SIZE(2);
46 
48 void pa_xfree(void *p);
49 
51 char *pa_xstrdup(const char *s) PA_GCC_MALLOC;
52 
54 char *pa_xstrndup(const char *s, size_t l) PA_GCC_MALLOC;
55 
57 void* pa_xmemdup(const void *p, size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(2);
58 
60 static void* _pa_xnew_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
61 
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 
68 #define pa_xnew(type, n) ((type*) _pa_xnew_internal((n), sizeof(type)))
69 
71 static void* _pa_xnew0_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
72 
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 
79 #define pa_xnew0(type, n) ((type*) _pa_xnew0_internal((n), sizeof(type)))
80 
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 
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 
90 #define pa_xnewdup(type, p, n) ((type*) _pa_xnewdup_internal((p), (n), sizeof(type)))
91 
93 static void* _pa_xrenew_internal(void *p, size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(2,3);
94 
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 
101 #define pa_xrenew(type, p, n) ((type*) _pa_xrenew_internal(p, (n), sizeof(type)))
102 
103 PA_C_DECL_END
104 
105 #endif
GCC attribute macros.
#define PA_GCC_MALLOC
Macro for usage of GCC's malloc attribute.
Definition: gccmacro.h:119
#define PA_GCC_ALLOC_SIZE(x)
Macro for usage of GCC's alloc_size attribute.
Definition: gccmacro.h:108
#define PA_GCC_ALLOC_SIZE2(x, y)
Macro for usage of GCC's alloc_size attribute.
Definition: gccmacro.h:110
char * pa_xstrndup(const char *s, size_t l) PA_GCC_MALLOC
Duplicate the specified string, but truncate after l characters.
void * pa_xrealloc(void *ptr, size_t size) PA_GCC_ALLOC_SIZE(2)
The combination of pa_xmalloc() and realloc()
void * pa_xmalloc0(size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(1)
Same as pa_xmalloc(), but initialize allocated memory to 0.
char * pa_xstrdup(const char *s) PA_GCC_MALLOC
Duplicate the specified string, allocating memory with pa_xmalloc()
void pa_xfree(void *p)
Free allocated memory.
void * pa_xmemdup(const void *p, size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(2)
Duplicate the specified memory block.
void * pa_xmalloc(size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(1)
Allocate the specified number of bytes, just like malloc() does.