Date: Sun, 16 Jul 2000 12:20:02 -0700 (PDT) From: "Chris McClellen" <chrismcc@mindspring.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/19871 Message-ID: <200007161920.MAA68177@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/19871; it has been noted by GNATS. From: "Chris McClellen" <chrismcc@mindspring.com> To: <bug-followup@freebsd.org> Cc: Subject: Re: kern/19871 Date: Sun, 16 Jul 2000 15:16:23 -0400 This is a multi-part message in MIME format. ------=_NextPart_000_001D_01BFEF38.CDC7E5A0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit I think I have found the select problem. I've attached a patch to this email against 5.0-current. Before I explain what is happening, just know that the patch is trivial and may break the HELL out of things -- I have _not_ analyzed the impact. I ran the test in the PR and it no longer complains. However, I have not really tested anything else; even if the patch is bogus, I can still explain the problem below: fifo_open (miscfs/fifofs/fifo_vnops.c) looks like it has a 2 stage open. Stage 1 creates read/write sockets, and sets the read socket state to SS_CANTRCVMORE. However, it does _not_ set SS_CANTSENDMORE on the write socket... dont know why. Stage 2 figures out if you want read/write or both. When you open for READING, it clears SS_CANTSENDMORE. when you open for WRITING, it clears SS_CANTRCVMORE. It would seem that fifos say "you cant recv if you dont have any writers, and you cant send if you dont have any readers." Well thats the problem -- select() eventually calls soreadable(), which will return true if SS_CANTRCVMORE is set. If you look in fifo_open you'll see its always set until a writer is opened -- thus causing select() to always return immediatly until there is a writer, even though there is nothing to read. (When writer is created, the SS_CANTRCVMORE gets cleared, so now soreadble will no longer return a false positive). Since SO_CANTSENDMORE is not set when a writer is open, I figure select() will work just fine on a write-only open. So, you can probably guess the patch -- get rid of SS_CANTRCVMORE on the initial open. I dont know why its there -- and I dont know why the same isnt done for the write socket. Patch is attached, against 5.0-current. Like I said, it may be bogus but at least someone may have enough info now to do a real fix. Here's the patch inline (its attached because I am almost certain that including it in the email will f it up). Its included inline so people dont have to get the attachment: *** miscfs/fifofs/fifo_vnops.c.orig Sun Jul 16 14:47:03 2000 --- miscfs/fifofs/fifo_vnops.c Sun Jul 16 14:47:23 2000 *************** *** 202,208 **** } fip->fi_readers = fip->fi_writers = 0; wso->so_snd.sb_lowat = PIPE_BUF; - rso->so_state |= SS_CANTRCVMORE; } if (ap->a_mode & FREAD) { fip->fi_readers++; --- 202,207 ---- ------=_NextPart_000_001D_01BFEF38.CDC7E5A0 Content-Type: application/octet-stream; name="patch.fifo" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="patch.fifo" *** miscfs/fifofs/fifo_vnops.c.orig Sun Jul 16 14:47:03 2000=0A= --- miscfs/fifofs/fifo_vnops.c Sun Jul 16 14:47:23 2000=0A= ***************=0A= *** 202,208 ****=0A= }=0A= fip->fi_readers =3D fip->fi_writers =3D 0;=0A= wso->so_snd.sb_lowat =3D PIPE_BUF;=0A= - rso->so_state |=3D SS_CANTRCVMORE;=0A= }=0A= if (ap->a_mode & FREAD) {=0A= fip->fi_readers++;=0A= --- 202,207 ----=0A= ------=_NextPart_000_001D_01BFEF38.CDC7E5A0-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200007161920.MAA68177>