void sc_sdelete(int semid, int opt, int *errp) { vrtxsem_t *sem; spl_t s; if (opt & ~1) { *errp = ER_IIP; return; } xnlock_get_irqsave(&nklock, s); sem = xnmap_fetch(vrtx_sem_idmap, semid); if (sem == NULL) { *errp = ER_ID; goto unlock_and_exit; } if (opt == 0 && xnsynch_nsleepers(&sem->synchbase) > 0) { *errp = ER_PND; goto unlock_and_exit; } /* forcing delete or no task pending */ if (sem_destroy_internal(sem) == XNSYNCH_RESCHED) xnpod_schedule(); *errp = RET_OK; unlock_and_exit: xnlock_put_irqrestore(&nklock, s); }
void vrtxsem_cleanup(void) { xnholder_t *holder; while ((holder = getheadq(&vrtx_sem_q)) != NULL) sem_destroy_internal(link2vrtxsem(holder)); xnmap_delete(vrtx_sem_idmap); }
STATUS semDelete(SEM_ID sem_id) { wind_sem_t *sem; spl_t s; check_NOT_ISR_CALLABLE(return ERROR); xnlock_get_irqsave(&nklock, s); check_OBJ_ID_ERROR(sem_id, wind_sem_t, sem, WIND_SEM_MAGIC, goto error); sem_destroy_internal(sem); xnlock_put_irqrestore(&nklock, s); return OK; error: xnlock_put_irqrestore(&nklock, s); return ERROR; }