Date: Fri, 30 Mar 2001 08:13:09 -0600 From: "Thomas T. Veldhouse" <veldy@veldy.net> To: "Valentin Nechayev" <netch@iv.nn.kiev.ua>, "Brian Matthews" <blm@actzero.com> Cc: "'freebsd-stable@freebsd.org'" <freebsd-stable@FreeBSD.ORG> Subject: Re: Threads vs. blocking sockets Message-ID: <005901c0b923$8d04f480$3028680a@tgt.com> References: <F0D64494733BD411BB9A00D0B74A0264021C9B@cpe-24-221-167-196.ca.sprintbbd.net> <20010330005243.A298@iv.nn.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
>
> It is not correct even in case of single-threaded program. Consider,
> for example, a case when waiting on blocking call is interrupted
> with signal. If send() already transferred some data, it will return
> number of bytes sent. If none data transferred, it will return -1 and
> EINTR in errno. If you rely on sending all data in send() without
> checking, your code is buggy.
>
> > As the standard FreeBSD threads are user space, they obviously can't let
the
> > socket call really block, so behind the scenes all sockets are created
as
> > nonblocking. However, I would then expect the threaded versions of the
data
> > transfer calls (send*, etc.) to loop over the actual system calls. They
> > actually do so to catch EWOULDBLOCK/EAGAIN (see
> > /usr/src/lib/libc_r/uthread/uthreads_sendto.c for example), but don't to
> > make sure all the requested data is transferred. This seems to me like a
> > bug.
> >
> > Thoughts, comments?
>
> Amount of data sent is implementation-, environment- and
randomness-dependent.
> Your current code works in 99.9% cases, but it is buggy. Fix it.
>
Nice little tidbit for you:
int sendall(int sd, const char * buf, int * len) {
int total = 0;
int bytesleft = *len;
int n;
while (total < *len) {
n = send(sd, buf + total, bytesleft, 0);
if (n == -1)
break;
total += n;
bytesleft -= n;
}
*len = total;
return n == -1 ? -1 : 0;
}
I think you can thank Beej for this function.
Tom Veldhouse
veldy@veldy.net
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?005901c0b923$8d04f480$3028680a>
