This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #75156] fix the return value and bits for removing a closed fh
authorTony Cook <tony@develop-help.com>
Wed, 18 Sep 2013 05:55:12 +0000 (15:55 +1000)
committerTony Cook <tony@develop-help.com>
Mon, 11 Nov 2013 00:48:03 +0000 (11:48 +1100)
dist/IO/lib/IO/Select.pm
dist/IO/t/io_sel.t

index 756a299..994f896 100644 (file)
@@ -11,7 +11,7 @@ use warnings::register;
 use     vars qw($VERSION @ISA);
 require Exporter;
 
-$VERSION = "1.21";
+$VERSION = "1.22";
 
 @ISA = qw(Exporter); # This is only so we can do version checking
 
@@ -86,15 +86,24 @@ sub _update
      $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;
+       $fn = 0;
+       for my $fe (@{$vec}[FIRST_FD .. $#$vec]) {
+         if (defined($fe) && $fe == $f) {
+          $vec->[FD_COUNT]--;
+          $fe = undef;
+          vec($bits, $fn, 1) = 0;
+          last;
+        }
+        ++$fn;
+       }
+     }
+     else {
+       my $i = $fn + FIRST_FD;
+       next unless defined $vec->[$i];
+       $vec->[FD_COUNT]--;
+       vec($bits, $fn, 1) = 0;
+       $vec->[$i] = undef;
      }
-     my $i = $fn + FIRST_FD;
-     next unless defined $vec->[$i];
-     $vec->[FD_COUNT]--;
-     vec($bits, $fn, 1) = 0;
-     $vec->[$i] = undef;
    }
    $count++;
   }
index bd61b68..34af03a 100644 (file)
@@ -143,9 +143,9 @@ print "ok 23\n" ;
     print "ok 24 - added socket\n";
     close $fh;
     print "not " unless $sel->remove($fh) == 1;
-    print "ok 25 - removed closed socket # TODO code doesn't update count\n";
+    print "ok 25 - removed closed socket\n";
     print "not " unless $sel->count == 1;
     print "ok 26 - count() updated\n";
     print "not " unless $sel->bits ne $oldbits;
-    print "ok 27 - bits() updated # TODO code doesn't update bits\n";
+    print "ok 27 - bits() updated\n";
 }