PulseAudio  3.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, write to the Free Software
21  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22  USA.
23 ***/
24 
25 #include <sys/types.h>
26 #include <stdlib.h>
27 #include <limits.h>
28 #include <assert.h>
29 
30 #include <pulse/cdecl.h>
31 #include <pulse/gccmacro.h>
32 #include <pulse/version.h>
33 
38 PA_C_DECL_BEGIN
39 
41 void* pa_xmalloc(size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(1);
42 
45 
47 void *pa_xrealloc(void *ptr, size_t size) PA_GCC_ALLOC_SIZE(2);
48 
50 void pa_xfree(void *p);
51 
53 char *pa_xstrdup(const char *s) PA_GCC_MALLOC;
54 
56 char *pa_xstrndup(const char *s, size_t l) PA_GCC_MALLOC;
57 
59 void* pa_xmemdup(const void *p, size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(2);
60 
62 static void* _pa_xnew_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
63 
64 static inline void* _pa_xnew_internal(size_t n, size_t k) {
65  assert(n < INT_MAX/k);
66  return pa_xmalloc(n*k);
67 }
68 
70 #define pa_xnew(type, n) ((type*) _pa_xnew_internal((n), sizeof(type)))
71 
73 static void* _pa_xnew0_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
74 
75 static inline void* _pa_xnew0_internal(size_t n, size_t k) {
76  assert(n < INT_MAX/k);
77  return pa_xmalloc0(n*k);
78 }
79 
81 #define pa_xnew0(type, n) ((type*) _pa_xnew0_internal((n), sizeof(type)))
82 
84 static void* _pa_xnewdup_internal(const void *p, size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(2,3);
85 
86 static inline void* _pa_xnewdup_internal(const void *p, size_t n, size_t k) {
87  assert(n < INT_MAX/k);
88  return pa_xmemdup(p, n*k);
89 }
90 
92 #define pa_xnewdup(type, p, n) ((type*) _pa_xnewdup_internal((p), (n), sizeof(type)))
93 
95 static void* _pa_xrenew_internal(void *p, size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(2,3);
96 
97 static inline void* _pa_xrenew_internal(void *p, size_t n, size_t k) {
98  assert(n < INT_MAX/k);
99  return pa_xrealloc(p, n*k);
100 }
101 
103 #define pa_xrenew(type, p, n) ((type*) _pa_xrenew_internal(p, (n), sizeof(type)))
104 
105 PA_C_DECL_END
106 
107 #endif