From: nobu.nakada@... Date: 2001-04-13T23:35:06+09:00 Subject: [ruby-dev:12938] Re: [ruby-list:29232] Re: Ruby プロセスが肥大化していく なかだです。 # 余談ですが。 At Fri, 13 Apr 2001 17:35:24 +0900, matz@zetabits.com (Yukihiro Matsumoto) wrote: > |> ありがとうございます。こちらでも確認しました。取り込みます。 > |> しかし、他人の書いたeval.cのような複雑なプログラムでよくリー > |> クが発見できましたね。すごいなあ。 > | > |中田さんのパッチ [ruby-list:29217]でfree()する > |対象が分かったので、同様にしただけです。すみません。 > > それも「すごいなあ」の対象です。すごいなあ > 中田さん いやどうも。まったくの力業です。Purify とか使えれば楽なんでしょ うけど、個人じゃ買えるようなもんじゃなし、ってことでこういう手 を使ってゴリゴリと。eval.c 限定品。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.172 diff -u -2 -p -r1.172 eval.c --- eval.c 2001/03/28 08:43:24 1.172 +++ eval.c 2001/04/12 15:12:02 @@ -111,4 +111,64 @@ static VALUE umethod_bind _((VALUE, VALU static VALUE rb_mod_define_method _((int, VALUE*, VALUE)); +#undef xmalloc +#undef xcalloc +#undef xrealloc +#undef xfree +#define xmalloc(size) allocated(ruby_xmalloc(size),__LINE__) +#define xcalloc(n,size) allocated(ruby_xcalloc(n,size),__LINE__) +#define xrealloc(ptr,size) reallocated(ptr, ruby_xrealloc(ptr,size)) +#define xfree(ptr) ruby_xfree(freeing(ptr)) +#define free(ptr) xfree(ptr) + +static st_table *alloc_tbl(void); + +static enum st_retval +dump_allocated_1(void *ptr, int line, void *arg) +{ + printf("%d:%p\n", line, ptr); + return ST_CONTINUE; +} + +static void +dump_allocated(void) +{ + rb_gc(); + st_foreach(alloc_tbl(), dump_allocated_1, NULL); +} + +static st_table *alloc_tbl(void) +{ + static st_table *tbl; + if (!tbl) { + tbl = st_init_numtable(); + atexit(dump_allocated); + } + return tbl; +} + +static inline void* +allocated(void *ptr, int line) +{ + st_add_direct(alloc_tbl(), ptr, (char *)line); + return ptr; +} + +static inline void* +freeing(void *ptr) +{ + if (ptr) st_delete(alloc_tbl(), &ptr, NULL); + return ptr; +} + +static inline void* +reallocated(void *optr, void *nptr) +{ + char *line = NULL; + + if (optr) st_delete(alloc_tbl(), &optr, &line); + st_add_direct(alloc_tbl(), nptr, line); + return nptr; +} + static int scope_vmode; #define SCOPE_PUBLIC 0 > |完璧には理解できていません。 > |今年中に、Rubyの実行時環境(Ruby-Stack)が本当に理解できるかどうか、 > |あやしい程度の頭です。 いや、数ヶ月足らずでこれだけ理解してるというか、あのパッチが 出てくるのはすごいです。よく分かってませんが(^^;。私なんかいま だに eval.c、regex.c、parse.y は三大鬼門ですから。 # あと win32.c も(笑)。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦