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