static inline int xnintr_irq_detach(xnintr_t *intr) { xnintr_irq_t *shirq = &xnirqs[intr->irq]; xnintr_t *e, **p = &shirq->handlers; int err = 0; while ((e = *p) != NULL) { if (e == intr) { /* Remove the given interrupt object from the list. */ xnlock_get(&shirq->lock); *p = e->next; xnlock_put(&shirq->lock); xnintr_sync_stat_references(intr); /* Release the IRQ line if this was the last user */ if (shirq->handlers == NULL) err = xnarch_release_irq(intr->irq); return err; } p = &e->next; } xnlogerr("attempted to detach a non previously attached interrupt " "object.\n"); return err; }
static inline int xnintr_irq_detach(xnintr_t *intr) { int irq = intr->irq, ret; xnlock_get(&xnirqs[irq].lock); ret = xnarch_release_irq(irq); xnlock_put(&xnirqs[irq].lock); xnintr_sync_stat_references(intr); return ret; }
static inline int xnintr_irq_detach(xnintr_t *intr) { int irq = intr->irq, err; xnlock_get(&xnirqs[irq].lock); err = xnarch_release_irq(irq); xnlock_put(&xnirqs[irq].lock); return err; }
static inline int xnintr_irq_detach(xnintr_t *intr) { xnintr_irq_t *shirq = &xnirqs[intr->irq]; xnintr_t *e, **p = &shirq->handlers; int err = 0; if (intr->irq >= RTHAL_NR_IRQS) return -EINVAL; if (!__testbits(intr->flags, XN_ISR_ATTACHED)) return -EPERM; __clrbits(intr->flags, XN_ISR_ATTACHED); while ((e = *p) != NULL) { if (e == intr) { /* Remove the given interrupt object from the list. */ xnlock_get(&shirq->lock); *p = e->next; xnlock_put(&shirq->lock); /* Release the IRQ line if this was the last user */ if (shirq->handlers == NULL) err = xnarch_release_irq(intr->irq); return err; } p = &e->next; } xnlogerr("attempted to detach a non previously attached interrupt " "object.\n"); return err; }