小田@QNES です。

---
On Thu, 23 Dec 1999 20:01:49 +0900
[[ruby-list:19861] Re: [mswin32] TCPSocket::new() raises Errno::ENOENT]
Katsuyuki Komatsu <komatsu / sarion.co.jp> wrote:

> 小松です。

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

fclose した後に closesocket すると例外しませんか?
それで悩んでfcloseだけにしたような記憶が...

fclose
get_osfhandle
closesocket
の順で行うと、get_osfhandle で bad handle が返るのですが
closesocket はエラーにもなりませんし、一見上手くいきます。
ですが、exit 処理の中で socket の cleanup 処理をしようとして
invalid handle で例外します(;_;)

もう少し考えてみないといけませんね。

ハンドルリークのチェックって、どうされているんでしょうか?
よろしかったら教えていただけませんか?
# タスクマネージャでしょうか?

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

fclose を置き換えてしまうと、File I/O 全般に影響が出そうな
気がします。

以下のパッチで myfdclose 中でfclose(=myfdclose?)を呼んでますが
大丈夫ですか?
この場合どうなるんでしょうか?
単純に考えると再帰しそうですが、上手くいくんでしょうか?

> 
> --- 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> > ∪*****/\*****\/*****/\*****∪ Koji Oda NEC Software Kyusyu 1st Development Department Based Software Division E-Mail:oda / bsd1.qnes.nec.co.jp ∩*****/\*****\/*****/\*****∩