Module: xenomai-2.6
Branch: master
Commit: 5704dd0c118c5c85c22f703ea937551c88e0ef44
URL:    
http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=5704dd0c118c5c85c22f703ea937551c88e0ef44

Author: Philippe Gerum <r...@xenomai.org>
Date:   Tue Feb 25 16:37:31 2014 +0100

psos: fix auto-cleanup support

---

 include/psos+/ppd.h      |   22 +++++------
 include/psos+/pt.h       |    2 +-
 include/psos+/queue.h    |    2 +-
 include/psos+/rn.h       |    2 +-
 include/psos+/sem.h      |    2 +-
 ksrc/skins/psos+/queue.c |   93 ++++++++++++++++++++++++++--------------------
 6 files changed, 66 insertions(+), 57 deletions(-)

diff --git a/include/psos+/ppd.h b/include/psos+/ppd.h
index 20ae7cc..0ab3912 100644
--- a/include/psos+/ppd.h
+++ b/include/psos+/ppd.h
@@ -75,9 +75,9 @@ static inline psos_rholder_t *psos_get_rholder(void)
 #define __psos_trace_release(__name, __obj, __err)
 #endif /* !XENO_DEBUG(NATIVE) */
 
-#define psos_flush_rq(__type, __rq, __name)                            \
+#define psos_flush_rq(__type, __rq, __name, __dtor)                    \
        do {                                                            \
-               u_long __name##_delete(u_long id);                      \
+               u_long __dtor(u_long id);                               \
                xnholder_t *holder, *nholder;                           \
                __type *obj;                                            \
                u_long err;                                             \
@@ -88,17 +88,15 @@ static inline psos_rholder_t *psos_get_rholder(void)
                        nholder = nextq((__rq), holder);                \
                        xnlock_put_irqrestore(&nklock, s);              \
                        obj = rlink2##__name(holder);                   \
-                       err = __name##_delete((u_long)obj);             \
+                       err = __dtor((u_long)obj);                      \
                        __psos_trace_release(#__name, obj, err);        \
-                       if (unlikely(err)) {                            \
-                               if ((__rq) != &__psos_global_rholder.__name##q) 
{ \
-                                       xnlock_get_irqsave(&nklock, s); \
-                                       nholder = popq((rq), holder);   \
-                                       
appendq(&__psos_global_rholder.__name##q, holder); \
-                                       obj->rqueue = 
&__psos_global_rholder.__name##q; \
-                               }                                       \
-                       } else                                          \
-                               xnlock_get_irqsave(&nklock, s);         \
+                       xnlock_get_irqsave(&nklock, s);                 \
+                       if (unlikely(err) &&                            \
+                           (obj->rqueue != &__psos_global_rholder.__name##q)) 
{ \
+                               removeq(obj->rqueue, holder);           \
+                               appendq(&__psos_global_rholder.__name##q, 
holder); \
+                               obj->rqueue = &__psos_global_rholder.__name##q; 
\
+                           }                                           \
                }                                                       \
                xnlock_put_irqrestore(&nklock, s);                      \
        } while(0)
diff --git a/include/psos+/pt.h b/include/psos+/pt.h
index 3594d89..626ef19 100644
--- a/include/psos+/pt.h
+++ b/include/psos+/pt.h
@@ -87,7 +87,7 @@ void psospt_cleanup(void);
 
 static inline void psos_pt_flush_rq(xnqueue_t *rq)
 {
-       psos_flush_rq(psospt_t, rq, pt);
+       psos_flush_rq(psospt_t, rq, pt, pt_delete);
 }
 
 #ifdef __cplusplus
diff --git a/include/psos+/queue.h b/include/psos+/queue.h
index cc4df04..ca5c79f 100644
--- a/include/psos+/queue.h
+++ b/include/psos+/queue.h
@@ -90,7 +90,7 @@ void psosqueue_cleanup(void);
 
 static inline void psos_queue_flush_rq(xnqueue_t *rq)
 {
-       psos_flush_rq(psosqueue_t, rq, q);
+       psos_flush_rq(psosqueue_t, rq, q, q_delete_any);
 }
 
 #ifdef __cplusplus
diff --git a/include/psos+/rn.h b/include/psos+/rn.h
index 7b55496..29ae73b 100644
--- a/include/psos+/rn.h
+++ b/include/psos+/rn.h
@@ -74,7 +74,7 @@ void psosrn_cleanup(void);
 
 static inline void psos_rn_flush_rq(xnqueue_t *rq)
 {
-       psos_flush_rq(psosrn_t, rq, rn);
+       psos_flush_rq(psosrn_t, rq, rn, rn_delete);
 }
 
 #ifdef __cplusplus
diff --git a/include/psos+/sem.h b/include/psos+/sem.h
index 0125dc8..4192346 100644
--- a/include/psos+/sem.h
+++ b/include/psos+/sem.h
@@ -60,7 +60,7 @@ void psossem_cleanup(void);
 
 static inline void psos_sem_flush_rq(xnqueue_t *rq)
 {
-       psos_flush_rq(psossem_t, rq, sm);
+       psos_flush_rq(psossem_t, rq, sm, sm_delete);
 }
 
 #ifdef __cplusplus
diff --git a/ksrc/skins/psos+/queue.c b/ksrc/skins/psos+/queue.c
index 2dec0a6..5403729 100644
--- a/ksrc/skins/psos+/queue.c
+++ b/ksrc/skins/psos+/queue.c
@@ -27,8 +27,6 @@ static xnqueue_t psoschunkq;  /* Shared chunks */
 
 static xnqueue_t psosmbufq;    /* Shared msg buffers (in chunks) */
 
-static u_long q_destroy_internal(psosqueue_t *queue);
-
 #ifdef CONFIG_XENO_OPT_VFILE
 
 struct vfile_priv {
@@ -313,7 +311,7 @@ static u_long q_create_internal(const char *name,
        return SUCCESS;
 }
 
-static u_long q_destroy_internal(psosqueue_t *queue)
+static u_long q_delete_internal(psosqueue_t *queue)
 {
        xnholder_t *holder;
        u_long err, flags;
@@ -366,46 +364,10 @@ static u_long q_destroy_internal(psosqueue_t *queue)
 
        xnfree(queue);
 
-       return err;
-}
-
-static u_long q_delete_internal(u_long qid, u_long flags)
-{
-       psosqueue_t *queue;
-       u_long err;
-       spl_t s;
-
-       xnlock_get_irqsave(&nklock, s);
-
-       queue = psos_h2obj_active(qid, PSOS_QUEUE_MAGIC, psosqueue_t);
-
-       if (!queue) {
-               err = psos_handle_error(qid, PSOS_QUEUE_MAGIC, psosqueue_t);
-               goto unlock_and_exit;
-       }
-
-       if ((flags & Q_VARIABLE)
-           && !testbits(queue->synchbase.status, Q_VARIABLE)) {
-               err = ERR_NOTVARQ;
-               goto unlock_and_exit;
-       }
-
-       if (!(flags & Q_VARIABLE)
-           && testbits(queue->synchbase.status, Q_VARIABLE)) {
-               err = ERR_VARQ;
-               goto unlock_and_exit;
-       }
-
-       err = q_destroy_internal(queue);
-
        if (err == ERR_TATQDEL)
                /* Some task has been readied. */
                xnpod_schedule();
 
-      unlock_and_exit:
-
-       xnlock_put_irqrestore(&nklock, s);
-
        return err;
 }
 
@@ -704,12 +666,61 @@ u_long q_vcreate(const char *name,
 
 u_long q_delete(u_long qid)
 {
-       return q_delete_internal(qid, 0);
+       psosqueue_t *queue;
+       u_long ret;
+       spl_t s;
+
+       xnlock_get_irqsave(&nklock, s);
+
+       queue = psos_h2obj_active(qid, PSOS_QUEUE_MAGIC, psosqueue_t);
+       if (queue == NULL)
+               ret = psos_handle_error(qid, PSOS_QUEUE_MAGIC, psosqueue_t);
+       else if (testbits(queue->synchbase.status, Q_VARIABLE))
+               ret = ERR_VARQ;
+       else
+               ret = q_delete_internal(queue);
+
+       xnlock_put_irqrestore(&nklock, s);
+
+       return ret;
 }
 
 u_long q_vdelete(u_long qid)
 {
-       return q_delete_internal(qid, Q_VARIABLE);
+       psosqueue_t *queue;
+       u_long ret;
+       spl_t s;
+
+       xnlock_get_irqsave(&nklock, s);
+
+       queue = psos_h2obj_active(qid, PSOS_QUEUE_MAGIC, psosqueue_t);
+       if (queue == NULL)
+               ret = psos_handle_error(qid, PSOS_QUEUE_MAGIC, psosqueue_t);
+       else if (!testbits(queue->synchbase.status, Q_VARIABLE))
+               ret = ERR_NOTVARQ;
+       else
+               ret = q_delete_internal(queue);
+
+       xnlock_put_irqrestore(&nklock, s);
+
+       return ret;
+}
+
+u_long q_delete_any(u_long qid)
+{
+       u_long ret = SUCCESS;
+       psosqueue_t *queue;
+       spl_t s;
+
+       xnlock_get_irqsave(&nklock, s);
+
+       queue = psos_h2obj_active(qid, PSOS_QUEUE_MAGIC, psosqueue_t);
+       if (queue)
+               ret = q_delete_internal(queue);
+
+       xnlock_put_irqrestore(&nklock, s);
+
+       return ret;
 }
 
 u_long q_ident(const char *name, u_long node, u_long *qid)


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to