From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <4F7038FF.3050203@domain.hid> Date: Mon, 26 Mar 2012 11:38:07 +0200 From: Wolfgang Grandegger MIME-Version: 1.0 References: <4F6C35CA.8010506@domain.hid> <4F6C4978.6060108@domain.hid> <4F6C7722.2080609@domain.hid> In-Reply-To: <4F6C7722.2080609@domain.hid> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Xenomai-help] rt_pipe does not support POLLHUP on the Linux side List-Id: Help regarding installation and common use of Xenomai List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gilles Chanteperdrix Cc: xenomai-help Hi Gilles, On 03/23/2012 02:14 PM, Gilles Chanteperdrix wrote: > On 03/23/2012 10:59 AM, Gilles Chanteperdrix wrote: >> On 03/23/2012 09:35 AM, Wolfgang Grandegger wrote: >>> Hello, >>> >>> while playing with rt_pipe, I realized that a select()/poll() function >>> does not unblock when the rt_pipe is deleted (via rt_pipe_delete) on the >>> other end. I think this is because the poll callback does not support >>> POLLHUP: >>> >>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/nucleus/pipe.c#1024 >>> >>> Is this by purpose? At least a blocking read() works as expected. It >>> does unblock and return 0 in that case. >> >> rt_pipes are deprecated, we are not going to add new features to them >> now. Please do not use them for new developments. We now have socket >> based RTIPCs. See examples/rtdm/profiles/ipc. Ah, I was not aware of that. This solution does also work for any skin (and does not require to misuse the native skin any more). > On the other hand, if you have a small patch to fix this, I will not > hurt anyone to merge it. OK. See patch below. Wolfgang. >>From 49eeb2b8451a68d10a7f1768e2bf74dcdaf3e35e Mon Sep 17 00:00:00 2001 From: Wolfgang Grandegger Date: Mon, 26 Mar 2012 09:21:51 +0200 Subject: [PATCH] nucleus: fix poll EOF issue with xnpipe/rt_pipe So far, the EOF event is not handled in the Linux poll function of the xnpipe/rt_pipe service when the pipe is closed (via rt_pipde_delete). This patch fixes the issue by setting POLLUP in the Linux poll function when the pipe is broken. The subsequent reads will then fail with errno EPIPE. Signed-off-by: Wolfgang Grandegger --- ksrc/nucleus/pipe.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/ksrc/nucleus/pipe.c b/ksrc/nucleus/pipe.c index 1e6bcf2..1d5e39a 100644 --- a/ksrc/nucleus/pipe.c +++ b/ksrc/nucleus/pipe.c @@ -1033,6 +1033,8 @@ static unsigned xnpipe_poll(struct file *file, poll_table *pt) if (testbits(state->status, XNPIPE_KERN_CONN)) w_mask |= (POLLOUT | POLLWRNORM); + else + r_mask |= POLLHUP; if (!emptyq_p(&state->outq)) r_mask |= (POLLIN | POLLRDNORM); -- 1.7.7.6