From owner-freebsd-questions Tue Mar 27 21:37:21 2001 Delivered-To: freebsd-questions@freebsd.org Received: from mail01.actzero.com (cpe-24-221-167-196.ca.sprintbbd.net [24.221.167.196]) by hub.freebsd.org (Postfix) with ESMTP id A94F937B71B for ; Tue, 27 Mar 2001 21:37:19 -0800 (PST) (envelope-from blm@actzero.com) Received: by cpe-24-221-167-196.ca.sprintbbd.net with Internet Mail Service (5.5.2650.21) id ; Tue, 27 Mar 2001 19:46:17 -0800 Message-ID: From: Brian Matthews To: FreeBSD Questions Subject: Threads vs. blocking sockets (was FreeBSD 4.x localhost socket pr oblem with big writes) Date: Tue, 27 Mar 2001 19:46:17 -0800 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2650.21) Content-Type: text/plain; charset="iso-8859-1" Sender: owner-freebsd-questions@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG 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 I'm 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 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 (and only half the reason you want blocking sockets is handled.) Thoughts, comments? Brian To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message