目次
ここは
libumem(3LIB) portlibのまとめ。開発元はここ
libumem(3LIB)とは
TBD
portlibeumem code fixに関して
下記ではcode fixのpatchを置いてみたが、これはconfigureスクリプトが
完成していない状態の bzipedコードが archiveとして置かれていたからであり、
svnのrepostry最新では修正されていた。
このため、以下のfixは 2008-06-02現在の archiveに関してのみ適用できる話である。
またbuildする際には https://labs.omniti.com/portableumem/trunk からcheck outして
autogen.sh->configure->makeとするように。
portableumem cord fix for RHEL
umem_cpu_cache構造体のalignmentのところでILP32の場合は動くが LP64の場合は動かないので、修正してみた。originalはこんな感じ。
umem_impl.h
244 #define UMEM_CPU_PAD (UMEM_CPU_CACHE_SIZE - sizeof (mutex_t) - \
245 2 * sizeof (uint_t) - 2 * sizeof (void *) - 4 * sizeof (int))
246 #define UMEM_CACHE_SIZE(ncpus) \
247 ((size_t)(&((umem_cache_t *)0)->cache_cpu[ncpus]))
248
249 typedef struct umem_cpu_cache {
250 mutex_t cc_lock; /* protects this cpu's local cache */
251 uint_t cc_alloc; /* allocations from this cpu */
252 uint_t cc_free; /* frees to this cpu */
253 umem_magazine_t *cc_loaded; /* the currently loaded magazine */
254 umem_magazine_t *cc_ploaded; /* the previously loaded magazine */
255 int cc_rounds; /* number of objects in loaded mag */
256 int cc_prounds; /* number of objects in previous mag */
257 int cc_magsize; /* number of rounds in a full mag */
258 int cc_flags; /* CPU-local copy of cache_flags */
259 #if (!defined(_LP64) || defined(UMEM_PTHREAD_MUTEX_TOO_BIG)) && !defined(_WI
N32)
260 /* on win32, UMEM_CPU_PAD evaluates to zero, and the MS compiler
261 * won't allow static initialization of arrays containing structures
262 * that contain zero size arrays */
263 char cc_pad[UMEM_CPU_PAD]; /* for nice alignment (32-bit) */
264 #endif
265 } umem_cpu_cache_t;
見ればわかるように、構造体を作って 2^nの型になるように PADで填めている。
UMEM_CPU_PADは
- IPL32な RHEL-AS3u3の場合
- mutex_t(24) + uint_t(4)*2 + (void *)(4)*2 + int(4) *4 = 56 bytes
- LP64な RHEL-AS4u3の場合
- mutex_t(40) + uint_t(4)*2 + (void *)(8)*2 + int(4) *4 = 80 bytes
となり、どっちにしろ 2^nの型にならないので、Unixの場合はPADで填める型にしてみた。
また、UMEM_PTHREAD_MUTEX_TOO_BIGはどこにも定義されてない感じなので、
259行のmacroからは排除した。(ver 1.0の場、このmacroは 238行と259行の2ヵ所以外では使っていない)
fixはすぐ下に記載。とりあえずpatch用diffはおいてみた。
for RHEL-AS4u3/x86_64
ver 1.0のsrcだと x86_64ではビルドが通っても、umem_cpu_cache構造体のサイズと
期待しているサイズが異なるため、初期化関数の umem_init()の条件チェックで終了して、
初期化が通らなかった。
てきとーになおした結果はこんな感じ
$ diff umem_impl.h umem_impl.org.h
238c238
< #if (defined(__PTHREAD_MUTEX_SIZE__) && __PTHREAD_MUTEX_SIZE__ >= 24) ||
defined(UMEM_PTHREAD_MUTEX_TOO_BIG) || defined(_LP64)
---
> #if (defined(__PTHREAD_MUTEX_SIZE__) && __PTHREAD_MUTEX_SIZE__ >= 24) ||
defined(UMEM_PTHREAD_MUTEX_TOO_BIG)
259c259
< #if !defined(_WIN32)
---
> #if (!defined(_LP64) || defined(UMEM_PTHREAD_MUTEX_TOO_BIG)) && !defined(_WIN32)
for RHEL-AS3u3
こっちの場合は順当だが、srcはいじらなくても通る。testスクリプトの umem_test4で mktempのoptionで存在しないもの(-t)を指定しているので、これだけ適当に変えればok
$ diff umem_test4 umem_test4.org
9c9
< TMPLOC=$(mktemp -d /tmp/umem_test4.XXXXX)
---
> TMPLOC=$(mktemp -d -t umem_test4.XXXXX)
無論、上記の通り、umem_impl.hを修正したあとも make checkは通る。
|