gdc/05


gdc

5. GC

gcjと併用(1つのプログラムの中でJavaとD言語のソースを混ぜる)する可能性も考えて、sms_gcを使う。

sms_gc

main()でSMS_GC_INIT()を呼んで、gc.dのmalloc()をsms_gc_malloc()に置き換えるだけ。終了。

ファイナライザ

いくら何でもこれだけでは寂しいので、gcjのポートではサポートが見送られているファイナライザをサポートしてみる。

余談

delete

まずはdeleteしてみる。

a.d

public class Test
{
	public this() { printf("ctor\n"); }
	public ~this() { printf("dtor\n"); }
	public void test() { printf("test\n"); }
}

int main(char[][] args)
{
	Test t = new Test();
	t.test();
	delete t;
	return 0;
}

GCにファイナライザを登録

gc.dの_d_newclass()で問題となるコードがある。

	_gc.setFinalizer(p, &new_finalizer);

sms_gc.h

D言語のタイプと上限を追加して数値を変更

#define SMS_GC_TYPE_DEFAULT  0
#define SMS_GC_TYPE_IGNORE   1
#define SMS_GC_TYPE_CPP     10
#define SMS_GC_TYPE_JAVA    20
#define SMS_GC_TYPE_D       30
#define SMS_GC_TYPE_MAX     64

ファイナライザ登録関数を追加

void sms_gc_set_finalizer(int type, void(*func)(void*));

sms_gc.cpp

ファイナライザ登録関数を実装

static void(*finalizers[SMS_GC_TYPE_MAX])(void*);

void sms_gc_set_finalizer(int type, void(*func)(void*))
{
	if (0 <= type && type < SMS_GC_TYPE_MAX)
		finalizers[type] = func;
}

sms_gc_free()を修正して解放時にファイナライザを呼ぶ

default:
	if (finalizers[p->type] != NULL)
		(*finalizers[p->type])(addr);
	free(addr);
	sms_gc_remove(addr);
	break;

gc.d

_d_newclass()で先ほど追加したD言語のタイプでメモリを割り当てる。

	p = sms_gc_malloc_type(ci.init.length, SMS_GC_TYPE_D);

dmain.cpp

GCの初期化後にファイナライザを登録する。

	SMS_GC_INIT();
	sms_gc_set_finalizer(SMS_GC_TYPE_D, new_finalizer);

_Dmain()から帰ってきた後にGCを実施する。

	int result = _Dmain(args);
	sms_gc_collect();
	return result;

実行結果

ctor
test
dtor

GCのテスト

無駄なnewを繰り返して様子を見る。

a.d

public class Test
{
	public  this() { printf("ctor: %x\n", this); }
	public ~this() { printf("dtor: %x\n", this); }
}

int main(char[][] args)
{
	for (int i = 0; i < 20; i++) new Test();
	return 0;
}

実行結果

ctor: 003D2BB0
ctor: 003D2CE0
(中略)
ctor: 003D2D08
ctor: 003D2CE0
dtor: 003D2CE0
dtor: 003D2D30
dtor: 003D2D08
dtor: 003D61F8
dtor: 003D6328

Monaでの実行例

05.png

ソース: file05.zip

MENU

now: 4

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2897, today: 1, yesterday: 0

添付ファイル: file05.zip 985件 [詳細] file05.png 718件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3889d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.068 sec.