summaryrefslogtreecommitdiff
path: root/static/freebsd/man9/hashalloc.9 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/freebsd/man9/hashalloc.9 3.html')
-rw-r--r--static/freebsd/man9/hashalloc.9 3.html253
1 files changed, 0 insertions, 253 deletions
diff --git a/static/freebsd/man9/hashalloc.9 3.html b/static/freebsd/man9/hashalloc.9 3.html
deleted file mode 100644
index c53cd5aa..00000000
--- a/static/freebsd/man9/hashalloc.9 3.html
+++ /dev/null
@@ -1,253 +0,0 @@
-<table class="head">
- <tr>
- <td class="head-ltitle">HASHALLOC(9)</td>
- <td class="head-vol">Kernel Developer's Manual</td>
- <td class="head-rtitle">HASHALLOC(9)</td>
- </tr>
-</table>
-<div class="manual-text">
-<section class="Sh">
-<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1>
-<p class="Pp"><code class="Nm">hashalloc</code>,
- <code class="Nm">hashfree</code> &#x2014; <span class="Nd">allocate and free
- kernel hash tables</span></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1>
-<p class="Pp"><code class="In">#include
- &lt;<a class="In">sys/malloc.h</a>&gt;</code>
- <br/>
- <code class="In">#include &lt;<a class="In">sys/hash.h</a>&gt;</code></p>
-<p class="Pp"><var class="Ft">void *</var>
- <br/>
- <code class="Fn">hashalloc</code>(<var class="Fa" style="white-space: nowrap;">struct
- hashalloc_args *args</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">hashfree</code>(<var class="Fa" style="white-space: nowrap;">void
- *table</var>, <var class="Fa" style="white-space: nowrap;">struct
- hashalloc_args *args</var>);</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1>
-<p class="Pp">The
- <a class="permalink" href="#hashalloc"><code class="Fn" id="hashalloc">hashalloc</code></a>()
- and <code class="Fn">hashfree</code>() functions provide a flexible kernel
- programming interface (KPI) for allocating and freeing hash tables with
- configurable bucket headers.</p>
-<p class="Pp" id="hashalloc~2"><a class="permalink" href="#hashalloc~2"><code class="Fn">hashalloc</code></a>()
- allocates memory for a hash table according to the parameters specified in
- the <var class="Fa">args</var> structure. It computes an appropriate number
- of buckets (adjusting <var class="Fa">args-&gt;size</var> as needed based on
- the requested <var class="Fa">type</var>), allocates memory using
- <a class="Xr">malloc(9)</a>, initializes each bucket's queue header (e.g.,
- <var class="Vt">LIST_HEAD</var>, <var class="Vt">TAILQ_HEAD</var>, etc.),
- and, if requested, initializes per-bucket locks. The returned memory
- allocation can be used as an array of header structures that start with
- initialized list header of the requested type followed by initialized lock
- of requested type.</p>
-<p class="Pp" id="hashfree"><a class="permalink" href="#hashfree"><code class="Fn">hashfree</code></a>()
- frees a hash table previously allocated by
- <code class="Fn">hashalloc</code>().</p>
-<p class="Pp">Both functions require the caller to pass the same (or equivalent)
- <var class="Fa">struct hashalloc_args</var> that specifies the desired
- configuration of the hash table and has the following members:</p>
-<div class="Bd Pp Bd-indent Li">
-<pre>struct hashalloc_args {
- /* Required arguments */
- size_t size; /* in: desired buckets, out: allocated */
- int mflags; /* malloc(9) flags */
- struct malloc_type *mtype; /* malloc(9) type */
- /* Optional arguments */
- size_t hdrsize; /* bucket header size; 0 = auto */
- enum {
- HASH_TYPE_POWER2,
- HASH_TYPE_PRIME,
- } type; /* default HASH_TYPE_POWER2 */
- enum {
- HASH_HEAD_LIST,
- HASH_HEAD_CK_LIST,
- HASH_HEAD_SLIST,
- HASH_HEAD_CK_SLIST,
- HASH_HEAD_STAILQ,
- HASH_HEAD_CK_STAILQ,
- HASH_HEAD_TAILQ,
- } head; /* default HASH_HEAD_LIST */
- enum {
- HASH_LOCK_NONE,
- HASH_LOCK_MTX,
- HASH_LOCK_RWLOCK,
- HASH_LOCK_SX,
- HASH_LOCK_RMLOCK,
- HASH_LOCK_RMSLOCK,
- } lock; /* default HASH_LOCK_NONE */
- int lopts; /* lock init options */
- const char *lname; /* lock name */
- int (*ctor)(void *); /* bucket constructor */
- void (*dtor)(void *); /* bucket destructor */
- /* Returned arguments */
- int error; /* error code in case of failure */
-};</pre>
-</div>
-<p class="Pp" id="hashalloc~3">Argument members <var class="Fa">size</var>,
- <var class="Fa">mflags</var> and <var class="Fa">mtype</var> are required
- for the
- <a class="permalink" href="#hashalloc~3"><code class="Fn">hashalloc</code></a>().
- The argument <var class="Fa">size</var>, as filled by earlier call to
- <code class="Fn">hashalloc</code>(), and <var class="Fa">mtype</var> are
- required for the <code class="Fn">hashfree</code>(). The rest of arguments
- are optional and have reasonable defaults. A hash table that was allocated
- with a non-default allocation arguments shall pass the same arguments to
- <code class="Fn">hashfree</code>(). The structure shall be initialized with
- sparse C99 initializer as it may contain opaque extension members. The
- structure may be allocated on the stack of a caller.</p>
-<dl class="Bl-tag">
- <dt><var class="Fa">size</var></dt>
- <dd>Desired number of buckets for <code class="Fn">hashalloc</code>(). Upon a
- successful return <code class="Fn">hashalloc</code>() sets this member to
- the actual number allocated (may be rounded up to power-of-2 or nearest
- prime). The value returned by <code class="Fn">hashalloc</code>() shall be
- later supplied to the <code class="Fn">hashfree</code>().</dd>
- <dt><var class="Fa">mflags</var>, <var class="Fa">mtype</var></dt>
- <dd>Passed directly to <a class="Xr">malloc(9)</a>.</dd>
- <dt><var class="Fa">hdrsize</var></dt>
- <dd>Optional member that allows the caller to set a different (increased) size
- of a bucket header.</dd>
- <dt><var class="Fa">type</var></dt>
- <dd>Bucket count policy:
- <dl class="Bl-tag">
- <dt id="HASH_TYPE_POWER2"><a class="permalink" href="#HASH_TYPE_POWER2"><code class="Dv">HASH_TYPE_POWER2</code></a></dt>
- <dd>Rounded up to largest power of two less than or equal to argument
- <var class="Fa">size</var>.</dd>
- <dt id="HASH_TYPE_PRIME"><a class="permalink" href="#HASH_TYPE_PRIME"><code class="Dv">HASH_TYPE_PRIME</code></a></dt>
- <dd>Sized to the largest prime number less than or equal to argument
- <var class="Fa">size</var>.</dd>
- </dl>
- <p class="Pp">Default is <code class="Dv">HASH_TYPE_POWER2</code>.</p>
- </dd>
- <dt><var class="Fa">head</var></dt>
- <dd>Queue header type for each bucket, a <a class="Xr">queue(3)</a> or
- Concurrency-kit (CK) type.
- <dl class="Bl-tag">
- <dt id="HASH_HEAD_LIST"><a class="permalink" href="#HASH_HEAD_LIST"><code class="Dv">HASH_HEAD_LIST</code></a></dt>
- <dd><a class="Xr">queue(3)</a> <code class="Fd">LIST_HEAD</code></dd>
- <dt id="HASH_HEAD_CK_LIST"><a class="permalink" href="#HASH_HEAD_CK_LIST"><code class="Dv">HASH_HEAD_CK_LIST</code></a></dt>
- <dd>Concurrency-kit <code class="Fd">CK_LIST_HEAD</code></dd>
- <dt id="HASH_HEAD_SLIST"><a class="permalink" href="#HASH_HEAD_SLIST"><code class="Dv">HASH_HEAD_SLIST</code></a></dt>
- <dd><a class="Xr">queue(3)</a> <code class="Fd">SLIST_HEAD</code></dd>
- <dt id="HASH_HEAD_CK_SLIST"><a class="permalink" href="#HASH_HEAD_CK_SLIST"><code class="Dv">HASH_HEAD_CK_SLIST</code></a></dt>
- <dd>Concurrency-kit <code class="Fd">CK_SLIST_HEAD</code></dd>
- <dt id="HASH_HEAD_STAILQ"><a class="permalink" href="#HASH_HEAD_STAILQ"><code class="Dv">HASH_HEAD_STAILQ</code></a></dt>
- <dd><a class="Xr">queue(3)</a> <code class="Fd">STAILQ_HEAD</code></dd>
- <dt id="HASH_HEAD_CK_STAILQ"><a class="permalink" href="#HASH_HEAD_CK_STAILQ"><code class="Dv">HASH_HEAD_CK_STAILQ</code></a></dt>
- <dd>Concurrency-kit <code class="Fd">CK_STAILQ_HEAD</code></dd>
- <dt id="HASH_HEAD_TAILQ"><a class="permalink" href="#HASH_HEAD_TAILQ"><code class="Dv">HASH_HEAD_TAILQ</code></a></dt>
- <dd><a class="Xr">queue(3)</a> <code class="Fd">TAILQ_HEAD</code></dd>
- </dl>
- <p class="Pp">Default is <code class="Dv">HASH_HEAD_LIST</code>.</p>
- </dd>
- <dt><var class="Fa">lock</var></dt>
- <dd>Synchronization:
- <dl class="Bl-tag">
- <dt id="HASH_LOCK_NONE"><a class="permalink" href="#HASH_LOCK_NONE"><code class="Dv">HASH_LOCK_NONE</code></a></dt>
- <dd>No per-bucket lock.</dd>
- <dt id="HASH_LOCK_MTX"><a class="permalink" href="#HASH_LOCK_MTX"><code class="Dv">HASH_LOCK_MTX</code></a></dt>
- <dd>Per-bucket <a class="Xr">mutex(9)</a>.</dd>
- <dt id="HASH_LOCK_RWLOCK"><a class="permalink" href="#HASH_LOCK_RWLOCK"><code class="Dv">HASH_LOCK_RWLOCK</code></a></dt>
- <dd>Per-bucket <a class="Xr">rwlock(9)</a>.</dd>
- <dt id="HASH_LOCK_SX"><a class="permalink" href="#HASH_LOCK_SX"><code class="Dv">HASH_LOCK_SX</code></a></dt>
- <dd>Per-bucket <a class="Xr">sx(9)</a>.</dd>
- <dt id="HASH_LOCK_RMLOCK"><a class="permalink" href="#HASH_LOCK_RMLOCK"><code class="Dv">HASH_LOCK_RMLOCK</code></a></dt>
- <dd>Per-bucket <a class="Xr">rmlock(9)</a>.</dd>
- <dt id="HASH_LOCK_RMSLOCK"><a class="permalink" href="#HASH_LOCK_RMSLOCK"><code class="Dv">HASH_LOCK_RMSLOCK</code></a></dt>
- <dd>Per-bucket sleepable (rms) <a class="Xr">rmlock(9)</a>.</dd>
- </dl>
- <p class="Pp">Default is <code class="Dv">HASH_LOCK_NONE</code>.</p>
- </dd>
- <dt><var class="Fa">lopts</var></dt>
- <dd>Options passed to <a class="Xr">mtx_init(9)</a>,
- <a class="Xr">rw_init(9)</a>, <a class="Xr">sx_init(9)</a>,
- <a class="Xr">rm_init(9)</a> or <a class="Xr">rms_init(9)</a> (if locking
- is enabled).</dd>
- <dt><var class="Fa">lname</var></dt>
- <dd>Lock name. This member is required unless <var class="Fa">lock</var> is
- <code class="Dv">HASH_LOCK_NONE</code>.</dd>
- <dt id="hashalloc~4"><var class="Fa">ctor</var></dt>
- <dd>Optional constructor to be called by
- <a class="permalink" href="#hashalloc~4"><code class="Fn">hashalloc</code></a>()
- for each bucket after list header and lock initialization. May fail with
- error code, yielding in a failure of
- <code class="Fn">hashalloc</code>().</dd>
- <dt><var class="Fa">dtor</var></dt>
- <dd>Optional destructor to be called by <code class="Fn">hashfree</code>() for
- each bucket before lock destructors and list emptyness checks.</dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="RETURN_VALUES"><a class="permalink" href="#RETURN_VALUES">RETURN
- VALUES</a></h1>
-<p class="Pp"><code class="Fn">hashalloc</code>() returns a pointer to the
- allocated and initialized hash table on success, or
- <code class="Dv">NULL</code> on memory allocation failure or constructor
- failure. The <var class="Fa">error</var> member of
- <var class="Fa">args</var> is set to appropriate error code. When
- <var class="Fa">mflags</var> in <var class="Fa">args</var> contain the
- <var class="Va">M_WAITOK</var> flag and the <var class="Fa">ctor</var> is
- either NULL or never fails, then <code class="Fn">hashalloc</code>() never
- fails.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="EXAMPLES"><a class="permalink" href="#EXAMPLES">EXAMPLES</a></h1>
-<p class="Pp">A simple mutex-protected hash table using TAILQ buckets:</p>
-<div class="Bd Pp Bd-indent Li">
-<pre>struct bucket {
- TAILQ_HEAD(, foo) head;
- struct mtx lock;
-} *table;
-
-struct hashalloc_args args = {
- .size = 9000,
- .mflags = M_WAITOK,
- .mtype = M_FOO,
- .head = HASH_HEAD_TAILQ,
- .lock = HASH_LOCK_MTX,
- .lopts = MTX_DEF,
- .lname = &quot;bucket of foo&quot;,
-};
-
-table = hashalloc(&amp;args);
-/* Use table as array of struct bucket ... */
-mtx_lock(&amp;table[hash].lock);
-TAILQ_INSERT_HEAD(&amp;table[hash].head, foo, next);
-
-/* Later */
-hashfree(table, &amp;args);</pre>
-</div>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE
- ALSO</a></h1>
-<p class="Pp"><a class="Xr">malloc(9)</a>, <a class="Xr">mutex(9)</a>,
- <a class="Xr">rmlock(9)</a>, <a class="Xr">rwlock(9)</a>,
- <a class="Xr">sx(9)</a>, <a class="Xr">queue(3)</a></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1>
-<p class="Pp">The <code class="Nm">hashalloc</code> KPI first appeared in
- <span class="Ux">FreeBSD 16.0</span>. It supersedes older interface
- <code class="Fn">hashinit</code>(), that was available since
- <span class="Ux">4.4BSD</span>, by offering greater control over the hash
- table structure and locking strategy.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1>
-<p class="Pp"><span class="An">Gleb Smirnoff</span>
- &lt;<a class="Mt" href="mailto:glebius@FreeBSD.org">glebius@FreeBSD.org</a>&gt;</p>
-</section>
-</div>
-<table class="foot">
- <tr>
- <td class="foot-date">April 12, 2026</td>
- <td class="foot-os">FreeBSD 15.0</td>
- </tr>
-</table>