Plan 9 from Bell Labs’s /usr/web/sources/contrib/dho/kimp/p9/malloc

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


.TH MALLOC 10
.SH NAME
malloc, mallocz, smalloc, realloc, calloc, free, msize, setmalloctag, setrealloctag, getmalloctag, getrealloctag, malloctopoolblock \- kernel memory allocator
.SH SYNOPSIS
.ta \w'\fLvoid* 'u
.B
void*	malloc(ulong size)
.PP
.B
void*	mallocalign(ulong size, ulong align, long offset, ulong span)
.PP
.B
void*	mallocz(ulong size, int clr)
.PP
.B
void*	smalloc(ulong size)
.PP
.B
void*	realloc(void *p, ulong size)
.PP
.B
void*	calloc(ulong n, ulong szelem)
.PP
.B
void	free(void *ptr)
.PP
.B
ulong	msize(void *ptr)
.PP
.B
void	setmalloctag(void *ptr, ulong tag)
.PP
.B
ulong	getmalloctag(void *ptr)
.PP
.B
void	setrealloctag(void *ptr, ulong tag)
.PP
.B
ulong	getrealloctag(void *ptr)
.PP
.B
void*	malloctopoolblock(void*)
.PP
.SH DESCRIPTION
These are kernel versions of the functions in
.IR malloc (2).
They allocate memory from the
.B mainmem
memory pool,
which is managed by
the allocator
.IR pool (2),
which in turn replenishes the pool as required by calling
.IR xalloc (10).
All but
.I smalloc
(which calls
.IR sleep (10))
may safely be called by interrupt handlers.
.PP
.I Malloc
returns a pointer to a block of at least
.I size
bytes, initialised to zero.
The block is suitably aligned for storage of any type of object.
The call
.B malloc(0)
returns a valid pointer rather than null.
.I Mallocz
is similar, but only clears the memory if
.I clr
is non-zero.
.PP
.I Smalloc
returns a pointer to a block of
.I size
bytes, initialised to zero.
If the memory is not immediately available,
.I smalloc
retries every 100 milliseconds until the memory is acquired.
.PP
.I Mallocalign
allocates a block of at least 
.I n
bytes of memory respecting alignment contraints.
If
.I align
is non-zero,
the returned pointer is aligned to be equal to
.I offset
modulo
.IR align .
If
.I span
is non-zero,
the
.I n
byte block allocated will not span a
.IR span -byte
boundary.
.PP
.I Realloc
changes the size of the block pointed to by
.I p
to
.I size
bytes,
if possible without moving the data,
and returns a pointer to the block.
The contents are unchanged up to the lesser of old and new sizes,
and any new space allocated is initialised to zero.
.I Realloc
takes on special meanings when one or both arguments are zero:
.TP
.B "realloc(0,\ size)
means
.LR malloc(size) ;
returns a pointer to the newly-allocated memory
.TP
.B "realloc(ptr,\ 0)
means
.LR free(ptr) ;
returns null
.TP
.B "realloc(0,\ 0)
no-op; returns null
.PD
.PP
.I Calloc
returns a pointer to a block of memory of at least
.I "n*szelem"
bytes, initialised to zero.
New code should use
.I mallocz
instead.
.PP
The argument to
.I free
is a pointer to a block of memory allocated by one of the routines above, which
is returned to the allocation pool, or a null pointer, which is ignored.
.PP
When a block is allocated, sometimes there is some extra unused space at the end.
.I Msize
grows the block to encompass this unused space and returns the new number
of bytes that may be used.
.PP
The memory allocator maintains two word-sized fields
associated with each block, the ``malloc tag'' and the ``realloc tag''.
By convention, the malloc tag is the PC that allocated the block,
and the realloc tag the PC that last reallocated the block.
These may be set or examined with 
.IR setmalloctag ,
.IR getmalloctag ,
.IR setrealloctag ,
and
.IR getrealloctag .
When allocating blocks directly with
.I malloc
and
.IR realloc ,
these tags will be set properly.
If a custom allocator wrapper is used,
the allocator wrapper can set the tags
itself (usually by passing the result of
.IR getcallerpc (2) 
to 
.IR setmalloctag )
to provide more useful information about
the source of allocation.
.PP
.I Malloctopoolblock
takes the address of a block returned by
.I malloc
and returns the address of the corresponding
block allocated by the
.IR pool (2)
routines.
.SH DIAGNOSTICS
All functions except
.I smalloc
return a null pointer if space is unavailable.
If the allocated blocks have no malloc or realloc tags,
.I getmalloctag
and
.I getrealloctag
return
.BR ~0 .
.SH SOURCE
.B /sys/src/9/port/alloc.c
.SH SEE ALSO
.IR pool (2),
.IR xalloc (10)

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].