summaryrefslogtreecommitdiff
path: root/win32/win32sck.c
diff options
context:
space:
mode:
authorJan Dubois <jand@activestate.com>2009-05-11 15:21:27 -0700
committerVincent Pit <perl@profvince.com>2009-05-13 09:59:49 +0200
commitf7bbabd3deb33ca111eb6b17f0252ad07f079f16 (patch)
tree059f6d4f588f446fa616e2498069bbe5dfaf2105 /win32/win32sck.c
parent8d1c3e263ba02c52927c03abb5de6a47cf4a89f8 (diff)
downloadperl-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.c35
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