How do you know a timeout is occurring? I have a few questions:
1) I assume that $in really is the fileno for $self.
2) You do realize that you are setting both the read *and* write bits for $self/$in? This means that the select will return $found>0 if $self/$in is writable but not readable. This will cause the sysread to hang. Is that what you expect?