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