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 <jan.kis...@siemens.com>
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 <jan.kis...@siemens.com>

---

 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

Reply via email to