小松です。

In the message of [ruby-list:19858] Re: [mswin32] TCPSocket::new() raises Errno::ENOENT 
    on 1999/12/23 14:39:29 Katsuyuki Komatsu <komatsu / sarion.co.jp> wrote:
|ソケットハンドルをDuplicateする方が望ましいと思います。
|98とNT4.0+SP5上で
|    ruby 1.5.0 (1999-12-14) [i386-mswin32]
|で確認しました。

FILE *のリークはなくなったのですが、[ruby-list:19789][ruby-list:19858]のどちらを使ってもまだハンドルがリーク
しています。

closesocket()は必ず呼ぶ必要があるようなので、fclose()を置き換える
という手を試してみました。

これで、一応ハンドルリークはなくなったようなのですが、fclose()を
置き換えるよりrubyio.hのstruct OpenFileにソケットかどうかのフラグ
を立てて、そちらで条件判定する方がいいかも。

# ext/socket/socket.cでソケットハンドルのクローズにclose()を使っている
# 所も直さないと……

--- win32/win32.c.dist Mon Nov 8 12:57:01 1999 +++ win32/win32.c Thu Dec 23 19:05:24 1999 @@ -312,4 +312,28 @@ myget_osfhandle(int fh) } +#undef fclose + +int +myfdclose(FILE *fp) +{ + char sockbuf[80]; + int fd; + int optlen; + int retval; + + fd = get_osfhandle(fileno(fp)); + optlen = sizeof(sockbuf); + retval = getsockopt((SOCKET)fd, SOL_SOCKET, SO_TYPE, sockbuf, &optlen); + if (retval == SOCKET_ERROR) { + int iRet; + + iRet = WSAGetLastError(); + if (iRet == WSAENOTSOCK || iRet == WSANOTINITIALISED) + return fclose(fp); + } + retval = fclose(fp); + closesocket(fd); + return retval; +} FILE * @@ -1656,12 +1680,4 @@ myfdopen (int fd, const char *mode) return _fdopen(fh, mode); // return file pointer } - - -void -myfdclose(FILE *fp) -{ - fclose(fp); -} -
// --- win32/win32.h.dist Fri Aug 13 14:45:20 1999 +++ win32/win32.h Thu Dec 23 19:02:13 1999 @@ -172,5 +172,5 @@ extern int mypclose(FILE *); extern int flock(int fd, int oper); extern FILE * myfdopen(int, const char *); -extern void myfdclose(FILE *); +extern int myfdclose(FILE *); extern SOCKET myaccept(SOCKET, struct sockaddr *, int *); extern int mybind(SOCKET, struct sockaddr *, int); @@ -263,4 +263,9 @@ extern char *mystrerror(int); #endif #define fdopen myfdopen + +#ifdef fclose +#undef fclose +#endif +#define fclose myfdclose #ifdef accept -- 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>