Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Feb 2012 20:24:18 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r230955 - stable/9/sys/kern
Message-ID:  <201202032024.q13KOICY002733@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Fri Feb  3 20:24:18 2012
New Revision: 230955
URL: http://svn.freebsd.org/changeset/base/230955

Log:
  MFC r228510: Fix select/poll/kqueue for write on reverse direction before
  first write.
  
  The reverse direction of a pipe is lazily allocated on the first write in
  that direction (because pipes are usually used in one direction only).  A
  special case is needed to ensure the pipe appears writable before the first
  write because there are 0 bytes of pending data in 0 bytes of buffer space
  at that point, leaving 0 bytes of data that can be written with the normal
  code.
  
  Note that the first write returns [ENOMEM] if kern.ipc.maxpipekva is
  exceeded and does not block or return [EAGAIN], so selecting true for write
  is correct even in that case.
  
  PR:		kern/93685

Modified:
  stable/9/sys/kern/sys_pipe.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/kern/sys_pipe.c
==============================================================================
--- stable/9/sys/kern/sys_pipe.c	Fri Feb  3 20:20:30 2012	(r230954)
+++ stable/9/sys/kern/sys_pipe.c	Fri Feb  3 20:24:18 2012	(r230955)
@@ -1349,7 +1349,8 @@ pipe_poll(fp, events, active_cred, td)
 		if (wpipe->pipe_present != PIPE_ACTIVE ||
 		    (wpipe->pipe_state & PIPE_EOF) ||
 		    (((wpipe->pipe_state & PIPE_DIRECTW) == 0) &&
-		     (wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt) >= PIPE_BUF))
+		     ((wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt) >= PIPE_BUF ||
+			 wpipe->pipe_buffer.size == 0)))
 			revents |= events & (POLLOUT | POLLWRNORM);
 
 	if ((events & POLLINIGNEOF) == 0) {
@@ -1660,7 +1661,8 @@ filt_pipewrite(struct knote *kn, long hi
 		PIPE_UNLOCK(rpipe);
 		return (1);
 	}
-	kn->kn_data = wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt;
+	kn->kn_data = (wpipe->pipe_buffer.size > 0) ?
+	    (wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt) : PIPE_BUF;
 	if (wpipe->pipe_state & PIPE_DIRECTW)
 		kn->kn_data = 0;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202032024.q13KOICY002733>