mpool -
共有メモリーバッファープール
#include <db.h>
#include <mpool.h>
MPOOL *mpool_open(DBT *key, int fd, pgno_t pagesize, pgno_t maxcache);
void mpool_filter(MPOOL *mp, void (*pgin)(void *, pgno_t, void *),
void (*pgout)(void *, pgno_t, void *),
void *pgcookie);
void *mpool_new(MPOOL *mp, pgno_t *pgnoaddr);
void *mpool_get(MPOOL *mp, pgno_t pgno, unsigned int flags);
int mpool_put(MPOOL *mp, void *pgaddr, unsigned int flags);
int mpool_sync(MPOOL *mp);
int mpool_close(MPOOL *mp);
大事な注意:
このページは、バージョン
2.1 までの glibc
が提供するインターフェースに
ついて説明している。バージョン
2.2 以降の glibc
では、もはやこれらの
インターフェースは提供されていない。おそらく、このページではなく、
libdb
ライブラリが提供する
API
をお探しなのだろう。
mpool
は、ファイルに対するページ指向のバッファー管理を実装した
ライブラリインターフェイスである。
関数
mpool_open()
はメモリープールを初期化する。
key
引数はバイト文字列であり、バッファーを共有したい複数プロセス間
でのネゴシエーションに使われる。
ファイルバッファーが共有メモリーにマップされると、
同じキーを使うプロセスは全てバッファーを共有する。
key が NULL
だと、バッファーはプライベートなメモリーに割り付けられる。
fd
引数はもとになるファイルのファイルディスクリプターである。
このファイルディスクリプターはシーク可能でなくてはならない。
key が NULL
でなく、かつ既にマップされているファイルにマッチした場合、
fd
引数は無視される。
pagesize
引数はバイト単位でのページサイズであり、ファイルはこのサイズに分割される。
maxcache
引数は基ファイルをキャッシュするときに用いる最大ページ数である。
この値はファイルバッファーを共有しているプロセスの数には関係ないが、
ファイルを共有するプロセスが指定したうちの最大値が実際に用いられる。
関数
mpool_filter()
は透過的なページ入出力処理を可能にする。
関数
pgin
が指定されていると、
ファイルからメモリープールに読み込まれる度にこの関数が呼び出される。
関数
pgout
が指定されていと、
バッファーからファイルに書き出される度にこの関数が呼び出される。
どちらの関数も、
pgcookie
ポインター、ページ数、読み書きされるページへのポインターを引数にとる。
関数
mpool_new() は
MPOOL
ポインターとアドレスを引数にとる。
新しいページが割り当て可能な場合、ページへのポインターが返され、
ページ数が
pgnoaddr
アドレスに納められる。
割り当てが不可能な場合は
NULL が返され、
errno
がセットされる。
関数
mpool_get() は
MPOOL
ポインターとページ数を引数にとる。ページが存在していると、
ページへのポインターが返される。
存在していないと NULL
が返され、
errno
がセットされる。
flags
引数は現在使用されていない。
関数
mpool_put() は
pgaddr
が参照するページを解放する。
pgaddr は以前に
mpool_get() か
mpool_new()
が返したアドレスでなければならない。
flag
の値は以下の値の論理和で指定する。
- MPOOL_DIRTY
- ページは変更されており、ファイルに書き出す必要がある。
mpool_put() は成功すると 0
を、エラーがあると -1
を返す。
関数
mpool_sync() は
MPOOL
ポインターの示すページのうち、
変更されたものを全てファイルに書き出す。
mpool_sync() は成功すると 0
を、エラーがあると -1
を返す。
関数
mpool_close()
はメモリープールクッキーの示す割り当て済みのメモリーを解放する。
変更されたページはファイルに
書き出されない。
mpool_close () は成功すると 0
を、エラーがあると -1
を返す。
関数
mpool_open()
は失敗するとライブラリルーチン
malloc(3)
で指定されているエラーに応じた
errno をセットする。
関数
mpool_get()
は失敗すると次のような
errno をセットする。
- EINVAL
- 要求のあったレコードは存在しない。
関数
mpool_new() と
mpool_get()
は失敗するとライブラリルーチン
read(2),
write(2),
malloc(3)
で指定されているエラーに応じた
errno をセットする。
関数
mpool_sync()
は失敗するとライブラリルーチン
write(2)
で指定されているエラーに応じた
errno をセットする。
関数
mpool_close()
は失敗するとライブラリルーチン
free(3)
で指定されているエラーに応じた
errno をセットする。
POSIX.1 にはない。 BSD
系に存在する。
btree(3),
dbopen(3),
hash(3),
recno(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。