Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Mar 2001 09:27:20 -0800
From:      Brian Matthews <blm@actzero.com>
To:        "'freebsd-stable@freebsd.org'" <freebsd-stable@freebsd.org>
Subject:   Threads vs. blocking sockets
Message-ID:  <F0D64494733BD411BB9A00D0B74A0264021C9B@cpe-24-221-167-196.ca.sprintbbd.net>

next in thread | raw e-mail | index | archive | help
[I posted this to comp.unix.freebsd.misc then sent it to freebsd-questions,
neither of which elicited any responses, so this is my court of last resort.
:-)]

I was encountering some problems using sockets on FreeBSD. After some
exploration I've found that threading doesn't seem (at least in my opinion)
to handle blocking sockets correctly. Specifically, calls to send (and
presumably recv, although so far I've only doing recvs on nonblocking
sockets) on a blocking socket may return having only transferred part of the
data.

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?

Brian

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?F0D64494733BD411BB9A00D0B74A0264021C9B>