差分表示


*ここは
libumem(3LIB) portlibのまとめ。開発元は[[ここ>https://labs.omniti.com/trac/portableumem]]

*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とするように。
''autogen.sh''->''configure''->''make''とするように。

**%%%portableumem cord fix for RHEL%%%
**%%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は[[おいてみた>http://mage.oops.jp/images/umem-1.0.p1.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