127 lines
2.6 KiB
Plaintext
127 lines
2.6 KiB
Plaintext
.TH INTMAP 2
|
|
.SH NAME
|
|
Intmap, allocmap, freemap, insertkey, caninsertkey, lookupkey,
|
|
deletekey \- integer to data structure maps
|
|
.SH SYNOPSIS
|
|
.ft L
|
|
.nf
|
|
#include <u.h>
|
|
#include <libc.h>
|
|
#include <fcall.h>
|
|
#include <thread.h>
|
|
#include <9p.h>
|
|
.fi
|
|
.PP
|
|
.ft L
|
|
.nf
|
|
.ta \w'\fLIntmap* 'u
|
|
Intmap* allocmap(void (*inc)(void*))
|
|
void freemap(Intmap *map, void (*dec)(void*))
|
|
void* lookupkey(Intmap *map, ulong key)
|
|
void* insertkey(Intmap *map, ulong key, void *val)
|
|
int caninsertkey(Intmap *map, ulong key, void *val)
|
|
void* lookupkey(Intmap *map, ulong key)
|
|
void* deletekey(Intmap *map, ulong key)
|
|
.fi
|
|
.SH DESCRIPTION
|
|
An
|
|
.B Intmap
|
|
is an arbitrary mapping from integers to pointers.
|
|
.I Allocmap
|
|
creates a new map, and
|
|
.I freemap
|
|
destroys it.
|
|
The
|
|
.I inc
|
|
function is called each time a new pointer is added
|
|
to the map; similarly,
|
|
.I dec
|
|
is called on each pointer left in the map
|
|
when it is being freed.
|
|
Typically these functions maintain reference counts.
|
|
New entries are added to the map by calling
|
|
.IR insertkey ,
|
|
which will return the previous value
|
|
associated with the given
|
|
.IR key ,
|
|
or zero if there was no previous value.
|
|
.I Caninsertkey
|
|
is like
|
|
.I insertkey
|
|
but only inserts
|
|
.I val
|
|
if there is no current mapping.
|
|
It returns 1 if
|
|
.I val
|
|
was inserted, 0 otherwise.
|
|
.I Lookupkey
|
|
returns the pointer associated with
|
|
.IR key ,
|
|
or zero if there is no such pointer.
|
|
.I Deletekey
|
|
removes the entry for
|
|
.I id
|
|
from the map, returning the
|
|
associated pointer, if any.
|
|
.PP
|
|
Concurrent access to
|
|
.BR Intmap s
|
|
is safe,
|
|
moderated via a
|
|
.B QLock
|
|
stored in the
|
|
.B Intmap
|
|
structure.
|
|
.PP
|
|
In anticipation of the storage of reference-counted
|
|
structures, an increment function
|
|
.I inc
|
|
may be specified
|
|
at map creation time.
|
|
.I Lookupkey
|
|
calls
|
|
.I inc
|
|
(if non-zero)
|
|
on pointers before returning them.
|
|
If the reference count adjustments were
|
|
left to the caller (and thus not protected by the lock),
|
|
it would be possible to accidentally reclaim a structure
|
|
if, for example, it was deleted from the map and its
|
|
reference count decremented between the return
|
|
of
|
|
.I insertkey
|
|
and the external increment.
|
|
.IR Insertkey
|
|
and
|
|
.IR caninsertkey
|
|
do
|
|
.I not
|
|
call
|
|
.I inc
|
|
when inserting
|
|
.I val
|
|
into the map, nor do
|
|
.I insertkey
|
|
or
|
|
.I deletekey
|
|
call
|
|
.I inc
|
|
when returning old map entries.
|
|
The rationale is that calling
|
|
an insertion function transfers responsibility for the reference
|
|
to the map, and responsibility is given back via the return value of
|
|
.I deletekey
|
|
or the next
|
|
.IR insertkey .
|
|
.PP
|
|
.BR Intmap s
|
|
are used by the 9P library to implement
|
|
.BR Fidpool s
|
|
and
|
|
.BR Reqpool s.
|
|
.SH SOURCE
|
|
.B /sys/src/lib9p/intmap.c
|
|
.SH SEE ALSO
|
|
.IR 9p (2),
|
|
.IR 9pfid (2).
|