static STATUS xsem_delete(struct wind_sem *sem) { struct syncstate syns; struct service svc; int ret = OK; if (threadobj_irq_p()) return S_intLib_NOT_ISR_CALLABLE; CANCEL_DEFER(svc); if (syncobj_lock(&sem->u.xsem.sobj, &syns)) { ret = S_objLib_OBJ_ID_ERROR; goto out; } sem->magic = ~sem_magic; /* Prevent further reference. */ syncobj_destroy(&sem->u.xsem.sobj, &syns); out: CANCEL_RESTORE(svc); return ret; }
/** * @fn int rt_buffer_delete(RT_BUFFER *bf) * @brief Delete an IPC buffer. * * This routine deletes a buffer object previously created by a call * to rt_buffer_create(). * * @param bf The descriptor address of the deleted buffer. * * @return Zero is returned upon success. Otherwise: * * - -EINVAL is returned if @a bf is not a valid buffer descriptor. * * - -EPERM is returned if this service was called from an * asynchronous context. * * Valid calling context: * * - Regular POSIX threads * - Xenomai threads */ int rt_buffer_delete(RT_BUFFER *bf) { struct alchemy_buffer *bcb; struct syncstate syns; struct service svc; int ret = 0; if (threadobj_irq_p()) return -EPERM; CANCEL_DEFER(svc); bcb = get_alchemy_buffer(bf, &syns, &ret); if (bcb == NULL) goto out; syncluster_delobj(&alchemy_buffer_table, &bcb->cobj); bcb->magic = ~buffer_magic; syncobj_destroy(&bcb->sobj, &syns); out: CANCEL_RESTORE(svc); return ret; }