[Xenomai-git] Jan Kiszka : RTDM: Bind deleted sem/event objects, but mark them pending
Module: xenomai-2.5 Branch: master Commit: ea3a001f8ee4decc2029ac28f88da2749d3aea52 URL: http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=ea3a001f8ee4decc2029ac28f88da2749d3aea52 Author: Jan Kiszka Date: Mon Mar 1 17:12:44 2010 +0100 RTDM: Bind deleted sem/event objects, but mark them pending Deleted semaphore and event objects do not necessarily mean that the corresponding RTDM file descriptor is already closed. Moreover, returning -EIDRM on bind makes select return this invalid error to the user. Fix this by binding both object types even if they are marked deleted, but report them as pending. This cures the return value of select on half-closed RTnet TCP sockets. Signed-off-by: Jan Kiszka --- ksrc/skins/rtdm/drvlib.c | 26 ++ 1 files changed, 10 insertions(+), 16 deletions(-) diff --git a/ksrc/skins/rtdm/drvlib.c b/ksrc/skins/rtdm/drvlib.c index 637f99e..fe32f24 100644 --- a/ksrc/skins/rtdm/drvlib.c +++ b/ksrc/skins/rtdm/drvlib.c @@ -1051,8 +1051,6 @@ EXPORT_SYMBOL(rtdm_event_clear); * * @return 0 on success, otherwise: * - * - -EIDRM is returned if @a event has been destroyed. - * * - -ENOMEM is returned if there is insufficient memory to establish the * dynamic binding. * @@ -1080,13 +1078,11 @@ int rtdm_event_select_bind(rtdm_event_t *event, rtdm_selector_t *selector, return -ENOMEM; xnlock_get_irqsave(&nklock, s); - if (unlikely(testbits(event->synch_base.status, RTDM_SYNCH_DELETED))) - err = -EIDRM; - else - err = xnselect_bind(&event->select_block, - binding, selector, type, fd_index, - xnsynch_test_flags(&event->synch_base, - RTDM_EVENT_PENDING)); + err = xnselect_bind(&event->select_block, + binding, selector, type, fd_index, + xnsynch_test_flags(&event->synch_base, + RTDM_SYNCH_DELETED | + RTDM_EVENT_PENDING)); xnlock_put_irqrestore(&nklock, s); if (err) @@ -1337,8 +1333,6 @@ EXPORT_SYMBOL(rtdm_sem_up); * * @return 0 on success, otherwise: * - * - -EIDRM is returned if @a sem has been destroyed. - * * - -ENOMEM is returned if there is insufficient memory to establish the * dynamic binding. * @@ -1366,11 +1360,11 @@ int rtdm_sem_select_bind(rtdm_sem_t *sem, rtdm_selector_t *selector, return -ENOMEM; xnlock_get_irqsave(&nklock, s); - if (unlikely(testbits(sem->synch_base.status, RTDM_SYNCH_DELETED))) - err = -EIDRM; - else - err = xnselect_bind(&sem->select_block, binding, selector, - type, fd_index, (sem->value > 0)); + err = xnselect_bind(&sem->select_block, binding, selector, + type, fd_index, + (sem->value > 0) || + xnsynch_test_flags(&sem->synch_base, + RTDM_SYNCH_DELETED)); xnlock_put_irqrestore(&nklock, s); if (err) ___ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git
[Xenomai-git] Jan Kiszka : RTDM: Bind deleted sem/event objects, but mark them pending
Module: xenomai-jki Branch: for-upstream Commit: ea3a001f8ee4decc2029ac28f88da2749d3aea52 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=ea3a001f8ee4decc2029ac28f88da2749d3aea52 Author: Jan Kiszka Date: Mon Mar 1 17:12:44 2010 +0100 RTDM: Bind deleted sem/event objects, but mark them pending Deleted semaphore and event objects do not necessarily mean that the corresponding RTDM file descriptor is already closed. Moreover, returning -EIDRM on bind makes select return this invalid error to the user. Fix this by binding both object types even if they are marked deleted, but report them as pending. This cures the return value of select on half-closed RTnet TCP sockets. Signed-off-by: Jan Kiszka --- ksrc/skins/rtdm/drvlib.c | 26 ++ 1 files changed, 10 insertions(+), 16 deletions(-) diff --git a/ksrc/skins/rtdm/drvlib.c b/ksrc/skins/rtdm/drvlib.c index 637f99e..fe32f24 100644 --- a/ksrc/skins/rtdm/drvlib.c +++ b/ksrc/skins/rtdm/drvlib.c @@ -1051,8 +1051,6 @@ EXPORT_SYMBOL(rtdm_event_clear); * * @return 0 on success, otherwise: * - * - -EIDRM is returned if @a event has been destroyed. - * * - -ENOMEM is returned if there is insufficient memory to establish the * dynamic binding. * @@ -1080,13 +1078,11 @@ int rtdm_event_select_bind(rtdm_event_t *event, rtdm_selector_t *selector, return -ENOMEM; xnlock_get_irqsave(&nklock, s); - if (unlikely(testbits(event->synch_base.status, RTDM_SYNCH_DELETED))) - err = -EIDRM; - else - err = xnselect_bind(&event->select_block, - binding, selector, type, fd_index, - xnsynch_test_flags(&event->synch_base, - RTDM_EVENT_PENDING)); + err = xnselect_bind(&event->select_block, + binding, selector, type, fd_index, + xnsynch_test_flags(&event->synch_base, + RTDM_SYNCH_DELETED | + RTDM_EVENT_PENDING)); xnlock_put_irqrestore(&nklock, s); if (err) @@ -1337,8 +1333,6 @@ EXPORT_SYMBOL(rtdm_sem_up); * * @return 0 on success, otherwise: * - * - -EIDRM is returned if @a sem has been destroyed. - * * - -ENOMEM is returned if there is insufficient memory to establish the * dynamic binding. * @@ -1366,11 +1360,11 @@ int rtdm_sem_select_bind(rtdm_sem_t *sem, rtdm_selector_t *selector, return -ENOMEM; xnlock_get_irqsave(&nklock, s); - if (unlikely(testbits(sem->synch_base.status, RTDM_SYNCH_DELETED))) - err = -EIDRM; - else - err = xnselect_bind(&sem->select_block, binding, selector, - type, fd_index, (sem->value > 0)); + err = xnselect_bind(&sem->select_block, binding, selector, + type, fd_index, + (sem->value > 0) || + xnsynch_test_flags(&sem->synch_base, + RTDM_SYNCH_DELETED)); xnlock_put_irqrestore(&nklock, s); if (err) ___ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git