IO::Select: allow removal of IO::Handle objects without fileno
authorFranz Fasching <perldev@drfasching.com>
Thu, 27 Jan 2011 16:46:59 +0000 (08:46 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 27 Jan 2011 22:52:43 +0000 (14:52 -0800)
dist/IO/lib/IO/Select.pm

index fc05fe7..4020078 100644 (file)
@@ -74,9 +74,9 @@ sub _update
  foreach $f (@_)
   {
    my $fn = $vec->_fileno($f);
-   next unless defined $fn;
-   my $i = $fn + FIRST_FD;
    if ($add) {
+     next unless defined $fn;
+     my $i = $fn + FIRST_FD;
      if (defined $vec->[$i]) {
         $vec->[$i] = $f;  # if array rest might be different, so we update
         next;
@@ -85,6 +85,12 @@ sub _update
      vec($bits, $fn, 1) = 1;
      $vec->[$i] = $f;
    } else {      # remove
+     if ( ! defined $fn ) { # remove if fileno undef'd
+         defined($_) && $_ == $f and do { $vec->[FD_COUNT]--; $_ = undef; }
+           for @{$vec}[FIRST_FD .. $#$vec];
+         next;
+     }
+     my $i = $fn + FIRST_FD;
      next unless defined $vec->[$i];
      $vec->[FD_COUNT]--;
      vec($bits, $fn, 1) = 0;