From: Jan Kiszka <jan.kiszka@domain.hid>
To: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Cc: Xenomai core <Xenomai-core@domain.hid>
Subject: Re: [Xenomai-core] [Xenomai-git] Jan Kiszka : RTDM+POSIX: Avoid leaking binding objects on errors
Date: Mon, 01 Mar 2010 13:46:20 +0100 [thread overview]
Message-ID: <4B8BB71C.1060509@domain.hid> (raw)
In-Reply-To: <4B8BA361.1040807@domain.hid>
Jan Kiszka wrote:
> Gilles Chanteperdrix wrote:
>> Jan Kiszka wrote:
>>> Gilles Chanteperdrix wrote:
>>>> Jan Kiszka wrote:
>>>>> Wait! When the sync object behind some file descriptor is deleted but
>>>>> the descriptor itself is still existing, we rather have to return that
>>>>> fd signaled from select() instead of letting the call fail. I beed to
>>>>> look into this again.
>>>> It looks to me like a transitory state, we can wait for the sync object
>>>> to be deleted to have the fd destructor signaled. It should not be long.
>>> That's not an issue of waiting for this. See e.g. TCP: peer closes
>>> connection -> internal sync objects will be destroyed (to make
>>> read/write fail). But the fd will remain valid until the local side
>>> closes it as well.
>> It looks to me like this is going to complicate things a lot, and will
>> be a source of regressions. Why can we not have sync objects be
>> destroyed when the fd is really destroyed and use a status bit of some
>> kind to signal read/write that the fd was closed by peer?
>
> It is way easier and more consistent to unblock reader and writers via
> destroying the sync object than to signal it and add tests for specific
> states to detect that. Keep in mind that this pattern is in use even
> without select support. Diverging from it just to add select awareness
> to some driver would be a step back.
>
First draft of a fix that so far does what it is supposed to do,
comments welcome:
diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 959b61c..4e46cb6 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -2298,24 +2298,30 @@ static int select_bind_one(struct xnselector *selector, unsigned type, int fd)
}
static int select_bind_all(struct xnselector *selector,
- fd_set *fds[XNSELECT_MAX_TYPES], int nfds)
+ fd_set *in_fds[XNSELECT_MAX_TYPES],
+ fd_set *out_fds[XNSELECT_MAX_TYPES], int nfds)
{
unsigned fd, type;
+ int pending = 0;
int err;
for (type = 0; type < XNSELECT_MAX_TYPES; type++) {
- fd_set *set = fds[type];
+ fd_set *set = in_fds[type];
if (set)
for (fd = find_first_bit(set->fds_bits, nfds);
fd < nfds;
fd = find_next_bit(set->fds_bits, nfds, fd + 1)) {
err = select_bind_one(selector, type, fd);
- if (err)
- return err;
+ if (err) {
+ if (err != -EIDRM)
+ return err;
+ __FD_SET(fd, out_fds[type]);
+ pending++;
+ }
}
}
- return 0;
+ return pending;
}
/* int select(int, fd_set *, fd_set *, fd_set *, struct timeval *) */
@@ -2387,7 +2393,7 @@ static int __select(struct pt_regs *regs)
/* Bind directly the file descriptors, we do not need to go
through xnselect returning -ECHRNG */
- if ((err = select_bind_all(selector, in_fds, nfds)))
+ if ((err = select_bind_all(selector, in_fds, out_fds, nfds)))
return err;
}
@@ -2395,7 +2401,8 @@ static int __select(struct pt_regs *regs)
err = xnselect(selector, out_fds, in_fds, nfds, timeout, mode);
if (err == -ECHRNG) {
- int err = select_bind_all(selector, out_fds, nfds);
+ int err = select_bind_all(selector, out_fds, out_fds,
+ nfds);
if (err)
return err;
}
next prev parent reply other threads:[~2010-03-01 12:46 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <E1Nl4tX-0001N9-Hb@domain.hid>
2010-02-26 19:18 ` [Xenomai-core] [Xenomai-git] Jan Kiszka : RTDM+POSIX: Avoid leaking binding objects on errors Gilles Chanteperdrix
2010-02-26 19:25 ` Jan Kiszka
2010-02-27 11:37 ` Jan Kiszka
2010-03-01 8:05 ` Jan Kiszka
2010-03-01 9:11 ` Gilles Chanteperdrix
2010-03-01 10:29 ` Jan Kiszka
2010-03-01 10:37 ` Gilles Chanteperdrix
2010-03-01 11:22 ` Jan Kiszka
2010-03-01 12:46 ` Jan Kiszka [this message]
2010-03-01 12:49 ` Jan Kiszka
2010-03-01 13:34 ` Gilles Chanteperdrix
2010-03-01 13:50 ` Jan Kiszka
2010-03-01 14:15 ` Gilles Chanteperdrix
2010-03-01 14:22 ` Jan Kiszka
2010-03-01 14:26 ` Gilles Chanteperdrix
2010-03-01 14:29 ` Gilles Chanteperdrix
2010-03-01 14:53 ` Jan Kiszka
2010-03-01 15:27 ` Gilles Chanteperdrix
2010-03-01 15:34 ` Gilles Chanteperdrix
2010-03-01 16:25 ` Jan Kiszka
2010-03-01 16:19 ` Gilles Chanteperdrix
2010-03-01 13:36 ` Gilles Chanteperdrix
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B8BB71C.1060509@domain.hid \
--to=jan.kiszka@domain.hid \
--cc=Xenomai-core@domain.hid \
--cc=gilles.chanteperdrix@xenomai.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.