source: mainline/kernel/generic/include/adt/cht.h@ a35b458

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a35b458 was a35b458, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

  • Property mode set to 100644
File size: 5.2 KB
Line 
1/*
2 * Copyright (c) 2012 Adam Hraska
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup genericadt
30 * @{
31 */
32/** @file
33 */
34
35#ifndef KERN_CONC_HASH_TABLE_H_
36#define KERN_CONC_HASH_TABLE_H_
37
38#include <stdint.h>
39#include <adt/list.h>
40#include <synch/rcu_types.h>
41#include <macros.h>
42#include <synch/workqueue.h>
43
44typedef uintptr_t cht_ptr_t;
45
46/** Concurrent hash table node link. */
47typedef struct cht_link {
48 /* Must be placed first.
49 *
50 * The function pointer (rcu_link.func) is used to store the item's
51 * mixed memoized hash. If in use by RCU (ie waiting for deferred
52 * destruction) the hash will contain the value of
53 * cht_t.op->remove_callback.
54 */
55 union {
56 rcu_item_t rcu_link;
57 size_t hash;
58 };
59 /** Link to the next item in the bucket including any marks. */
60 cht_ptr_t link;
61} cht_link_t;
62
63/** Set of operations for a concurrent hash table. */
64typedef struct cht_ops {
65 /** Returns the hash of the item.
66 *
67 * Applicable also to items that were logically deleted from the table
68 * but have yet to be physically removed by means of remove_callback().
69 */
70 size_t (*hash)(const cht_link_t *item);
71 /** Returns the hash value of the key used to search for entries. */
72 size_t (*key_hash)(void *key);
73 /** Returns true if the two items store equal search keys. */
74 bool (*equal)(const cht_link_t *item1, const cht_link_t *item2);
75 /** Returns true if the item contains an equal search key. */
76 bool (*key_equal)(void *key, const cht_link_t *item);
77 /** Invoked to free a removed item once all references to it are dropped. */
78 void (*remove_callback)(cht_link_t *item);
79} cht_ops_t;
80
81/** Groups hash table buckets with their count.
82 *
83 * It allows both the number of buckets as well as the bucket array
84 * to be swapped atomically when resing the table.
85 */
86typedef struct cht_buckets {
87 /** The number of buckets is 2^order. */
88 size_t order;
89 /** Array of single linked list bucket heads along with any marks. */
90 cht_ptr_t head[1];
91} cht_buckets_t;
92
93/** Concurrent hash table structure. */
94typedef struct {
95 /** Item specific operations. */
96 cht_ops_t *op;
97
98 /** Buckets currently in use. */
99 cht_buckets_t *b;
100 /** Resized table buckets that will replace b once resize is complete. */
101 cht_buckets_t *new_b;
102 /** Invalid memoized hash value.
103 *
104 * If cht_link.hash contains this value the item had been logically
105 * removed and is waiting to be freed. Such hashes (and the associated
106 * items) are disregarded and skipped or the actual hash must be
107 * determined via op->hash().
108 */
109 size_t invalid_hash;
110
111 /** Minimum number of buckets is 2^min_order. */
112 size_t min_order;
113 /** Maximum number of items per bucket before the table grows. */
114 size_t max_load;
115 /** Table is resized in the background in a work queue. */
116 work_t resize_work;
117 /** If positive the table should grow or shrink.
118 *
119 * If not 0 resize work had already been posted to the system work queue.
120 */
121 atomic_t resize_reqs;
122
123 /** Number of items in the table that have not been logically deleted. */
124 atomic_t item_cnt;
125} cht_t;
126
127#define cht_get_inst(item, type, member) \
128 member_to_inst((item), type, member)
129
130
131#define cht_read_lock() rcu_read_lock()
132#define cht_read_unlock() rcu_read_unlock()
133
134extern bool cht_create_simple(cht_t *h, cht_ops_t *op);
135extern bool cht_create(cht_t *h, size_t init_size, size_t min_size,
136 size_t max_load, bool can_block, cht_ops_t *op);
137extern void cht_destroy(cht_t *h);
138extern void cht_destroy_unsafe(cht_t *h);
139
140extern cht_link_t *cht_find(cht_t *h, void *key);
141extern cht_link_t *cht_find_lazy(cht_t *h, void *key);
142extern cht_link_t *cht_find_next(cht_t *h, const cht_link_t *item);
143extern cht_link_t *cht_find_next_lazy(cht_t *h, const cht_link_t *item);
144
145extern void cht_insert(cht_t *h, cht_link_t *item);
146extern bool cht_insert_unique(cht_t *h, cht_link_t *item, cht_link_t **dup_item);
147extern size_t cht_remove_key(cht_t *h, void *key);
148extern bool cht_remove_item(cht_t *h, cht_link_t *item);
149
150#endif
151
152/** @}
153 */
Note: See TracBrowser for help on using the repository browser.