/* Must be called nklock locked, irq off. */ static void pse51_shm_destroy(pse51_shm_t * shm, int force) { spl_t ignored; removeq(&pse51_shmq, &shm->link); xnlock_clear_irqon(&nklock); down(&shm->maplock); if (shm->addr) { xnheap_free(&shm->heapbase, shm->addr); xnheap_destroy_mapped(&shm->heapbase, NULL, NULL); shm->addr = NULL; shm->size = 0; } if (force) { xnholder_t *holder; while ((holder = getq(&shm->mappings))) { up(&shm->maplock); xnfree(link2map(holder)); down(&shm->maplock); } } up(&shm->maplock); xnlock_get_irqsave(&nklock, ignored); }
static inline void switch_context(struct xnsched *sched, struct xnthread *prev, struct xnthread *next) { #ifdef CONFIG_XENO_ARCH_UNLOCKED_SWITCH sched->last = prev; sched->status |= XNINSW; xnlock_clear_irqon(&nklock); #endif /* !CONFIG_XENO_ARCH_UNLOCKED_SWITCH */ xnarch_switch_to(prev, next); }