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>