HASHINIT(9) | FreeBSD Kernel Developer's Manual | HASHINIT(9) |
名称
hashinit, hashinit_flags, hashdestroy, phashinit — カーネルのハッシュテーブルを管理する書式
#include < sys/malloc.h>#include < sys/systm.h>
#include < sys/queue.h>
void *
hashinit( int nelements, struct malloc_type *type, u_long *hashmask);
void
hashinit_flags( int nelements, struct malloc_type *type, u_long *hashmask, int flags);
void
hashdestroy( void *hashtbl, struct malloc_type *type, u_long hashmask);
void *
phashinit( int nelements, struct malloc_type *type, u_long *nentries);
解説
hashinit(), hashinit_flags() と phashinit() 関数は、引数 nelements によって与えられたサイズのハッシュテーブルのために空間を割り付けます。hashinit() 関数は、引数 nelements より小さいか等しい最大の 2 の冪乗のサイズがあるハッシュテーブルを割り付けます。 phashinit() 関数は、 nelements より小さいか等しい最大の素数のサイズがあるハッシュテーブルを割り付けます。 hashinit_flags() 関数は、 hashinit() のように動作しますが、割り付けの間の様々なオプションを制御する、追加引数 flags も受け付けます。割り付けられたハッシュテーブルは、 malloc(9) を使用して割り付けて、 LIST_INIT(3) を使用して初期化した LIST_HEAD(3) エントリの連続した配列です。割り付けに使用される malloc の領域は引数 type によって指されます。
hashdestroy() 関数は、引数 hashtbl によって指されたハッシュテーブルによって占有された空間を解放します。引数 type は、空間を解放するとき、使用する malloc 領域を決定します。引数 hashmask はハッシュテーブルを割り付けた hashinit() への呼び出しによって返されたビットマスクであるべきです。引数 flags は、次の値の 1 つと共に使用されなければなりません。
- HASH_NOWAIT
- hashinit_flags() 関数によって実行された任意の malloc は、待つことを許可されないので、失敗するかもしれません。
- HASH_WAITOK
- hashinit_flags() 関数によって実行された任意の malloc は、メモリを待つことができます。
実装に関する注
phashinit() によって選択された最も大きい主要なハッシュ値は 32749 です。戻り値
hashinit() 関数は、割り付けられたハッシュテーブルへのポインタを返して、ハッシュテーブルの正しいスロットを計算するために使用されるビットマスクを hashmask によって指された位置に設定します。phashinit() 関数は、割り付けられたハッシュテーブルへのポインタを返して、ハッシュテーブルの列の数を nentries によって指された位置を設定します。
使用例
典型的な例は以下に示されます:
... static LIST_HEAD(foo, foo) *footable; static u_long foomask; ... footable = hashinit(32, M_FOO, &foomask);
ここで、 M_FOO によって指された malloc 領域から 32 のエントリと共にハッシュテーブルを割り付けます。割り付けられたハッシュテーブルのためのマスクは、 foomask に返されます。 hashdestroy() へのその後の呼び出しは foomask で値を使用します:
... hashdestroy(footable, M_FOO, foomask);
診断
hashinit() と phashinit() 関数は、引数 nelements が 0 以下であるならパニックとなります。hashdestroy() 関数は、 hashtbl によって指されたハッシュテーブルが空でないなら、パニックとなります。
バグ
phashdestroy() 関数は、ありません、そして、通常、 phashinit() によって割り付けられたハッシュテーブルを解放するために hashdestroy() を使用することは重大な結果をもたらします。October 10, 2004 | FreeBSD |