[Ace-users] [ace-users] ACE_SOCK_Stream::recv_n() returns -1 if interrupted by signal
Jules d'Entremont
Jules.dEntremont at SolaceSystems.com
Thu Oct 25 08:06:23 CDT 2007
> > If ACE_SOCK_Stream::recv_n() is interrupted by a signal, it returns
-1 and sets errno to EINTR. Since this function is
> > expected to retry in case of a short read, it would be better for
the function to continue when interrupted, up to the time
> > specified in the timeout.
>
> I don't think a signal is the same thing as a short read, so this fix
> would be making too much of a "policy" decision that may not be wanted
> by all users by default. Can't you simply use ACE_Sig_Action to
ignore
> the signal(s)? I think this will have the same effect without
breaking
> existing semantics/programs.
I don't have control over which signals are being used by the
application (I'm developing an SDK which is used by others). In fact,
in this case, the signal (SIGALRM) is used by the application, so it
can't be ignored.
As it is, I'm forced to write the following function and use it instead
of ACE_SOCK_Stream::recv_n():
ssize_t
recv_n(
ACE_SOCK_Stream& sock,
void* buf,
size_t len,
const ACE_Time_Value* timeout)
{
ssize_t retval = 0;
do
{
retval = sock.recv_n(buf, len, timeout);
} while ((retval == -1) && (errno == EINTR));
return retval;
}
To me, this seems to defeat the purpose of ACE_SOCK_Stream::recv_n().
Jules.
> Thanks,
>
> Doug
More information about the Ace-users
mailing list