Module: xenomai-forge
Branch: master
Commit: 147a310619b1c6804ef4b27122906e9ea80698ac
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=147a310619b1c6804ef4b27122906e9ea80698ac

Author: Philippe Gerum <r...@xenomai.org>
Date:   Fri Nov 11 19:10:06 2011 +0100

copperplate/semobj: introduce SEMOBJ_WARNDEL modifier

When set in the semobj creation flags passed to semobj_init(), this
modifier causes semobj_destroy() to return a non-zero positive value
in case threads were awaken as a result of destroying the semaphore
object.

---

 include/copperplate/semobj.h |    1 +
 lib/copperplate/semobj.c     |   11 ++++++-----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/include/copperplate/semobj.h b/include/copperplate/semobj.h
index 5ae03cc..fc8bdc9 100644
--- a/include/copperplate/semobj.h
+++ b/include/copperplate/semobj.h
@@ -48,6 +48,7 @@ struct semobj {
 
 #define SEMOBJ_PRIO    0x1
 #define SEMOBJ_PULSE   0x2
+#define SEMOBJ_WANRDEL 0x4
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/lib/copperplate/semobj.c b/lib/copperplate/semobj.c
index c44380f..d1605ff 100644
--- a/lib/copperplate/semobj.c
+++ b/lib/copperplate/semobj.c
@@ -35,6 +35,9 @@ int semobj_init(struct semobj *smobj, int flags, int value,
        if (flags & SEMOBJ_PULSE)
                sem_flags |= SEM_PULSE;
 
+       if (flags & SEMOBJ_WANRDEL)
+               sem_flags |= SEM_WARNDEL;
+
        ret = sem_init_np(&smobj->core.sem, sem_flags, value);
        if (ret)
                return __bt(-errno);
@@ -50,7 +53,7 @@ int semobj_destroy(struct semobj *smobj)
        int ret;
 
        ret = __RT(sem_destroy(&smobj->core.sem));
-       if (ret)
+       if (ret < 0)
                return errno == EINVAL ? -EIDRM : -errno;
        /*
         * All waiters have been unblocked with EINVAL, and therefore
@@ -60,7 +63,7 @@ int semobj_destroy(struct semobj *smobj)
        fnref_get(finalizer, smobj->finalizer);
        finalizer(smobj);
 
-       return 0;
+       return ret;
 }
 
 int semobj_post(struct semobj *smobj)
@@ -153,9 +156,7 @@ int semobj_destroy(struct semobj *smobj)
        if (syncobj_lock(&smobj->core.sobj, &syns))
                return -EINVAL;
 
-       syncobj_destroy(&smobj->core.sobj, &syns);
-
-       return 0;
+       return syncobj_destroy(&smobj->core.sobj, &syns);
 }
 
 int semobj_post(struct semobj *smobj)


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to