Module: xenomai-forge Branch: master Commit: cdf0c510aacb639f992ad8bc75a08f05fef974ca URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=cdf0c510aacb639f992ad8bc75a08f05fef974ca
Author: Philippe Gerum <[email protected]> Date: Sun Nov 13 16:35:05 2011 +0100 alchemy/sem: fix return value of rt_sem_delete() --- lib/alchemy/sem.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/alchemy/sem.c b/lib/alchemy/sem.c index 75ac7a2..c618d4e 100644 --- a/lib/alchemy/sem.c +++ b/lib/alchemy/sem.c @@ -61,6 +61,9 @@ dead_handle: static void sem_finalize(struct semobj *smobj) { struct alchemy_sem *scb = container_of(smobj, struct alchemy_sem, smobj); + /* We should never fail here, so we backtrace. */ + __bt(syncluster_delobj(&alchemy_sem_table, &scb->cobj)); + scb->magic = ~sem_magic; xnfree(scb); } fnref_register(libalchemy, sem_finalize); @@ -132,12 +135,17 @@ int rt_sem_delete(RT_SEM *sem) if (scb == NULL) goto out; + /* + * XXX: we rely on copperplate's semobj to check for semaphore + * existence, so we refrain from altering the object memory + * until we know it was valid. So the only safe place to + * negate the magic tag, deregister from the cluster and + * release the memory is in the finalizer routine, which is + * only called for valid objects. + */ ret = semobj_destroy(&scb->smobj); - if (ret) - goto out; - - syncluster_delobj(&alchemy_sem_table, &scb->cobj); - scb->magic = ~sem_magic; /* Prevent further reference. */ + if (ret > 0) + ret = 0; out: COPPERPLATE_UNPROTECT(svc); _______________________________________________ Xenomai-git mailing list [email protected] https://mail.gna.org/listinfo/xenomai-git
