[EMAIL PROTECTED] (Ton Hospel) writes:

> In article <[EMAIL PROTECTED]>,
>       Rafael Garcia-Suarez <[EMAIL PROTECTED]> writes:
> > Ok, select($$$$) now returns undef on error as of change #24223.
> 
> /me raises the backward compatibility police card
> 
> For what it's worth, I think this is a bad idea.

I can agree that it is a bad idea unless it can be demonstrated that a
majority of usages of this function assumed undef on error.
Fortunately we do have CPAN that can be used to do some statistical
analysis of its usage.  I don't think we should keep this change until
somebody that care enough do this analysis.  I assume this change is
an experiment by Rafael to figure out how many would scream up about
such a change.  I'm surprised by how few do.

> First of all it basically breaks the error handling in all my
> select() code where I typically do something like:
> 
>  if (select(..) >= 0) {
>      play a bit with time and handles, i don't really care what the exact
>      number that got returned is
>  } elsif ($! == EINTR) {
>      redo some loop;
>  } else {
>      die "Unexpectedd select failure: $!"
>  }
> 
> So now I'll get pointless undef warnings in the failure case and will never
> get to the die even if I want it to.

So, how did you figure out this was the right way?  Did you read the
source code for pp_sselect, did you find this by experimentation or
was this just the obvious mapping to you?

I know I got it wrong because it was "obvious" to me that select
worked like sysread, which is a function you will almost always use
together with select.

> So it DOES break existing code.

It sure does.

> And fixing it so it works on *both* versions of perl gets messy too.

I don't know anything better than:

   my $nfound = select(...);
   $nfound = undef if $nfound == -1;
   if (defined $nfound) {
       # play a bit with time and handles
   }
   else {
       # failed; check $!
   }

or make a wrapper for select that does this.

> Also notice that there are other calls in perl that do the -1 on failure,
> see tell(), waitpid(), wait(), syscall(). So it isn't as if it happens
> nowhere else in perl.

Seems to kill the consistency with sysread argument. There is no way
we can get consistency between the various builtin functions anyway so
why try.

--Gisle

Reply via email to