Rui (2007/05/14 20:35:58 PDT): Lingrに書いた件。Linux/AMD64でsrc/test-arith.cの次のテストに失敗するようです。
test_half("double->half, rounding", 0x3ffe, Scm_DoubleToHalf(1.99853515625)); /* m=#b1111111110.10 */
testing double->half, rounding, expects 3ffe =>ERROR: got 3fff
備前さんの話だとNetBSD/amd64では次のエラーがでるとのこと。エラーになるテストが違います。
testing double->half, rounding, expects 3fff =>ERROR: got 3ffe
/*ここと*/ if (m%2 == 1) { if (r == 0) { /* half point. we round to even */ if (m&2) m += 2; } else { m += 2; } } /*ここと*/ /* drop rounding bits */ m >>= 1; if (m >= 0x800) { e += 1; m >>= 1; } if (e == 0 && m >= 0x400) { e += 1; m &= ~0x400; } /*ここ*/のmの値を16進でダンプするようにして、failするケースでのダンプ結果を もらえませんか。
--- number.c 17 Jul 2007 03:24:49 -0000 1.148 +++ number.c 7 Aug 2007 03:50:16 -0000 @@ -38,6 +38,7 @@ #include <string.h> #include <ctype.h> #include <float.h> +#include <stdio.h> #define LIBGAUCHE_BODY #include "gauche.h" #include "gauche/bignum.h" @@ -346,6 +347,7 @@ #endif /*SIZEOF_LONG < 8*/ m += 1<<(mbits+1); /* recover hidden bit */ + fprintf(stderr, "DUMP#1: v = %lf, m = %lx\n", v, m); if (m%2 == 1) { if (r == 0) { /* half point. we round to even */ @@ -356,6 +358,7 @@ } /* drop rounding bits */ + fprintf(stderr, "DUMP#2: v = %lf, m = %lx\n", v, m); m >>= 1; if (m >= 0x800) { e += 1; @@ -368,6 +371,7 @@ if (e >= 31) { /* overflow by rounding */ return dd.components.sign? 0xfc00 : 0x7c00; } + fprintf(stderr, "DUMP#3: v = %lf, m = %lx\n", v, m); /* at this point, normalized numbers should get 0x400 <= m <= 0x7ff, e > 0, and denormalized numbers should get 0 <= m <= 0x3ff, e == 0. So we don't need to treat denormalizedこのパッチを当てて、src/test-arith を実行した抜粋です。
: DUMP#1: v = 1.998779, m = ffd DUMP#2: v = 1.998779, m = ffd DUMP#3: v = 1.998779, m = 7fe testing double->half, rounding, expects 3fff =>ERROR: got 3ffe :他は全てokでした。ちなみに実機はKahuaプロジェクトのサーバなので、shiroさんなら直接試してもらえます。
--- src/number.c 17 Jul 2007 03:24:49 -0000 1.148 +++ src/number.c 7 Aug 2007 07:23:24 -0000 @@ -339,10 +339,10 @@ all 0 or not. */ #if SIZEOF_LONG >= 8 m = dd.components.mant >> (52-mbits-1); - r = dd.components.mant & ((1 << (52-mbits-1)) - 1); + r = dd.components.mant & ((1UL << (52-mbits-1)) - 1); #else /*SIZEOF_LONG < 8*/ m = dd.components.mant0 >> (20-mbits-1); - r = (dd.components.mant0 & ((1 << (20-mbits-1)) - 1))|dd.components.mant1; + r = (dd.components.mant0 & ((1UL << (20-mbits-1)) - 1))|dd.components.mant1; #endif /*SIZEOF_LONG < 8*/ m += 1<<(mbits+1); /* recover hidden bit */
srfi-13 で (string-downcase! str) とするとエラーになります。
gosh> (use srfi-13) #<undef> gosh> (define s (list->string (string->list "HELLO"))) ;; mutable string のつもり s gosh> s "HELLO" gosh> (string-downcase s) ;; これは期待通り。(副作用なし) "hello" gosh> s "HELLO" gosh> (string-downcase! s) ;; ここが期待とは違う。(副作用あり!) *** ERROR: real number required: #<undef> Stack Trace: _______________________________________ gosh> (string-downcase! s 0 1) ;; start と end を与えると動く。 "hELLO" gosh> s "hELLO" gosh> (string-downcase! s 0) ;; start=0 だと動かないんだけど、 *** ERROR: real number required: #<undef> Stack Trace: _______________________________________ gosh> (string-downcase! s 1) ;; start=1 だと動く。 "hello" gosh> s "hello"
Gauche 0.8.8 までは動いていたんですけど, Gauche 0.8.10 にバージョンアップしたら動かなくなってしまいました。yuki (2007/07/31 06:54:23 PDT)
--- libsrc/srfi-13.scm 2 Mar 2007 07:39:12 -0000 1.6 +++ libsrc/srfi-13.scm 31 Jul 2007 18:44:54 -0000 @@ -597,7 +597,7 @@ (define (%string-*case! converter) (lambda (s . args) - (let-optionals* args ((start 0) end) + (let-optionals* args ((start 0) (end (string-length s))) (if (and (= start 0) (= end (string-length s))) (%string-replace-body! s (converter s)) (string-copy! s start (converter s start end))))))ただ、他のScheme用に書かれたライブラリを流用しているなら仕方ありませんが、 Gauche用に書いたものなら、string-downcase! などの文字列変更系の関数を 使う意味は全く無いです。一度string-downcaseなどの副作用無し版を適用して、 結果を入れ替える、という操作を行っているだけなので。
'string=?を比較関数としたハッシュテーブルに、キー()で値を入れると、セグメンテーション違反になりました。 環境は、Linux(Fedora core 3) i386 32bitです。
koguro(2007/07/10 07:25:32 PDT): もしかしたら gensym の使い方が間違っているのかもしれませんが、以下のようなケースで一致すると思われるシンボルの比較が不一致となります。
gosh> (define a (gensym)) a gosh> a G1 gosh> (eq? a (string->symbol "G1")) #f
-2007/07/10 07:53:55 PDT: gensymはどのシンボルとも異なるシンボルを生成します。そのため、string->symbolで同じシンボルが生成されては意味がなくなりますし、できません。この例の場合はGaucheにおけるgensymで生成されたシンボルに対する外部表現が普通のシンボルのものと区別が付かないことが問題なのだと思います。(LISP/Schemeは少しかじっただけの初心者なので外してるかも知れません。どなたかフォローをお願いします)
shinya (2007/07/05 02:16:55 PDT):
gosh> (use gauche.uvector) #<undef> gosh> (use gauche.vport) #<undef> gosh> (define wv (make-weak-vector 2)) wv gosh> (define buf (make-u8vector 1)) buf gosh> (define in (open-input-uvector buf)) in gosh> (weak-vector-set! wv 0 buf) #<undef> gosh> (weak-vector-set! wv 1 in) #<undef> gosh> wv #,(<weak-vector> 2 #u8(0) #<buffered-input-port #f 00A284D0>) gosh> (set! buf #f) #f gosh> (set! in #f) #f gosh> (gc) #<undef> gosh> (gc) #<undef> gosh> wv #,(<weak-vector> 2 #u8(0) #f)
open-input-uvectorの替わりに下のtest1を使っても同様にGCされませんが、test2だとGCされるので、letrecがあやしいように思います。
(define (test1 uvector) (letrec ((filler (lambda (vec) (u8vector-length uvector)))) (make <buffered-input-port> :fill filler))) (define (test2 uvector) (let1 filler (lambda (vec) (u8vector-length uvector)) (make <buffered-input-port> :fill filler)))
(let loop ((a 0)) (if (> a 10000) 0 (+ a (loop (+ a 1)))))私の環境ではこれでgcされます。VMスタックにuvectorへの参照が残っていたのでしょう。 普通のケースではプログラムの進行につれスタックが上書きされるので滅多に 問題にはならないと思いますが、weak-gc robustでない構造へのポインタが そういうふうに残っている場合は注意が必要ですね。
(use gauche.uvector) (use gauche.vport) (define (main args) (while #t (display ".")(flush) (let1 buf (make-u8vector 1000000) (open-input-uvector buf))))
(2007/07/02 02:49:36 PDT): compile.scmを読んでいて、どうなんだろう?と思い下記の例を実行するとsiscと動作が異なります。siscと同じ動作にしようと思うと#<subr continuation>を起動したときに、inline展開を剥しまくるか再コンパイルしないといけなくなるので、「現在の動作が仕様」と言ってしまうのが良いかもしれません。
gosh> (define (f) (let1 x #f (call/cc (lambda (c) (set! x c))) (display (+ 3 4)) x)) f gosh> (define g (f)) 7g gosh> (g) 7g gosh> (define + -) + gosh> (g) 7g
siscだと(g)でdisplayされるのは-1になります。また、(g)の結果が#<subr continuation>ではなくgと表示されるのが面白いですね。 -- dsk
2007/06/28 03:42:25 PDT SICPの問題3.23(dequeueを作る)で作ったプログラムを走らせたら Segmentation faultに遭遇しました。
Shiro(2007/07/01 00:55:09 PDT): 再現プログラムはちょっと長いので消しときました。 原因は、errorの出力ルーチンが循環構造のあるオブジェクトをちゃんと 処理していなかったことにありました。これだけで再現します:
gosh> (error "foo" '#0=(#0#)) Segmentation fault
たぶんこれで大丈夫じゃないかな。
--- src/scmlib.scm 16 Apr 2007 03:47:13 -0000 1.13 +++ src/scmlib.scm 1 Jul 2007 07:54:43 -0000 @@ -234,7 +234,7 @@ (if (null? args) (get-output-string p) (begin (display " " p) - (write (car args) p) + (write/ss (car args) p) (loop (cdr args))))))) (define (scan-keys args) (let loop ((args args) @@ -265,9 +265,9 @@ (if (null? msgs) (apply make fmt keys) (apply make fmt - :message (apply format #f msgs) + :message (apply format/ss #f msgs) keys)))) - (else (make <error> :message (apply format #f fmt args)))))) + (else (make <error> :message (apply format/ss #f fmt args)))))) (values error errorf)))
(2007/06/27 04:39:27 PDT):意外なことに、identity関数のエントリーがない!?
@deffn {Generic function} group-collection coll &keyword key test @c EN Generalized @code{partition}. Groups elements in @var{coll} into those who has the same key value, and returns the groups as of lists. Key values are calculated by applying the procedure @var{key} to each element of @var{coll}. The default value of @var{key} is @code{identity}. For each element of @var{coll}, @var{key} is applied exactly once. The equal-ness of keys are compared by @var{test} procedure, whose default is @code{eqv?}.のように identity という関数が説明につかわれています.これを values に 置き換えると何か違和感に「醸される」感があります.(私だけかもしれんけ ど...)
koguro(2007/06/16 22:59:15 PDT): write-blockでエンディアンを変更してデータを出力するとデータを余分に出力してしまうようです。
gosh> (use gauche.uvector) #<undef> gosh> (call-with-output-string (lambda (out) (write-block (make-u16vector 1) out 0 -1 'big-endian))) "\0\0\0V\0\0\0\0\0?\0V\0\0" gosh> (call-with-output-string (lambda (out) (write-block (make-u16vector 1) out 0 -1 'little-endian))) "\0\0" (x86の場合)
び(2007/06/05 21:36:25 PDT): 新しい let-keywords に対応する途中だったのかしら。
--- lib/rfc/http.scm 2 Mar 2007 07:39:10 -0000 1.11 +++ lib/rfc/http.scm 6 Jun 2007 04:30:26 -0000 @@ -125,25 +125,25 @@ (values code headers (and has-content? - (let ((sink (open-output-string)) - (flusher (lambda (sink _) (get-output-string sink)))) + (let-keywords options + ((sink (open-output-string)) + (flusher (lambda (sink _) (get-output-string sink))) + . #f) (receive-body in headers sink flusher)))))))) (let-keywords options - ((sink (open-output-string)) - (flusher (lambda (sink h) (get-output-string sink))) - (host (server->host server)) + ((host (server->host server)) (no-redirect #f) . restopts) (let1 has-content? (not (eq? request 'HEAD)) (if no-redirect - (%send-request request server host request-uri has-content? options) + (%send-request request server host request-uri has-content? restopts) (let loop ((history (list (values-ref (canonical-uri request-uri host) 0))) (server server) (host host) (request-uri request-uri)) (receive (code headers body) - (%send-request request server host request-uri has-content? options) + (%send-request request server host request-uri has-content? restopts) (cond ((and (string-prefix? "3" code) (assoc "location" headers)) => (lambda (loc)
% gosh gosh> (cond (1 . 2)) zsh: segmentation fault (core dumped) gosh
ついでにこれも。
(case 0 (else 1 . 2))
0.8.10です。既知の事であれば、すみませんが。
ext/netでのmake checkが、Testing net ...と出たまま戻ってきません。^Cで止めると、以下のようにfailed以降を表示します。
$ uname Linux ****** 2.4.31-v2 #1 SMP Thu Aug 25 15:40:42 JST 2005 i686 i686 i386 GNU/Linux $ cd ext/net ; make check GAUCHE_TEST_RECORD_FILE=../..//test.record ../..//src/gosh -ftest -I. test.scm > test.log Testing net ... failed. discrepancies found. Errors are: test getsockname/getpeername: expects #t => got #f test udp client socket: expects "ABC" => got #<error "unhandled signal 2 (SIGINT)"> $
他のcheck(test)は問題有りません。net周りの仕様が変わったためでしょうか。
(sys-select #f #f #f 300000)のようにディレイを入れて子プロセスのサーバが立ち上がる余裕を与えてるんですが、 試しに300000を1000000程度にしてやってみてください。 もしかすると子プロセスがちゃんと立ち上がる前にメインプロセスからパケットを 送っちゃってるのかもしれない。
OSはNetBSD current(4.99.19)です。
Testing net ... failed. discrepancies found. Errors are: test getprotobyname: expects (("ip" 0) ("tcp" 6) ("udp" 17)) => got (("ip" 4) ("tcp" 6) ("udp" 17)) test getprotobynumber: expects (#t #t #t) => got (#f #t #t)
ということで2箇所failします。cut-sea:2007/05/17 03:01:27 PDT
Modified Julian Day が「改訂ユリウス日」と訳されていますが、通常は「修正ユリウス日」と訳すと思います。 2007/05/17 02:42:55 PDT
Rui (2007/05/14 20:35:58 PDT): Lingrに書いた件。(sockaddr-addr <sockaddr-in6>)のテストがLinux/AMD64で通りません。ntohlがint32_tでなければいけないので。
--- Gauche-0.8.10.orig/ext/net/netlib.stub 2007-04-18 11:08:29.000000000 +0900 +++ Gauche-0.8.10/ext/net/netlib.stub 2007-05-13 20:49:11.000000000 +0900 @@ -88,16 +88,16 @@ (expr "sym_inet6")) (define-cmethod sockaddr-addr ((addr "Scm_SockAddrIn6Class")) - "#define BN_SIZE (16 / SIZEOF_LONG) - ScmSockAddrIn6 *a = (ScmSockAddrIn6*)addr; - u_long values[BN_SIZE]; - u_long *p = (u_long*)a->addr.sin6_addr.s6_addr; + "ScmSockAddrIn6 *a = (ScmSockAddrIn6*)addr; + ScmUInt32 values[4]; + ScmUInt32 *p = (ScmUInt32*)a->addr.sin6_addr.s6_addr; int i; - ScmObj bn; + ScmObj bn = Scm_MakeBignumFromUI(ntohl(*p++)); - for (i = 0; i < BN_SIZE; i++) values[BN_SIZE-i-1] = ntohl(*p++); - bn = Scm_MakeBignumFromUIArray(1, values, BN_SIZE); - SCM_RETURN(Scm_NormalizeBignum(SCM_BIGNUM(bn)));") + for (i=0; i<3; i++) { + bn = Scm_LogIor(Scm_Ash(bn, 32), Scm_MakeBignumFromUI(ntohl(*p++))); + } + SCM_RETURN(bn);") (define-cmethod sockaddr-port ((addr "Scm_SockAddrIn6Class")) " ScmSockAddrIn6 *a = (ScmSockAddrIn6*)addr;
skimuさんのbfc.scmでquine.bをコンパイルして生成したschemeコードを
評価するとセグメンテーションフォールトでコアダンプします。
NetBSD currentとubuntu 7.04で確認。
どうやらコンパイルして生成したコードの尻から3つめの、
少し大きめのloop式の前までは評価できているけど、
そのloop式を含めるとアウトになるようです。cut-sea:2007/05/10 05:42:18 PDT
cut-sea@nkisi> gosh -V Gauche scheme interpreter, version 0.8.11 [euc-jp,pthreads] cut-sea@nkisi> ./bfc.scm quine.b | gosh Segmentation fault (core dumped) cut-sea@nkisi>
tabe(2007/04/29 20:56:02 PDT) 関数内部で ftp-login に引数を :user でなく :username で渡す必要があるようです。
gosh> (use rfc.ftp) #<undef> gosh> (call-with-ftp-connection "tabe@localhost" ftp-help) WARNING: unknown keyword :user "214-The following commands are recognized.\n ABOR ACCT ALLO APPE CDUP CWD DELE EPRT EPSV FEAT HELP LIST MDTM MKD\n MODE NLST NOOP OPTS PASS PASV PORT PWD QUIT REIN REST RETR RMD RNFR\n RNTO SITE SIZE SMNT STAT STOR STOU STRU SYST TYPE USER XCUP XCWD XMKD\n XPWD XRMD" gosh>
パッチ:
Index: lib/rfc/ftp.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/lib/rfc/ftp.scm,v retrieving revision 1.5 diff -c -r1.5 ftp.scm *** lib/rfc/ftp.scm 2 Mar 2007 07:39:10 -0000 1.5 --- lib/rfc/ftp.scm 30 Apr 2007 03:37:44 -0000 *************** *** 73,79 **** (receive (user host port) (uri-decompose-authority uri) (let1 conn (apply ftp-login host (cond-list ! (user @ (list :user user)) (port @ (list :port port)) (#t @ keys))) (unwind-protect (proc conn) --- 73,79 ---- (receive (user host port) (uri-decompose-authority uri) (let1 conn (apply ftp-login host (cond-list ! (user @ (list :username user)) (port @ (list :port port)) (#t @ keys))) (unwind-protect (proc conn)
shinya(2007/04/28 03:22:42 PDT): Bignumとinfinityを比較するとエラーになります
gosh> (< 10000000000000 #i1/0) *** ERROR: can't convert inf to an integer Stack Trace: _______________________________________
パッチ
Index: number.c =================================================================== RCS file: /cvsroot/gauche/Gauche/src/number.c,v retrieving revision 1.146 diff -u -r1.146 number.c --- number.c 26 Mar 2007 23:59:54 -0000 1.146 +++ number.c 28 Apr 2007 10:16:15 -0000 @@ -2318,9 +2318,12 @@ if (r > 0) return 1; return 0; } - if (SCM_BIGNUMP(arg1)) - return Scm_BignumCmp(SCM_BIGNUM(Scm_MakeBignumFromDouble(SCM_FLONUM_VALUE(arg0))), - SCM_BIGNUM(arg1)); + if (SCM_BIGNUMP(arg1)) { + double r = SCM_FLONUM_VALUE(arg0) - Scm_BignumToDouble(SCM_BIGNUM(arg1)); + if (r < 0) return -1; + if (r > 0) return 1; + return 0; + } if (SCM_RATNUMP(arg1)) { double r = SCM_FLONUM_VALUE(arg0) - Scm_GetDouble(arg1); if (r < 0) return -1; @@ -2334,8 +2337,7 @@ return Scm_BignumCmp(SCM_BIGNUM(arg0), SCM_BIGNUM(Scm_MakeBignumFromSI(SCM_INT_VALUE(arg1)))); if (SCM_FLONUMP(arg1)) - return Scm_BignumCmp(SCM_BIGNUM(arg0), - SCM_BIGNUM(Scm_MakeBignumFromDouble(SCM_FLONUM_VALUE(arg1)))); + return -Scm_NumCmp(arg1, arg0); if (SCM_BIGNUMP(arg1)) return Scm_BignumCmp(SCM_BIGNUM(arg0), SCM_BIGNUM(arg1)); if (SCM_RATNUMP(arg1)) {
齊藤(2007/04/27 20:48:15 PDT):最後の要素の2個目以降の値がmapの返り値になっているようです。R5RSを読み返しても明確に規定されていることでは無いようですが、奇妙な挙動に見えます。
gosh> (map (cut apply values <>) '((1 2) (3 4) (5 6))) (1 3 5) 6
Proc must be a procedure that takes as many arguments as there are lists and returns a single value.
Shiro(2007/04/26 20:33:31 PDT):
diff -u -r1.23 port.h --- port.h 16 Apr 2007 03:47:13 -0000 1.23 +++ port.h 27 Apr 2007 03:32:59 -0000 @@ -349,21 +349,21 @@ SCM_EXTERN ScmObj Scm_MakeInputStringPort(ScmString *str, int privatep); SCM_EXTERN ScmObj Scm_MakeOutputStringPort(int privatep); -#if defined(GAUCHE_API_0_9) || defined(LIBGAUCHE_BODY) +#if defined(GAUCHE_API_0_8_10) || defined(GAUCHE_API_0_9) || defined(LIBGAUCHE_BODY) SCM_EXTERN ScmObj Scm_GetOutputString(ScmPort *port, int flags); SCM_EXTERN ScmObj Scm_GetOutputStringUnsafe(ScmPort *port, int flags); SCM_EXTERN ScmObj Scm_GetRemainingInputString(ScmPort *port, int flags); +#else /* !defined(GAUCHE_API_0_8_10) && !defined(GAUCHE_API_0_9) && !defined(LIBGAUCHE_BODY) */ +#define Scm_GetOutputString(p) Scm__GetOutputStringCompat(p) +#define Scm_GetOutputStringUnsafe(p) Scm__GetOutputStringUnsafeCompat(p) +#define Scm_GetRemainingInputString(p) Scm__GetRemainingInputStringCompat(p) + /* For backward compatibility */ SCM_EXTERN ScmObj Scm__GetOutputStringCompat(ScmPort *port); SCM_EXTERN ScmObj Scm__GetOutputStringUnsafeCompat(ScmPort *port); SCM_EXTERN ScmObj Scm__GetRemainingInputStringCompat(ScmPort *port); - -#else /* !defined(GAUCHE_API_0_9) && !defined(LIBGAUCHE_BODY) */ -#define Scm_GetOutputString(p) Scm__GetOutputStringCompat(p) -#define Scm_GetOutputStringUnsafe(p) Scm__GetOutputStringUnsafeCompat(p) -#define Scm_GetRemainingInputString(p) Scm__GetRemainingInputStringCompat(p) -#endif /* !defined(GAUCHE_API_0_9) && !defined(LIBGAUCHE_BODY) */ +#endif /* !defined(GAUCHE_API_0_8_10) && !defined(GAUCHE_API_0_9) && !defined(LIBGAUCHE_BODY) */ /*================================================================ * Other type of ports
Shiro(2007/04/26 20:33:31 PDT): ext/sys/auxsys.scmにtypoがあります。
--- auxsys.scm 28 Mar 2007 22:29:56 -0000 1.19 +++ auxsys.scm 23 Apr 2007 08:32:53 -0000 1.20 @@ -52,7 +52,7 @@ ;; define alternatives if the platform doesn't support... (cond-expand - ((not gauche.sys.reaplath) + ((not gauche.sys.realpath) (define sys-realpath #f)) ; make autoload happy (else))
齊藤(2007/04/21 23:35:29 PDT): slibのreplを使うとプロンプトの表示がおかしいです。現行ではforce-outputは何もしていませんが、flushすればいいんじゃないでしょうか。こんなカンジで。
(define (force-output . arg) (apply flush arg) #t)
shinya(2007/04/21 04:28:54 PDT): プロファイラを利用するとポートがGCされないようです。次のようにして確認しました。
$ cat port-test.scm (use gauche.collection) (define port-table (make-weak-vector 300)) (dotimes (cnt 300) (format #t "cnt:~d active:~d\n" cnt (length (filter identity port-table))) (call-with-output-file #`"test-file-,|cnt|" (lambda (out) (weak-vector-set! port-table cnt out) (write "test" out)))) $ gosh -ptime port-test.scm cnt:0 active:0 cnt:1 active:1 : (省略) : cnt:253 active:253 cnt:254 active:254 active buffered port table overflow
Shiro(2007/08/06 20:34:28 PDT): このコードの場合、call-with-output-fileがoutへのポインタを保持した ScmSubrを生成していて、それがプロファイリングに記録されちゃっているようです。 プロファイラはサンプリングにせよコールカウントにせよオブジェクトへのポインタを 保持するので、GCされないオブジェクトが出てくるのはある意味仕方ないです (ポインタをdisguiseしたりweakに記録することにより「GCされない」問題は解決 しますが、そうするとプロファイル時に記録されたオブジェクトが集計時にGCされて しまっている可能性があり、正しい集計が行えません)。
ただ、この特定の問題に関してはclose時に内部ポートテーブルの内容をクリアする ことで対応可能だと思います。
あと、ScmSubrのサンプリングは名前だけ記録する、とかにしても余分な オブジェクトが生き残ってしまうケースが減らせるかもしれません。
Shiro(2007/08/09 19:05:17 PDT): とりあえず内部ポートテーブルがfullになる問題には 対応しました。
齊藤(2007/04/20 05:12:37 PDT): 532行目
static void init_winwock(void)