diff options
author | Jan Dubois <jand@activestate.com> | 2009-05-11 15:21:27 -0700 |
---|---|---|
committer | Vincent Pit <perl@profvince.com> | 2009-05-13 09:59:49 +0200 |
commit | f7bbabd3deb33ca111eb6b17f0252ad07f079f16 (patch) | |
tree | 059f6d4f588f446fa616e2498069bbe5dfaf2105 /win32/win32sck.c | |
parent | 8d1c3e263ba02c52927c03abb5de6a47cf4a89f8 (diff) | |
download | perl-f7bbabd3deb33ca111eb6b17f0252ad07f079f16.tar.gz |
select() generates "Invalid parameter" messages on Windows Vista.
The messages are generated by OutputDebugString() so are only visible
inside a debugger, or other debugger viewer applications.
The messages are generated by the _get_osfhandle() calls with invalid
file ids. This change makes sure it is only called when the corresponding
bit in the select() arguments has been set.
Related bug reports:
http://bugs.activestate.com/show_bug.cgi?id=82995
http://bugs.slimdevices.com/show_bug.cgi?id=11896
http://getpopfile.org/ticket/45
Even with this patch there are still residual "Invalid parameter" messages
in the debug output while building Perl itself. They are generated by
miniperl in the win32_fclose() function, again calling _get_osfhandle()
with an invalid handle. The same messages can be observed when Perl
is built *without* USE_PERLIO (just like miniperl).
Diffstat (limited to 'win32/win32sck.c')
-rw-r--r-- | win32/win32sck.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/win32/win32sck.c b/win32/win32sck.c index 2427cb3af4..7798168907 100644 --- a/win32/win32sck.c +++ b/win32/win32sck.c @@ -279,13 +279,18 @@ win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const FD_ZERO(&nwr); FD_ZERO(&nex); for (i = 0; i < nfds; i++) { - fd = TO_SOCKET(i); - if (rd && PERL_FD_ISSET(i,rd)) + if (rd && PERL_FD_ISSET(i,rd)) { + fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nrd); - if (wr && PERL_FD_ISSET(i,wr)) + } + if (wr && PERL_FD_ISSET(i,wr)) { + fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nwr); - if (ex && PERL_FD_ISSET(i,ex)) + } + if (ex && PERL_FD_ISSET(i,ex)) { + fd = TO_SOCKET(i); FD_SET((unsigned)fd, &nex); + } } errno = save_errno; @@ -293,13 +298,21 @@ win32_select(int nfds, Perl_fd_set* rd, Perl_fd_set* wr, Perl_fd_set* ex, const save_errno = errno; for (i = 0; i < nfds; i++) { - fd = TO_SOCKET(i); - if (rd && PERL_FD_ISSET(i,rd) && !FD_ISSET(fd, &nrd)) - PERL_FD_CLR(i,rd); - if (wr && PERL_FD_ISSET(i,wr) && !FD_ISSET(fd, &nwr)) - PERL_FD_CLR(i,wr); - if (ex && PERL_FD_ISSET(i,ex) && !FD_ISSET(fd, &nex)) - PERL_FD_CLR(i,ex); + if (rd && PERL_FD_ISSET(i,rd)) { + fd = TO_SOCKET(i); + if (!FD_ISSET(fd, &nrd)) + PERL_FD_CLR(i,rd); + } + if (wr && PERL_FD_ISSET(i,wr)) { + fd = TO_SOCKET(i); + if (!FD_ISSET(fd, &nwr)) + PERL_FD_CLR(i,wr); + } + if (ex && PERL_FD_ISSET(i,ex)) { + fd = TO_SOCKET(i); + if (!FD_ISSET(fd, &nex)) + PERL_FD_CLR(i,ex); + } } errno = save_errno; #else |