1.fp 5 CW
2.de MW
3\f5\\$1\fP
4..
5.TH VMALLOC 3 "1 May 1998"
6.SH NAME
7vmalloc \- virtual memory allocation
8.SH SYNOPSIS
9.MW "#include <vmalloc.h>"
10.SS Regions
11.nf
12.MW "Vmalloc_t* vmopen(Vmdisc_t* disc, Vmethod_t* meth, int flags);"
13.MW "int vmclose(Vmalloc_t*);"
14.MW "int vmclear(Vmalloc_t*);"
15.MW "int vmcompact(Vmalloc_t* region);"
16.MW "int vmset(Vmalloc_t* region, int flags, int type);"
17.MW "Vmalloc_t* Vmheap;"
18.MW "Vmdisc_t* vmdisc(Vmalloc_t* region, Vmdisc_t* disc);"
19.MW "Vmalloc_t* vmmopen(char* file, Void_t* base, size_t round);"
20.MW "Void_t* vmmset(Vmalloc_t* vm, int key, Void_t* data, int set);"
21.fi
22.SS "Allocation functions"
23.nf
24.MW "Void_t* vmalloc(Vmalloc_t* region, size_t size);"
25.MW "Void_t* vmalign(Vmalloc_t* region, size_t size, size_t align);"
26.MW "Void_t* vmresize(Vmalloc_t* region, Void_t* addr, size_t size, int type);"
27.MW "int vmfree(Vmalloc_t* region, Void_t* addr);"
28.MW "Void_t* vmnewof(Vmalloc_t* region, Void_t* addr, type, size_t n, size_t x);"
29.MW "Void_t* vmoldof(Vmalloc_t* region, Void_t* addr, type, size_t n, size_t x);"
30.MW "Void_t* vmgetmem(Vmalloc_t* region, Void_t* addr, size_t size);"
31.fi
32.SS "Debugging"
33.nf
34.MW "int vmdebug(int);"
35.MW "int vmdbcheck(Vmalloc_t* vm);"
36.MW "int vmdbwatch(Void_t* addr);"
37.MW "static void vmdbwarn(Vmalloc_t*, char* mesg, int n);"
38.fi
39.SS "Profiling"
40.nf
41.MW "void vmprofile(Vmalloc_t* vm, int fd);"
42.fi
43.SS "Information and statistics"
44.nf
45.MW "Vmalloc_t* vmregion(Void_t* addr);"
46.MW "Void_t* vmsegment(Vmalloc_t* region, Void_t* addr);"
47.MW "int vmwalk(Vmalloc_t* region, int(*walkf)(Vmalloc_t*, Void_t*, size_t, size_t, Vmdisc_t*, Void_t*), Void_t* handle);"
48.MW "long vmaddr(Vmalloc_t* region, Void_t* addr);"
49.MW "long vmsize(Vmalloc_t* region, Void_t* addr);"
50.MW "int vmstat(Vmalloc_t* vm, Vmstat_t* statb);"
51.MW "int vmtrace(int fd);"
52.MW "int vmtrbusy(Vmalloc_t* vm);"
53.fi
54.SS "Malloc-compatible functions"
55.nf
56.MW "Void_t* malloc(size_t size);"
57.MW "Void_t* realloc(Void_t* addr, size_t size);"
58.MW "Void_t* calloc(size_t n_obj, size_t s_obj);"
59.MW "int cfree(Void_t* addr);"
60.MW "void free(Void_t* addr);"
61.MW "Void_t* memalign(size_t align, size_t size);"
62.MW "Void_t* valloc(size_t size);"
63.fi
64.SH DESCRIPTION
65These functions for dynamic storage allocation work in
66\fIregions\fP of memory.
67Each region has an \fIallocation method\fP
68for parceling out blocks of storage and a
69\fImemory discipline\fP for obtaining raw space.
70Automatic locking prevents interference by reentrant
71access to a region.
72.PP
73Pointers to space have type \f5Void_t*\fP
74where \f5Void_t\fP is \f5#define\fPd as \f5void\fP if possible, otherwise \f5char\fP.
75Space is counted in type \f5size_t\fP.
76
77.ne 4
78.SS Regions
79Regions have type \f5Vmalloc_t\fP.
80Two predefined regions are pointed to by:
81.TP
82.MW Vmheap
83A general-purpose region, with best-fit
84allocation, and Unix memory discipline \f5Vmdcsbrk\fP.
85.PP
86These functions manipulate regions:
87.PP
88.I vmopen
89creates a region with memory discipline \fIdisc\fP,
90allocation method \fImeth\fP,
91and a setting for control \fIflags\fP.
92It returns a pointer to the region on success and \f5NULL\fP on failure.
93The flags, represented by bit values or-ed together, are:
94.TP
95.MW VM_TRUST
96Disable locking and consistency checks, except under method \f5Vmdebug\fP.
97.TP
98.MW VM_TRACE
99Place tracing messages for each allocation event
100on the tracing file established by \fIvmtrace\fP.
101This turns off \f5VM_TRUST\fP.
102.TP
103\f5VM_DBCHECK\fP, \f5VM_DBABORT\fP
104.br
105See \fBDebugging\fP below.
106.PP
107.I vmclose
108closes a \fIregion\fP and releases all associated memory
109according to the region's discipline.
110The first segment obtained from the discipline's
111\f5memoryf\fP function (see `Disciplines' below) will be the last released.
112\fIvmclose\fP returns \-1 on failure and a non-negative value otherwise.
113.PP
114.I vmclear
115frees all allocated blocks in \fIregion\fP regardless of methods.
116It returns \-1 on failure and a non-negative value otherwise.
117.PP
118.I vmcompact
119releases as much of a \fIregion\fP's
120free space to its discipline's \f5memoryf\fP
121function as possible.
122It returns a nonnegative value on success and \-1 on failure.
123.PP
124.I vmset
125adjusts and queries a \fIregion\fP's \fIflags\fP.
126The indicated flags are turned on if \fItype\fP is nonzero, off if zero.
127\fIvmset\fP returns the previous value of all flags.
128Thus, \f5vmset(region,0,0)\fP queries the flags without changing them.
129In addition to the settable flags, one of
130\f5VM_MTBEST\fP, \f5VM_MTDEBUG\fP, \f5VM_MTPROFILE\fP,
131\f5VM_MTPOOL\fP, or \f5VM_MTLAST\fP
132is returned to indicate the method used in creating the \fIregion\fP.
133.PP
134.I vmdisc
135changes the discipline of \fIregion\fP to the given new discipline
136\fIdisc\fP if \fIdisc\fP is not \f5NULL\fP and its \f5memoryf\fP function
137is the same as the current discipline. If the current discipline
138has an \f5exceptf\fP function, it will be called with event \f5VM_DISC\fP.
139This function always returns the current discipline.
140.PP
141.I vmmopen
142creates a region to allocate memory given by the system call \fImmap(2)\fP.
143The given \fIfile\fP is the backing store for the map.
144If \fIbase\fP is not \f5NULL\fP, it is the address to map the data to.
145The \fIround\fP argument asserts that the size of the region is always
146a multiple of this value. However, note that \fIvmmopen\fP has
147an internally defined minimum round value (typically 64K) which may be
148used if the given value is too small.
149.PP
150.I vmmset
151sets a \fIdata\fP value associated with a \fIkey\fP if \f5set\fP is non-zero.
152In this case, it returns the current data (before setting)
153if \fIkey\fP is previously set; otherwise, it returns the new \fIdata\fP value.
154If the argument \fIset\fP is zero,
155the call returns the current data value associated with \fIkey\fP, if any.
156
157.SS "Allocation functions"
158.I vmalloc
159returns a pointer to a block of the requested \fIsize\fP
160in a \fIregion\fP, aligned to the \fIstrictest alignment\fP
161that is suitable for the needs of any basic data type.
162It returns \f5NULL\fP on failure.
163.PP
164.I vmalign
165works like \fIvmalloc\fP, but returns a block aligned to a common
166multiple of \fIalign\fP and the \fIstrictest alignment\fP.
167.PP
168.I vmresize
169attempts to change the length of the block pointed to by
170\fIaddr\fP to the specified \fIsize\fP.
171If that is impossible and \fItype\fP has
172at least one of \f5VM_RSMOVE\fP and \f5VM_RSCOPY\fP,
173a new block is allocated and the old block is freed.
174The bit \f5VM_RSCOPY\fP also causes
175the new block to be initialized with
176as much of the old contents as will fit.
177When a resized block gets larger, the new space will be cleared
178if \fItype\fP has the bit \f5VM_RSZERO\fP.
179\fIvmresize\fP
180returns a pointer to the final block, or \f5NULL\fP on failure.
181If \fIaddr\fP is \f5NULL\fP, \fIvmresize\fP behaves like \fIvmalloc\fP;
182otherwise, if \fIsize\fP is 0, it behaves like \fIvmfree\fP.
183.PP
184.I vmfree
185makes the currently allocated block pointed to by
186\fIaddr\fP available for future allocations in its \fIregion\fP.
187If \fIaddr\fP is \f5NULL\fP, \fIvmfree\fP does nothing.
188It returns \-1 on error, and nonnegative otherwise.
189.PP
190.I vmnewof
191is a macro function that attempts to change the length of
192the block pointed to by \fIaddr\fP to the size \f5n*sizeof(type)+x\fP.
193If the block is moved, new space will be initialized with as much of the
194old content as will fit.
195Additional space will be set to zero.
196.PP
197.I vmoldof
198is similar to \fIvmnewof\fP but it neither copies data nor clears space.
199.PP
200.I vmgetmem
201provides a handy function to creat/close regions and allocate/free memory
202based on chunks of memory obtained from the heap region \fIVmheap\fP.
203.TP
204.MW "vmgetmem(0,0,0)"
205This call opens a new region.
206.TP
207.MW "vmgetmem(region, 0, 0)"
208This call closes the given \f5region\fP.
209.TP
210.MW "vmgetmem(region,0,n)"
211This call allocates a block of length \f5n\fP and clears it to zeros.
212.TP
213.MW "vmgetmem(region,p,0)"
214This call frees the block \f5p\fP.
215.TP
216.MW "vmgetmem(region,p,n)"
217This call resizes the block \f5p\fP to length \f5n\fP
218and clears the new memory to zeros if the block grows.
219The block may be moved as deemed necessary by the allocator.
220.PP
221.SS "Memory disciplines"
222Memory disciplines have type \f5Vmdisc_t\fP,
223a structure with these members:
224.in +.5i
225.nf
226.MW "Void_t* (*memoryf)(Vmalloc_t *region, Void_t* obj,"
227.ti +.5i
228.MW "size_t csz, size_t nsz, Vmdisc_t *disc);"
229.MW "int (*exceptf)(Vmalloc_t *region, int type, Void_t* obj, Vmdisc_t *disc);"
230.MW "int round;"
231.fi
232.in -.5i
233.TP
234.MW round 
235If this value is positive, all size arguments to the
236\f5memoryf\fP function will be multiples of it.
237.TP
238.MW memoryf
239Points to a function to get or release segments of space for the
240\fIregion\fP.
241.TP
242.MW exceptf
243If this pointer is not \f5NULL\fP,
244the function it points to is called to announce
245events in a \fIregion\fP.
246.PP
247There are two standard disciplines.
248In both,
249\f5round\fP is 0, and \f5exceptf\fP is \f5NULL\fP.
250.TP
251.MW Vmdcsbrk
252A discipline whose \f5memoryf\fP function gets space from \fIsbrk\fP(2).
253.br
254.ns
255.TP
256.MW Vmdcheap
257A discipline whose \f5memoryf\fP function gets space from the region \f5Vmheap\fP.
258A region with \f5Vmdcheap\fP discipline and \f5Vmlast\fP
259allocation is good for building throwaway data structures.
260.PP
261A \fImemoryf\fP
262function returns a pointer to a memory segment on success, and \f5NULL\fP on failure.
263If \fIcsz\fP is 0, the function returns a new segment of size \fInsz\fP.
264Otherwise, the function attempts to change the length of the segment
265pointed to by \fIaddr\fP from \fIcsz\fP to \fInsz\fP.
266If this is successful, \f5memoryf\fP should return \fIaddr\fP (even if \fInsz\fP is 0).
267.PP
268An \fIexceptf\fP
269function is called for events identified by \fItype\fP, which is coded thus:
270.TP
271.MW VM_OPEN
272A new region is being opened.
273If \fIexceptf\fP returns a zero value, the region opening proceeds normally.
274A negative return value causes \fIvmopen\fP to terminate with failure.
275A positive return value indicates that the new region is to manipulate memory
276already initialized by a previous \fIvmopen\fP call
277(perhaps by a different process on persistent or shared memory).
278In this case, the argument \f5(Void_t**)\fP\fIobj\fP should
279return the initial segment (which is of type \f5(Void_t*)\fP).
280\fIvmopen\fP will return failure if this segment is not returned or if it
281has not been properly initialized.
282.TP
283.MW VM_CLOSE
284The region is being closed.
285The return value of \f5exceptf\fP is significant as follows.
286If negative, \fIvmclose\fP immediately returns with failure.
287If zero, \fIvmclose\fP proceeds normally by calling \f5memoryf\fP to free
288all allocated memory segments and also freeing the region itself.
289Finally, if positive, \fIvmclose\fP will only free the region
290without deallocating the allocated segments.
291.TP
292.MW VM_NOMEM
293An attempt to extend the region by the amount
294\f5(size_t)\fP\fIobj\fP failed. The region is unlocked, so the
295\fIexceptf\fP function may free blocks.
296If the function returns a positive value the memory
297request will be repeated.
298If zero, the allocation method
299will again invoke \fImemoryf\fP to get space.
300If negative, the allocation request will fail.
301.TP
302.MW VM_BADADDR
303Address \fIobj\fP, given to \fIvmfree\fP or \fIvmresize\fP,
304does not point to an allocated block from the region.
305The respective call will fail.
306.TP
307.MW VM_ALLOC
308Announce that a memory allocation request is finished and returning.
309.TP
310.MW VM_FREE
311Announce that a memory freeing request is finished and returning.
312.TP
313.MW VM_RESIZE
314Announce that a memory resizing request is finished and returning.
315
316.SS "Allocation methods"
317There are five methods, of type \f5Vmethod_t*\fP:
318.TP
319.MW Vmbest
320An approximately best-fit allocation strategy.
321.TP
322.MW Vmlast
323A strategy for building structures that are only deleted in whole.
324Only the latest allocated block can be freed.
325This means that as soon as a block \f5a\fP is allocated,
326\fIvmfree\fP calls on blocks other than \c5a\fP are ignored.
327.TP
328.MW Vmpool
329A strategy for blocks of one size,
330set by the first \fIvmalloc\fP call after \fIvmopen\fP or \fIvmclear\fP.
331.TP
332.MW Vmdebug
333An allocation strategy with extra-stringent checking and locking
334regardless of the \f5VM_TRUST\fP flag.
335It is useful for finding misuses of dynamically allocated
336memory, such as writing beyond the boundary of a block, or
337freeing a block twice.
338.ne 3
339.TP
340.MW Vmprofile
341An allocation method that records and prints summaries of memory usage.
342
343.SS Debugging
344The method \f5Vmdebug\fP is used to debug common memory violation problems.
345When a problem is found,
346a warning message is written to file descriptor 2 (standard error).
347In addition, if flag \f5VM_DBABORT\fP is on,
348the program is terminated by calling \fIabort\fP(2).
349Each message is a line of self-explanatory fields separated by colons.
350The optional flag \f5-DVMFL\fP, if used during compilation,
351enables recording of file names and line numbers.
352The following functions work with method \f5Vmdebug\fP.
353.PP
354.I vmdebug
355resets the file descriptor to write out warnings to the given argument.
356By default, this file descriptor is 2, the standard error.
357\fIvmdebug\fP returns the previous file descriptor.
358.PP
359.I vmdbcheck
360checks a region using \f5Vmdebug\fP or \f5Vmbest\fP for integrity.
361If \f5Vmdebug\fP, this also checks for block overwriting errors.
362On errors, \fIvmdbwarn\fP is called.
363If flag \f5VM_DBCHECK\fP is on, 
364\fIvmdbcheck\fP is called at each invocation of
365\fIvmalloc\fP, \fIvmfree\fP, or \fIvmresize\fP.
366.PP
367.I vmdbwatch
368causes address \fIaddr\fP
369to be watched, and reported whenever met in
370\fIvmalloc\fP, \fIvmresize\fP or \fIvmfree\fP.
371The watch list has finite size and if it becomes full,
372watches will be removed in a first-in-first-out fashion.
373If \fIaddr\fP is \f5NULL\fP,
374all current watches are canceled.
375\fIvmdbwatch\fP returns the watch bumped out due to an insertion
376into a full list or \f5NULL\fP otherwise.
377.PP
378.I vmdbwarn
379is an internal function that processes
380warning messages for discovered errors.
381It can't be called from outside the \fIvmalloc\fP package,
382but is a good place to plant debugger traps because
383control goes there at every trouble.
384
385.SS "Profiling"
386The method \f5Vmprofile\fP is used to profile memory usage.
387Profiling data are maintained in private memory of a process so
388\f5Vmprofile\fP should be avoided from regions manipulating
389persistent or shared memory.
390The optional flag \f5-DVMFL\fP, if used during compilation,
391enables recording of file names and line numbers.
392.PP
393.I vmprofile
394prints memory usage summary.
395The summary is restricted to region \fIvm\fP if \fIvm\fP is not \f5NULL\fP;
396otherwise, it is for all regions created with \f5Vmprofile\fP.
397Summary records are written to file descriptor \fIfd\fP as lines with
398colon-separated fields. Here are some of the fields:
399.TP
400.I n_alloc,n_free:
401Number of allocation and free calls respectively. Note that a resize
402operation is coded as a free and an allocation.
403.TP
404.I s_alloc,s_free:
405Total amounts allocated and freed. The difference between these numbers
406is the amount of space not yet freed.
407.TP
408.I max_busy, extent:
409These fields are only with the summary record for region.
410They show the maximum busy space at any time and the extent of the region.
411
412.SS "Information and statistics"
413.I vmregion
414returns the region to which the block pointed to by
415\fIaddr\fP belongs.
416This works only in regions that allocate with
417\f5Vmbest\fP, \f5Vmdebug\fP or \f5Vmprofile\fP.
418If multiple regions manipulate the same segment of memory,
419\fIvmregion\fP returns the region that causes the creation that memory segment.
420.PP
421.I vmsegment
422finds if some segment of memory in \fIregion\fP
423contains the address \fIaddr\fP.
424It returns the address of a found segment or \f5NULL\fP if none found.
425.PP
426.I vmwalk
427walks all segments in \fIregion\fP or if \fIregion\fP is \f5NULL\fP,
428all segments in all regions.
429At each segment, \fI(*walkf)(vm,addr,size,segno,disc,handle)\fP
430is called where \fIvm\fP is the region, \fIaddr\fP is the segment,
431\fIsize\fP is the size of the segment, \fIsegno\fP is the segment ordinal counting from 0,
432\fIdisc\fP is the region's discipline, and \fIhandle\fP is the user supplied \fIvmwalk\fP handle.
433If \fIwalkf\fP returns a negative value, the walk stops and returns the same value.
434On success, \fIvmwalk\fP returns 0; otherwise, it returns \-1.
435.PP
436.I vmaddr
437checks whether \fIaddr\fP
438points to an address within some allocated block of the given region.
439If not, it returns \-1.
440If so, it returns the offset from the beginning of the block.
441The function does not work for a \f5Vmlast\fP region except
442on the latest allocated block.
443.PP
444.I vmsize
445returns the size of the allocated block pointed to by \fIaddr\fP.
446It returns \-1 if \fIaddr\fP
447does not point to a valid block in the region.
448Sizes may be padded beyond that requested; in
449particular no block has size 0.
450The function does not work for a \f5Vmlast\fP region except
451on the latest allocated block.
452.PP
453.I vmstat
454gathers statistics on the given \fIregion\fP and returns that
455information in the \f5Vmstat_t\fP structure pointed to by \fIstatb\fP.
456A \f5Vmstat_t\fP structure has at least these members:
457.in +.5i
458.nf
459.ta \w'\f5size_t  \fP'u +\w'\f5extent    \fP'u
460.MW "int	n_busy;	/* number of busy blocks */
461.MW "int	n_free;	/* number of free blocks */
462.MW "size_t	s_busy;	/* total busy space */
463.MW "size_t	s_free;	/* total free space */
464.MW "size_t	m_busy;	/* maximum size of busy block */
465.MW "size_t	m_free;	/* maximum size of free block */
466.MW "int	n_seg;	/* number of segments in region */
467.MW "size_t	extent;	/* total size of the region */
468.fi
469.in -.5i
470.PP
471Bookeeping overhead is counted in \f5extent\fP,
472but not in \f5s_busy\fP or \f5s_free\fP.
473.PP
474.I vmtrace
475establishes file descriptor \fIfd\fP
476as the trace file and returns
477the previous value of the trace file descriptor.
478The trace descriptor is initially invalid.
479Output is sent to the trace file by successful allocation
480events when flag \f5VM_TRACE\fP is on.
481.PP
482Tools for analyzing traces are described in \fImtreplay\fP(1).
483The trace record for an allocation event
484is a line with colon-separated fields, four numbers and one string.
485.TP
486.I old
487Zero for a fresh allocation;
488the address argument for freeing and resizing.
489.TP
490.I new
491Zero for freeing;
492the address returned by allocation or resizing.
493.TP
494.I size
495The size argument for allocation or resizing;
496the size freed by freeing.
497Sizes may differ due to padding for alignment.
498.TP
499.I region
500The address of the affected region.
501.TP
502.I method
503A string that tells the region's method:
504\f5best\fP, \f5last\fP, \f5pool\fP, \f5profile\fP, or \f5debug\fP.
505.PP
506.I vmtrbusy
507outputs a trace of all currently busy blocks in region \f5vm\fP.
508This only works with the \f5Vmbest\fP, \f5Vmdebug\fP and \f5Vmprofile\fP methods.
509
510.SS "Malloc-compatible functions"
511Functions in this set provide the behaviors of \fImalloc\fP(3).
512The functions
513\fImemalign\fP and \fIvalloc\fP allocate aligned blocks;
514\fIvalloc\fP further restricts alignment to page boundaries.
515.PP
516The \fImalloc\fP functions are instrumented for run-time debugging,
517profiling and tracing.
518When these modes are enabled, time and space performance will be affected.
519For accurate reporting of files and line numbers,
520code should include \f5vmalloc.h\fP and compile with either \f5-DVMFL\fP
521or \f5-D_BLD_debug\fP (defined by \fBnmake\fP(1) for \f5-g\fP compilations).
522The
523.I VMALLOC_OPTIONS
524environment variable should be set before any memory allocation
525(e.g., before a process starts). Its value is a space-separated list of
526[\fBno\fP]\fIname\fP[=\fIvalue\fP] options that control runtime
527debugging/profiling and other modes:
528.TP
529.B abort
530If Vmregion==Vmdebug then VM_DBABORT is set, otherwise _BLD_debug
531enabled assertions abort() on failure.
532.TP
533.B check
534If Vmregion==Vmbest then the region is checked after every operation.
535.TP
536.BI method =method
537Sets Vmregion=\fImethod\fP if not already set.
538.I method
539(\fBVm\fP prefix optional) may be one of:
540.RS
541.TP
542.B best
543.TP
544.B debug
545.TP
546.B last
547.TP
548.B profile
549.RE
550.TP
551.B mmap
552Prefer mmap() over brk() for region allocation.
553.TP
554.BI period =n
555Sets Vmregion=Vmdebug if not already set. If Vmregion==Vmdebug then
556the region is checked every \fIn\fP operations.
557.TP
558.BI profile =file
559Sets Vmregion=Vmprofile if not already set. If Vmregion==Vmprofile then
560profile info is printed to \fIfile\fP.
561.TP
562.B region
563If Vmregion==Vmbest then region block frees verify
564that the block belongs to the region.
565.BI start =n
566Sets Vmregion=Vmdebug if not already set. If Vmregion==Vmdebug then
567region checking starts after \fIn\fP operations.
568.TP
569.BI trace =file
570Operation trace info is printed to \fIfile\fP.
571.TP
572.BI warn =file
573Sets Vmregion=Vmdebug if not already set. If Vmregion==Vmdebug then
574warnings are printed to \fIfile\fP.
575.TP
576.BI watch =address
577Sets Vmregion=Vmdebug if not already set. If Vmregion==Vmdebug then
578operations on \fIaddress\fP are traced.
579.PP
580Output files are created if they don't exist.
581.BI & n
582and
583.BI /dev/fd/ n
584name the file descriptor
585.I n
586which must be open for writing. The pattern
587.B %p
588in a file name is replaced by the current process ID.
589.I VMALLOC_OPTIONS
590combines the features of these previously used env vars {
591.I "VMDEBUG VMETHOD VMPROFILE VMTRACE"
592}.
593For compatibility, if
594.I VMALLOC_OPTIONS
595is not defined, then {
596.I "VMDEBUG VMETHOD VMPROFILE VMTRACE"
597} will be checked -- this will be dropped in a future release.
598
599.SH RECENT CHANGES
600\f5Vmlast\fP: allocated blocks are now allowed to be resized (1998-09).
601\fIVMALLOC_OPTIONS\fP now controls all runtime settings (2010-01).
602
603.SH SEE ALSO
604\fImtreplay\fP(1), \fImalloc\fP(3).
605
606.SH AUTHOR
607Kiem-Phong Vo, kpv@research.att.com
608