BREW memory pool

BrewSmartPtr にしろ BrewArray にしろ、Deleter はメモリプールから確保しています。


当然、メモリプールで自前のアロケートをするわけですが、自前のアロケータを作るのは自分にとっては非常に難易度が高いです。
なので、自分は Doug Lea 氏の malloc.c(通称dlmalloc) を使っていたりします。

http://gee.cs.oswego.edu/dl/html/malloc.html

で、この malloc.c を BREW 用に import してやるわけですが、一つだけ問題点があります。
こいつ、グローバル変数が使われています(;´Д`)

static struct malloc_params mparams;
static struct malloc_state _gm_;

この2つがグローバル変数です。


これがあるとどうしようもないので何とかするわけですが、一番素直な実装としては、アプレットクラスからこの領域を取得する方法でしょう。

#define mparams (*((struct malloc_params*)((CApplet*)GETAPPINSTANCE())->getDLMallocGlobal()))
#define _gm_    (*((struct malloc_state*)((byte*)((CApplet*)GETAPPINSTANCE())->getDLMallocGlobal() + sizeof( struct malloc_params ))))

CApplet に依存する形になるのが嫌だというのであれば、グローバル関数を間に挟んでやります。

// どっかで定義してちょ
#ifdef __cplusplus
extern "C" void* dlmalloc_global_memory();
#else
extern void* dlmalloc_global_memory();
#endif

#define mparams (*((struct malloc_params*)dlmalloc_global_memory()))
#define _gm_    (*((struct malloc_state*)((byte*)dlmalloc_global_memory() + sizeof( struct malloc_params ))))

で、もうメモリ保護なんて(´ー`)チラネーヨ っていうのであれば単純に、

// エミュレータは自己書き換え不可
#ifdef AEE_SIMULATOR

static struct malloc_params mparams;
static struct malloc_state _gm_;

#else

const static struct malloc_params _mparams;
const static struct malloc_state __gm_;

#define mparams (*(struct malloc_params*)&_mparams)
#define _gm_    (*(struct malloc_state*)&__gm_)

#endif

こうすれば、自己書き換えによって、擬似的にグローバル変数が使えます。