目次

ここは

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は通る。


Last-modified: 2008-06-04 10:16:52