Blame


1 cfa37a7b 2004-04-10 devnull .TH MALLOC 3
2 cfa37a7b 2004-04-10 devnull .SH NAME
3 cfa37a7b 2004-04-10 devnull malloc, mallocz, free, realloc, calloc, msize, setmalloctag, setrealloctag, getmalloctag, getrealloctag, malloctopoolblock \- memory allocator
4 cfa37a7b 2004-04-10 devnull .SH SYNOPSIS
5 cfa37a7b 2004-04-10 devnull .B #include <u.h>
6 cfa37a7b 2004-04-10 devnull .br
7 cfa37a7b 2004-04-10 devnull .B #include <libc.h>
8 cfa37a7b 2004-04-10 devnull .PP
9 cfa37a7b 2004-04-10 devnull .ta \w'\fLvoid* 'u
10 cfa37a7b 2004-04-10 devnull .B
11 cfa37a7b 2004-04-10 devnull void* malloc(ulong size)
12 cfa37a7b 2004-04-10 devnull .PP
13 cfa37a7b 2004-04-10 devnull .B
14 cfa37a7b 2004-04-10 devnull void* mallocz(ulong size, int clr)
15 cfa37a7b 2004-04-10 devnull .PP
16 cfa37a7b 2004-04-10 devnull .B
17 cfa37a7b 2004-04-10 devnull void free(void *ptr)
18 cfa37a7b 2004-04-10 devnull .PP
19 cfa37a7b 2004-04-10 devnull .B
20 cfa37a7b 2004-04-10 devnull void* realloc(void *ptr, ulong size)
21 cfa37a7b 2004-04-10 devnull .PP
22 cfa37a7b 2004-04-10 devnull .B
23 cfa37a7b 2004-04-10 devnull void* calloc(ulong nelem, ulong elsize)
24 cfa37a7b 2004-04-10 devnull .PP
25 cfa37a7b 2004-04-10 devnull .B
26 cfa37a7b 2004-04-10 devnull ulong msize(void *ptr)
27 cfa37a7b 2004-04-10 devnull .PP
28 cfa37a7b 2004-04-10 devnull .B
29 cfa37a7b 2004-04-10 devnull void setmalloctag(void *ptr, ulong tag)
30 cfa37a7b 2004-04-10 devnull .PP
31 cfa37a7b 2004-04-10 devnull .B
32 cfa37a7b 2004-04-10 devnull ulong getmalloctag(void *ptr, ulong tag)
33 cfa37a7b 2004-04-10 devnull .PP
34 cfa37a7b 2004-04-10 devnull .B
35 cfa37a7b 2004-04-10 devnull void setrealloctag(void *ptr, ulong tag)
36 cfa37a7b 2004-04-10 devnull .PP
37 cfa37a7b 2004-04-10 devnull .B
38 cfa37a7b 2004-04-10 devnull ulong getrealloctag(void *ptr, ulong tag)
39 cfa37a7b 2004-04-10 devnull .PP
40 cfa37a7b 2004-04-10 devnull .B
41 cfa37a7b 2004-04-10 devnull void* malloctopoolblock(void*)
42 cfa37a7b 2004-04-10 devnull .PP
43 cfa37a7b 2004-04-10 devnull .SH DESCRIPTION
44 cfa37a7b 2004-04-10 devnull .I Malloc
45 cfa37a7b 2004-04-10 devnull and
46 cfa37a7b 2004-04-10 devnull .I free
47 cfa37a7b 2004-04-10 devnull provide a simple memory allocation package.
48 cfa37a7b 2004-04-10 devnull .I Malloc
49 cfa37a7b 2004-04-10 devnull returns a pointer to a new block of at least
50 cfa37a7b 2004-04-10 devnull .I size
51 cfa37a7b 2004-04-10 devnull bytes.
52 cfa37a7b 2004-04-10 devnull The block is suitably aligned for storage of any type of object.
53 cfa37a7b 2004-04-10 devnull No two active pointers from
54 cfa37a7b 2004-04-10 devnull .I malloc
55 cfa37a7b 2004-04-10 devnull will have the same value.
56 cfa37a7b 2004-04-10 devnull The call
57 cfa37a7b 2004-04-10 devnull .B malloc(0)
58 cfa37a7b 2004-04-10 devnull returns a valid pointer rather than null.
59 cfa37a7b 2004-04-10 devnull .PP
60 cfa37a7b 2004-04-10 devnull The argument to
61 cfa37a7b 2004-04-10 devnull .I free
62 cfa37a7b 2004-04-10 devnull is a pointer to a block previously allocated by
63 cfa37a7b 2004-04-10 devnull .IR malloc ;
64 cfa37a7b 2004-04-10 devnull this space is made available for further allocation.
65 cfa37a7b 2004-04-10 devnull It is legal to free a null pointer; the effect is a no-op.
66 cfa37a7b 2004-04-10 devnull The contents of the space returned by
67 cfa37a7b 2004-04-10 devnull .I malloc
68 cfa37a7b 2004-04-10 devnull are undefined.
69 cfa37a7b 2004-04-10 devnull .I Mallocz
70 cfa37a7b 2004-04-10 devnull behaves as
71 cfa37a7b 2004-04-10 devnull .IR malloc ,
72 cfa37a7b 2004-04-10 devnull except that if
73 cfa37a7b 2004-04-10 devnull .I clr
74 cfa37a7b 2004-04-10 devnull is non-zero, the memory returned will be zeroed.
75 cfa37a7b 2004-04-10 devnull .PP
76 cfa37a7b 2004-04-10 devnull .I Realloc
77 cfa37a7b 2004-04-10 devnull changes the size of the block pointed to by
78 cfa37a7b 2004-04-10 devnull .I ptr
79 cfa37a7b 2004-04-10 devnull to
80 cfa37a7b 2004-04-10 devnull .I size
81 cfa37a7b 2004-04-10 devnull bytes and returns a pointer to the (possibly moved)
82 cfa37a7b 2004-04-10 devnull block.
83 cfa37a7b 2004-04-10 devnull The contents will be unchanged up to the
84 cfa37a7b 2004-04-10 devnull lesser of the new and old sizes.
85 cfa37a7b 2004-04-10 devnull .I Realloc
86 cfa37a7b 2004-04-10 devnull takes on special meanings when one or both arguments are zero:
87 cfa37a7b 2004-04-10 devnull .TP
88 cfa37a7b 2004-04-10 devnull .B "realloc(0,\ size)
89 cfa37a7b 2004-04-10 devnull means
90 cfa37a7b 2004-04-10 devnull .LR malloc(size) ;
91 cfa37a7b 2004-04-10 devnull returns a pointer to the newly-allocated memory
92 cfa37a7b 2004-04-10 devnull .TP
93 cfa37a7b 2004-04-10 devnull .B "realloc(ptr,\ 0)
94 cfa37a7b 2004-04-10 devnull means
95 cfa37a7b 2004-04-10 devnull .LR free(ptr) ;
96 cfa37a7b 2004-04-10 devnull returns null
97 cfa37a7b 2004-04-10 devnull .TP
98 cfa37a7b 2004-04-10 devnull .B "realloc(0,\ 0)
99 cfa37a7b 2004-04-10 devnull no-op; returns null
100 cfa37a7b 2004-04-10 devnull .PD
101 cfa37a7b 2004-04-10 devnull .PP
102 cfa37a7b 2004-04-10 devnull .I Calloc
103 cfa37a7b 2004-04-10 devnull allocates space for
104 cfa37a7b 2004-04-10 devnull an array of
105 cfa37a7b 2004-04-10 devnull .I nelem
106 cfa37a7b 2004-04-10 devnull elements of size
107 cfa37a7b 2004-04-10 devnull .IR elsize .
108 cfa37a7b 2004-04-10 devnull The space is initialized to zeros.
109 cfa37a7b 2004-04-10 devnull .I Free
110 cfa37a7b 2004-04-10 devnull frees such a block.
111 cfa37a7b 2004-04-10 devnull .PP
112 cfa37a7b 2004-04-10 devnull When a block is allocated, sometimes there is some extra unused space at the end.
113 cfa37a7b 2004-04-10 devnull .I Msize
114 cfa37a7b 2004-04-10 devnull grows the block to encompass this unused space and returns the new number
115 cfa37a7b 2004-04-10 devnull of bytes that may be used.
116 cfa37a7b 2004-04-10 devnull .PP
117 cfa37a7b 2004-04-10 devnull The memory allocator maintains two word-sized fields
118 cfa37a7b 2004-04-10 devnull associated with each block, the ``malloc tag'' and the ``realloc tag''.
119 cfa37a7b 2004-04-10 devnull By convention, the malloc tag is the PC that allocated the block,
120 cfa37a7b 2004-04-10 devnull and the realloc tag the PC that last reallocated the block.
121 cfa37a7b 2004-04-10 devnull These may be set or examined with
122 cfa37a7b 2004-04-10 devnull .IR setmalloctag ,
123 cfa37a7b 2004-04-10 devnull .IR getmalloctag ,
124 cfa37a7b 2004-04-10 devnull .IR setrealloctag ,
125 cfa37a7b 2004-04-10 devnull and
126 cfa37a7b 2004-04-10 devnull .IR getrealloctag .
127 cfa37a7b 2004-04-10 devnull When allocating blocks directly with
128 cfa37a7b 2004-04-10 devnull .I malloc
129 cfa37a7b 2004-04-10 devnull and
130 cfa37a7b 2004-04-10 devnull .IR realloc ,
131 cfa37a7b 2004-04-10 devnull these tags will be set properly.
132 cfa37a7b 2004-04-10 devnull If a custom allocator wrapper is used,
133 cfa37a7b 2004-04-10 devnull the allocator wrapper can set the tags
134 cfa37a7b 2004-04-10 devnull itself (usually by passing the result of
135 bf8a59fa 2004-04-11 devnull .IR getcallerpc (3)
136 cfa37a7b 2004-04-10 devnull to
137 cfa37a7b 2004-04-10 devnull .IR setmalloctag )
138 cfa37a7b 2004-04-10 devnull to provide more useful information about
139 cfa37a7b 2004-04-10 devnull the source of allocation.
140 cfa37a7b 2004-04-10 devnull .PP
141 cfa37a7b 2004-04-10 devnull .I Malloctopoolblock
142 cfa37a7b 2004-04-10 devnull takes the address of a block returned by
143 cfa37a7b 2004-04-10 devnull .I malloc
144 cfa37a7b 2004-04-10 devnull and returns the address of the corresponding
145 cfa37a7b 2004-04-10 devnull block allocated by the
146 bf8a59fa 2004-04-11 devnull .IR pool (3)
147 cfa37a7b 2004-04-10 devnull routines.
148 cfa37a7b 2004-04-10 devnull .SH SOURCE
149 cfa37a7b 2004-04-10 devnull .B /sys/src/libc/port/malloc.c
150 cfa37a7b 2004-04-10 devnull .SH SEE ALSO
151 cfa37a7b 2004-04-10 devnull .IR leak (1),
152 cfa37a7b 2004-04-10 devnull .I trump
153 cfa37a7b 2004-04-10 devnull (in
154 cfa37a7b 2004-04-10 devnull .IR acid (1)),
155 bf8a59fa 2004-04-11 devnull .IR brk (3),
156 bf8a59fa 2004-04-11 devnull .IR getcallerpc (3),
157 bf8a59fa 2004-04-11 devnull .IR pool (3)
158 cfa37a7b 2004-04-10 devnull .SH DIAGNOSTICS
159 cfa37a7b 2004-04-10 devnull .I Malloc, realloc
160 cfa37a7b 2004-04-10 devnull and
161 cfa37a7b 2004-04-10 devnull .I calloc
162 cfa37a7b 2004-04-10 devnull return 0 if there is no available memory.
163 cfa37a7b 2004-04-10 devnull .I Errstr
164 cfa37a7b 2004-04-10 devnull is likely to be set.
165 cfa37a7b 2004-04-10 devnull If the allocated blocks have no malloc or realloc tags,
166 cfa37a7b 2004-04-10 devnull .I getmalloctag
167 cfa37a7b 2004-04-10 devnull and
168 cfa37a7b 2004-04-10 devnull .I getrealloctag
169 cfa37a7b 2004-04-10 devnull return
170 cfa37a7b 2004-04-10 devnull .BR ~0 .
171 cfa37a7b 2004-04-10 devnull .PP
172 cfa37a7b 2004-04-10 devnull After including
173 cfa37a7b 2004-04-10 devnull .BR pool.h ,
174 cfa37a7b 2004-04-10 devnull the call
175 cfa37a7b 2004-04-10 devnull .B poolcheck(mainmem)
176 cfa37a7b 2004-04-10 devnull can be used to scan the storage arena for inconsistencies
177 cfa37a7b 2004-04-10 devnull such as data written beyond the bounds of allocated blocks.
178 cfa37a7b 2004-04-10 devnull It is often useful to combine this with with setting
179 cfa37a7b 2004-04-10 devnull .EX
180 cfa37a7b 2004-04-10 devnull mainmem->flags |= POOL_NOREUSE;
181 cfa37a7b 2004-04-10 devnull .EE
182 cfa37a7b 2004-04-10 devnull at the beginning of your program.
183 cfa37a7b 2004-04-10 devnull This will cause malloc not to reallocate blocks even
184 cfa37a7b 2004-04-10 devnull once they are freed;
185 cfa37a7b 2004-04-10 devnull .B poolcheck(mainmem)
186 cfa37a7b 2004-04-10 devnull will then detect writes to freed blocks.
187 cfa37a7b 2004-04-10 devnull .PP
188 cfa37a7b 2004-04-10 devnull The
189 cfa37a7b 2004-04-10 devnull .I trump
190 cfa37a7b 2004-04-10 devnull library for
191 cfa37a7b 2004-04-10 devnull .I acid
192 cfa37a7b 2004-04-10 devnull can be used to obtain traces of malloc execution; see
193 cfa37a7b 2004-04-10 devnull .IR acid (1).
194 cfa37a7b 2004-04-10 devnull .SH BUGS
195 cfa37a7b 2004-04-10 devnull The different specification of
196 cfa37a7b 2004-04-10 devnull .I calloc
197 cfa37a7b 2004-04-10 devnull is bizarre.
198 cfa37a7b 2004-04-10 devnull .PP
199 cfa37a7b 2004-04-10 devnull User errors can corrupt the storage arena.
200 cfa37a7b 2004-04-10 devnull The most common gaffes are (1) freeing an already freed block,
201 bf8a59fa 2004-04-11 devnull (3) storing beyond the bounds of an allocated block, and (3)
202 cfa37a7b 2004-04-10 devnull freeing data that was not obtained from the allocator.
203 cfa37a7b 2004-04-10 devnull When
204 cfa37a7b 2004-04-10 devnull .I malloc
205 cfa37a7b 2004-04-10 devnull and
206 cfa37a7b 2004-04-10 devnull .I free
207 cfa37a7b 2004-04-10 devnull detect such corruption, they abort.