スレッドセーフ・ヒープ
「今日は酔っているので」と書いてから一週間近く経ちました。別のことにはまってましておろそかに。
ヒープをオーバーライドする方法ですが、次のような代替関数を作ってプロジェクトに登録するだけです。
#include#include void *malloc(size_t size) { unsigned int imask; void * result; imask = cli(); result = heap_malloc( 0, size ); sti(imask); return( result ); } void free(void *ptr) { unsigned int imask; void * result; imask = cli(); heap_free( 0, ptr ); sti(imask); }
実際のスレッドセーフでないライブラリでは、デバッガで追うと上の関数のロックなし版になっていることがわかります。C++のnewとdeleteはmallocとfreeを呼んでいる為上の関数でとりあえずはC/C++のヒープをスレッドセーフ化できます。
calloc()とrealloc()がありませんが、これはcalloc()だけリンカーがエラーを吐くからです。dsptools.supportに報告しとこ。