xref: /netbsd-src/lib/libc/stdlib/jemalloc.3 (revision e6fc3c59c272d6e246cabdc301f9e2b14feae7f8)
1*e6fc3c59Suwe.\" $NetBSD: jemalloc.3,v 1.12 2022/12/04 01:29:32 uwe Exp $
226e9ae25Sjruoho.\"
326e9ae25Sjruoho.\" Copyright (c) 1980, 1991, 1993
426e9ae25Sjruoho.\"	The Regents of the University of California.  All rights reserved.
526e9ae25Sjruoho.\"
626e9ae25Sjruoho.\" This code is derived from software contributed to Berkeley by
726e9ae25Sjruoho.\" the American National Standards Committee X3, on Information
826e9ae25Sjruoho.\" Processing Systems.
926e9ae25Sjruoho.\"
1026e9ae25Sjruoho.\" Redistribution and use in source and binary forms, with or without
1126e9ae25Sjruoho.\" modification, are permitted provided that the following conditions
1226e9ae25Sjruoho.\" are met:
1326e9ae25Sjruoho.\" 1. Redistributions of source code must retain the above copyright
1426e9ae25Sjruoho.\"    notice, this list of conditions and the following disclaimer.
1526e9ae25Sjruoho.\" 2. Redistributions in binary form must reproduce the above copyright
1626e9ae25Sjruoho.\"    notice, this list of conditions and the following disclaimer in the
1726e9ae25Sjruoho.\"    documentation and/or other materials provided with the distribution.
1826e9ae25Sjruoho.\" 3. Neither the name of the University nor the names of its contributors
1926e9ae25Sjruoho.\"    may be used to endorse or promote products derived from this software
2026e9ae25Sjruoho.\"    without specific prior written permission.
2126e9ae25Sjruoho.\"
2226e9ae25Sjruoho.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2326e9ae25Sjruoho.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2426e9ae25Sjruoho.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2526e9ae25Sjruoho.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2626e9ae25Sjruoho.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2726e9ae25Sjruoho.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2826e9ae25Sjruoho.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2926e9ae25Sjruoho.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3026e9ae25Sjruoho.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3126e9ae25Sjruoho.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3226e9ae25Sjruoho.\" SUCH DAMAGE.
3326e9ae25Sjruoho.\"
3426e9ae25Sjruoho.\"     @(#)malloc.3	8.1 (Berkeley) 6/4/93
3526e9ae25Sjruoho.\" $FreeBSD: src/lib/libc/stdlib/malloc.3,v 1.73 2007/06/15 22:32:33 jasone Exp $
3626e9ae25Sjruoho.\"
37706138d7Sjruoho.Dd June 21, 2011
3826e9ae25Sjruoho.Dt JEMALLOC 3
39463c1a0cSnjoly.Os
4026e9ae25Sjruoho.Sh NAME
413996dac1Sabhinav.Nm jemalloc ,
423996dac1Sabhinav.Nm malloc.conf
4326e9ae25Sjruoho.Nd the default system allocator
4460d71be7Sjruoho.Sh LIBRARY
4560d71be7Sjruoho.Lb libc
4660d71be7Sjruoho.Sh SYNOPSIS
4726a87898Sjruoho.Ft const char *
4860d71be7Sjruoho.Va _malloc_options ;
4926e9ae25Sjruoho.Sh DESCRIPTION
5026e9ae25SjruohoThe
5126e9ae25Sjruoho.Nm
5226e9ae25Sjruohois a general-purpose concurrent
5326e9ae25Sjruoho.Xr malloc 3
5426e9ae25Sjruohoimplementation specifically designed to be scalable
5526e9ae25Sjruohoon modern multi-processor systems.
5626e9ae25SjruohoIt is the default user space system allocator in
5726e9ae25Sjruoho.Nx .
580e2d5f4dSjruoho.Pp
5926e9ae25SjruohoWhen the first call is made to one of the memory allocation
6026e9ae25Sjruohoroutines such as
6126e9ae25Sjruoho.Fn malloc
6226e9ae25Sjruohoor
6326e9ae25Sjruoho.Fn realloc ,
6426e9ae25Sjruohovarious flags that affect the workings of the allocator are set or reset.
6526e9ae25SjruohoThese are described below.
6626e9ae25Sjruoho.Pp
6726e9ae25SjruohoThe
6826e9ae25Sjruoho.Dq name
6926e9ae25Sjruohoof the file referenced by the symbolic link named
7026e9ae25Sjruoho.Pa /etc/malloc.conf ,
7126e9ae25Sjruohothe value of the environment variable
7226e9ae25Sjruoho.Ev MALLOC_OPTIONS ,
7326e9ae25Sjruohoand the string pointed to by the global variable
7426e9ae25Sjruoho.Va _malloc_options
7526e9ae25Sjruohowill be interpreted, in that order, character by character as flags.
7626e9ae25Sjruoho.Pp
7726e9ae25SjruohoMost flags are single letters.
7826e9ae25SjruohoUppercase letters indicate that the behavior is set, or on,
7926e9ae25Sjruohoand lowercase letters mean that the behavior is not set, or off.
8026e9ae25SjruohoThe following options are available.
8126e9ae25Sjruoho.Bl -tag -width "A   " -offset 3n
8226e9ae25Sjruoho.It Em A
8326e9ae25SjruohoAll warnings (except for the warning about unknown
8426e9ae25Sjruohoflags being set) become fatal.
8526e9ae25SjruohoThe process will call
8626e9ae25Sjruoho.Xr abort 3
8726e9ae25Sjruohoin these cases.
8826e9ae25Sjruoho.It Em H
8926e9ae25SjruohoUse
9026e9ae25Sjruoho.Xr madvise 2
9126e9ae25Sjruohowhen pages within a chunk are no longer in use, but the chunk as a whole cannot
9226e9ae25Sjruohoyet be deallocated.
9326e9ae25SjruohoThis is primarily of use when swapping is a real possibility, due to the high
9426e9ae25Sjruohooverhead of the
9526e9ae25Sjruoho.Fn madvise
9626e9ae25Sjruohosystem call.
9726e9ae25Sjruoho.It Em J
9826e9ae25SjruohoEach byte of new memory allocated by
9926e9ae25Sjruoho.Fn malloc ,
10026e9ae25Sjruoho.Fn realloc
10126e9ae25Sjruohowill be initialized to 0xa5.
10226e9ae25SjruohoAll memory returned by
10326e9ae25Sjruoho.Fn free ,
10426e9ae25Sjruoho.Fn realloc
10526e9ae25Sjruohowill be initialized to 0x5a.
10626e9ae25SjruohoThis is intended for debugging and will impact performance negatively.
10726e9ae25Sjruoho.It Em K
10826e9ae25SjruohoIncrease/decrease the virtual memory chunk size by a factor of two.
10926e9ae25SjruohoThe default chunk size is 1 MB.
11026e9ae25SjruohoThis option can be specified multiple times.
11126e9ae25Sjruoho.It Em N
11226e9ae25SjruohoIncrease/decrease the number of arenas by a factor of two.
11326e9ae25SjruohoThe default number of arenas is four times the number of CPUs, or one if there
11426e9ae25Sjruohois a single CPU.
11526e9ae25SjruohoThis option can be specified multiple times.
11626e9ae25Sjruoho.It Em P
11726e9ae25SjruohoVarious statistics are printed at program exit via an
11826e9ae25Sjruoho.Xr atexit 3
11926e9ae25Sjruohofunction.
12026e9ae25SjruohoThis has the potential to cause deadlock for a multi-threaded process that exits
12126e9ae25Sjruohowhile one or more threads are executing in the memory allocation functions.
12226e9ae25SjruohoTherefore, this option should only be used with care; it is primarily intended
12326e9ae25Sjruohoas a performance tuning aid during application development.
12426e9ae25Sjruoho.It Em Q
12526e9ae25SjruohoIncrease/decrease the size of the allocation quantum by a factor of two.
12626e9ae25SjruohoThe default quantum is the minimum allowed by the architecture (typically 8 or
12726e9ae25Sjruoho16 bytes).
12826e9ae25SjruohoThis option can be specified multiple times.
12926e9ae25Sjruoho.It Em S
13026e9ae25SjruohoIncrease/decrease the size of the maximum size class that is a multiple of the
13126e9ae25Sjruohoquantum by a factor of two.
13226e9ae25SjruohoAbove this size, power-of-two spacing is used for size classes.
13326e9ae25SjruohoThe default value is 512 bytes.
13426e9ae25SjruohoThis option can be specified multiple times.
13526e9ae25Sjruoho.It Em U
13626e9ae25SjruohoGenerate
13726e9ae25Sjruoho.Dq utrace
13826e9ae25Sjruohoentries for
13926e9ae25Sjruoho.Xr ktrace 1 ,
14026e9ae25Sjruohofor all operations.
14126e9ae25SjruohoConsult the source for details on this option.
14226e9ae25Sjruoho.It Em V
14326e9ae25SjruohoAttempting to allocate zero bytes will return a
14426e9ae25Sjruoho.Dv NULL
14526e9ae25Sjruohopointer instead of a valid pointer.
14626e9ae25Sjruoho(The default behavior is to make a minimal allocation and return a
14726e9ae25Sjruohopointer to it.)
14826e9ae25SjruohoThis option is provided for System V compatibility.
14926e9ae25SjruohoThis option is incompatible with the
15026e9ae25Sjruoho.Em X
15126e9ae25Sjruohooption.
15226e9ae25Sjruoho.It Em X
15326e9ae25SjruohoRather than return failure for any allocation function,
15426e9ae25Sjruohodisplay a diagnostic message on
15526e9ae25Sjruoho.Dv stderr
15626e9ae25Sjruohoand cause the program to drop
15726e9ae25Sjruohocore (using
15826e9ae25Sjruoho.Xr abort 3 ) .
15926e9ae25SjruohoThis option should be set at compile time by including the following in
16026e9ae25Sjruohothe source code:
16126e9ae25Sjruoho.Bd -literal -offset indent
16226e9ae25Sjruoho_malloc_options = "X";
16326e9ae25Sjruoho.Ed
16426e9ae25Sjruoho.It Em Z
16526e9ae25SjruohoEach byte of new memory allocated by
16626e9ae25Sjruoho.Fn malloc ,
16726e9ae25Sjruoho.Fn realloc
16826e9ae25Sjruohowill be initialized to 0.
16926e9ae25SjruohoNote that this initialization only happens once for each byte, so
17026e9ae25Sjruoho.Fn realloc
17126e9ae25Sjruohodoes not zero memory that was previously allocated.
17226e9ae25SjruohoThis is intended for debugging and will impact performance negatively.
17326e9ae25Sjruoho.El
17426e9ae25Sjruoho.Pp
175706138d7SjruohoExtra care should be taken when enabling
176706138d7Sjruohoany of the options in production environments.
17726e9ae25SjruohoThe
178706138d7Sjruoho.Em A ,
179706138d7Sjruoho.Em J ,
18026e9ae25Sjruohoand
18126e9ae25Sjruoho.Em Z
18226e9ae25Sjruohooptions are intended for testing and debugging.
18326e9ae25SjruohoAn application which changes its behavior when these options are used
18426e9ae25Sjruohois flawed.
18526e9ae25Sjruoho.Sh IMPLEMENTATION NOTES
18626e9ae25SjruohoThe
18726e9ae25Sjruoho.Nm
18826e9ae25Sjruohoallocator uses multiple arenas in order to reduce lock
18926e9ae25Sjruohocontention for threaded programs on multi-processor systems.
19026e9ae25SjruohoThis works well with regard to threading scalability, but incurs some costs.
19126e9ae25SjruohoThere is a small fixed per-arena overhead, and additionally, arenas manage
19226e9ae25Sjruohomemory completely independently of each other, which means a small fixed
19326e9ae25Sjruohoincrease in overall memory fragmentation.
19426e9ae25SjruohoThese overheads are not generally an issue,
19526e9ae25Sjruohogiven the number of arenas normally used.
19626e9ae25SjruohoNote that using substantially more arenas than the default is not likely to
19726e9ae25Sjruohoimprove performance, mainly due to reduced cache performance.
19826e9ae25SjruohoHowever, it may make sense to reduce the number of arenas if an application
19926e9ae25Sjruohodoes not make much use of the allocation functions.
20026e9ae25Sjruoho.Pp
20126e9ae25SjruohoMemory is conceptually broken into equal-sized chunks,
20226e9ae25Sjruohowhere the chunk size is a power of two that is greater than the page size.
20326e9ae25SjruohoChunks are always aligned to multiples of the chunk size.
20426e9ae25SjruohoThis alignment makes it possible to find
20526e9ae25Sjruohometadata for user objects very quickly.
20626e9ae25Sjruoho.Pp
20726e9ae25SjruohoUser objects are broken into three categories according to size:
20826e9ae25Sjruoho.Bl -enum -offset 3n
20926e9ae25Sjruoho.It
21026e9ae25SjruohoSmall objects are smaller than one page.
21126e9ae25Sjruoho.It
21226e9ae25SjruohoLarge objects are smaller than the chunk size.
21326e9ae25Sjruoho.It
21426e9ae25SjruohoHuge objects are a multiple of the chunk size.
21526e9ae25Sjruoho.El
21626e9ae25Sjruoho.Pp
21726e9ae25SjruohoSmall and large objects are managed by arenas; huge objects are managed
21826e9ae25Sjruohoseparately in a single data structure that is shared by all threads.
21926e9ae25SjruohoHuge objects are used by applications infrequently enough that this single
22026e9ae25Sjruohodata structure is not a scalability issue.
22126e9ae25Sjruoho.Pp
22226e9ae25SjruohoEach chunk that is managed by an arena tracks its contents in a page map as
22326e9ae25Sjruohoruns of contiguous pages (unused, backing a set of small objects, or backing
22426e9ae25Sjruohoone large object).
22526e9ae25SjruohoThe combination of chunk alignment and chunk page maps makes it possible to
22626e9ae25Sjruohodetermine all metadata regarding small and large allocations in constant time.
22726e9ae25Sjruoho.Pp
22826e9ae25SjruohoSmall objects are managed in groups by page runs.
22926e9ae25SjruohoEach run maintains a bitmap that tracks which regions are in use.
23026e9ae25SjruohoAllocation requests can be grouped as follows.
23126e9ae25Sjruoho.Bl -bullet -offset 3n
23226e9ae25Sjruoho.It
23326e9ae25SjruohoAllocation requests that are no more than half the quantum (see the
23426e9ae25Sjruoho.Em Q
23526e9ae25Sjruohooption) are rounded up to the nearest power of two (typically 2, 4, or 8).
23626e9ae25Sjruoho.It
23726e9ae25SjruohoAllocation requests that are more than half the quantum, but no more than the
23826e9ae25Sjruohomaximum quantum-multiple size class (see the
23926e9ae25Sjruoho.Em S
24026e9ae25Sjruohooption) are rounded up to the nearest multiple of the quantum.
24126e9ae25Sjruoho.It
24226e9ae25SjruohoAllocation requests that are larger than the maximum quantum-multiple size
24326e9ae25Sjruohoclass, but no larger than one half of a page, are rounded up to the nearest
24426e9ae25Sjruohopower of two.
24526e9ae25Sjruoho.It
24626e9ae25SjruohoAllocation requests that are larger than half of a page, but small enough to
24726e9ae25Sjruohofit in an arena-managed chunk (see the
24826e9ae25Sjruoho.Em K
24926e9ae25Sjruohooption), are rounded up to the nearest run size.
25026e9ae25Sjruoho.It
25126e9ae25SjruohoAllocation requests that are too large to fit in an arena-managed chunk are
25226e9ae25Sjruohorounded up to the nearest multiple of the chunk size.
25326e9ae25Sjruoho.El
25426e9ae25Sjruoho.Pp
25526e9ae25SjruohoAllocations are packed tightly together, which can be an issue for
25626e9ae25Sjruohomulti-threaded applications.
25726e9ae25SjruohoIf you need to assure that allocations do not suffer from cache line sharing,
25826e9ae25Sjruohoround your allocation requests up to the nearest multiple of the cache line
25926e9ae25Sjruohosize.
26026e9ae25Sjruoho.Sh DEBUGGING
26126e9ae25SjruohoThe first thing to do is to set the
26226e9ae25Sjruoho.Em A
26326e9ae25Sjruohooption.
26426e9ae25SjruohoThis option forces a coredump (if possible) at the first sign of trouble,
26526e9ae25Sjruohorather than the normal policy of trying to continue if at all possible.
26626e9ae25Sjruoho.Pp
26726e9ae25SjruohoIt is probably also a good idea to recompile the program with suitable
26826e9ae25Sjruohooptions and symbols for debugger support.
26926e9ae25Sjruoho.Pp
27026e9ae25SjruohoIf the program starts to give unusual results, coredump or generally behave
27126e9ae25Sjruohodifferently without emitting any of the messages mentioned in the next
27226e9ae25Sjruohosection, it is likely because it depends on the storage being filled with
27326e9ae25Sjruohozero bytes.
27426e9ae25SjruohoTry running it with the
27526e9ae25Sjruoho.Em Z
27626e9ae25Sjruohooption set;
27726e9ae25Sjruohoif that improves the situation, this diagnosis has been confirmed.
27826e9ae25SjruohoIf the program still misbehaves,
27926e9ae25Sjruohothe likely problem is accessing memory outside the allocated area.
28026e9ae25Sjruoho.Pp
28126e9ae25SjruohoAlternatively, if the symptoms are not easy to reproduce, setting the
28226e9ae25Sjruoho.Em J
28326e9ae25Sjruohooption may help provoke the problem.
28426e9ae25SjruohoIn truly difficult cases, the
28526e9ae25Sjruoho.Em U
28626e9ae25Sjruohooption, if supported by the kernel, can provide a detailed trace of
28726e9ae25Sjruohoall calls made to these functions.
28826e9ae25Sjruoho.Pp
28926e9ae25SjruohoUnfortunately,
29026e9ae25Sjruoho.Nm
29126e9ae25Sjruohodoes not provide much detail about the problems it detects;
29226e9ae25Sjruohothe performance impact for storing such information would be prohibitive.
29326e9ae25SjruohoThere are a number of allocator implementations available on the Internet
29426e9ae25Sjruohowhich focus on detecting and pinpointing problems by trading performance for
29526e9ae25Sjruohoextra sanity checks and detailed diagnostics.
296ae6b6d07Swiz.Sh ENVIRONMENT
297ae6b6d07SwizThe following environment variables affect the execution of the allocation
298ae6b6d07Swizfunctions:
299ae6b6d07Swiz.Bl -tag -width ".Ev MALLOC_OPTIONS"
300ae6b6d07Swiz.It Ev MALLOC_OPTIONS
301ae6b6d07SwizIf the environment variable
302ae6b6d07Swiz.Ev MALLOC_OPTIONS
303ae6b6d07Swizis set, the characters it contains will be interpreted as flags to the
304ae6b6d07Swizallocation functions.
305ae6b6d07Swiz.El
306ae6b6d07Swiz.Sh EXAMPLES
307ae6b6d07SwizTo dump core whenever a problem occurs:
308ae6b6d07Swiz.Bd -literal -offset indent
309ae6b6d07Swizln -s 'A' /etc/malloc.conf
310ae6b6d07Swiz.Ed
311ae6b6d07Swiz.Pp
312ae6b6d07SwizTo specify in the source that a program does no return value checking
313ae6b6d07Swizon calls to these functions:
314ae6b6d07Swiz.Bd -literal -offset indent
315ae6b6d07Swiz_malloc_options = "X";
316ae6b6d07Swiz.Ed
317*e6fc3c59Suwe.Sh RETURN VALUES
31826e9ae25SjruohoIf any of the memory allocation/deallocation functions detect an error or
31926e9ae25Sjruohowarning condition, a message will be printed to file descriptor
32026e9ae25Sjruoho.Dv STDERR_FILENO .
32126e9ae25SjruohoErrors will result in the process dumping core.
32226e9ae25SjruohoIf the
32326e9ae25Sjruoho.Em A
32426e9ae25Sjruohooption is set, all warnings are treated as errors.
32526e9ae25Sjruoho.Pp
32626a87898Sjruoho.\"
32726a87898Sjruoho.\" XXX: The _malloc_message should be documented
32826a87898Sjruoho.\"	 better in order to be worth mentioning.
32926a87898Sjruoho.\"
33026e9ae25SjruohoThe
33126e9ae25Sjruoho.Va _malloc_message
33226e9ae25Sjruohovariable allows the programmer to override the function which emits
33326e9ae25Sjruohothe text strings forming the errors and warnings if for some reason
33426e9ae25Sjruohothe
33526e9ae25Sjruoho.Dv stderr
33626e9ae25Sjruohofile descriptor is not suitable for this.
33726e9ae25SjruohoPlease note that doing anything which tries to allocate memory in
33826e9ae25Sjruohothis function is likely to result in a crash or deadlock.
33926e9ae25Sjruoho.Pp
34026e9ae25SjruohoAll messages are prefixed by
34126e9ae25Sjruoho.Dq Ao Ar progname Ac Ns Li \&: Pq malloc .
34226e9ae25Sjruoho.Sh SEE ALSO
34326e9ae25Sjruoho.Xr emalloc 3 ,
34426e9ae25Sjruoho.Xr malloc 3 ,
34526e9ae25Sjruoho.Xr memory 3 ,
34626e9ae25Sjruoho.Xr memoryallocators 9
34726e9ae25Sjruoho.\"
34826e9ae25Sjruoho.\" XXX: Add more references that could be worth reading.
34926e9ae25Sjruoho.\"
35026e9ae25Sjruoho.Rs
35126e9ae25Sjruoho.%A Jason Evans
35226e9ae25Sjruoho.%T "A Scalable Concurrent malloc(3) Implementation for FreeBSD"
35326e9ae25Sjruoho.%D April 16, 2006
35426e9ae25Sjruoho.%O BSDCan 2006
35526e9ae25Sjruoho.%U http://people.freebsd.org/~jasone/jemalloc/bsdcan2006/jemalloc.pdf
35626e9ae25Sjruoho.Re
35726e9ae25Sjruoho.Rs
35826e9ae25Sjruoho.%A Poul-Henning Kamp
35926e9ae25Sjruoho.%T "Malloc(3) revisited"
36026e9ae25Sjruoho.%I USENIX Association
36126e9ae25Sjruoho.%B Proceedings of the FREENIX Track: 1998 USENIX Annual Technical Conference
36226e9ae25Sjruoho.%D June 15-19, 1998
3636f1249aaSwiz.%U http://www.usenix.org/publications/library/proceedings/usenix98/freenix/kamp.pdf
36426e9ae25Sjruoho.Re
36526e9ae25Sjruoho.Rs
36626e9ae25Sjruoho.%A Paul R. Wilson
36726e9ae25Sjruoho.%A Mark S. Johnstone
36826e9ae25Sjruoho.%A Michael Neely
36926e9ae25Sjruoho.%A David Boles
37026e9ae25Sjruoho.%T "Dynamic Storage Allocation: A Survey and Critical Review"
37126e9ae25Sjruoho.%D 1995
37226e9ae25Sjruoho.%I University of Texas at Austin
37326e9ae25Sjruoho.%U ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps
37426e9ae25Sjruoho.Re
37526e9ae25Sjruoho.Sh HISTORY
37626e9ae25SjruohoThe
37726e9ae25Sjruoho.Nm
37826e9ae25Sjruohoallocator became the default system allocator first in
37926e9ae25Sjruoho.Fx 7.0
38026e9ae25Sjruohoand then in
38126e9ae25Sjruoho.Nx 5.0 .
38226e9ae25SjruohoIn both systems it replaced the older so-called
38326e9ae25Sjruoho.Dq phkmalloc
38426e9ae25Sjruohoimplementation.
38526e9ae25Sjruoho.Sh AUTHORS
386a5684d07Swiz.An Jason Evans Aq Mt jasone@canonware.com
387