Module: xenomai-jki
Branch: for-forge
Commit: 59c9595318fa94629f6f8ae0d1db825bb039f8d0
URL:    
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=59c9595318fa94629f6f8ae0d1db825bb039f8d0

Author: Jan Kiszka <jan.kis...@siemens.com>
Date:   Tue Jun 30 20:26:08 2015 +0200

cobalt/posix/sem: Do not register named semaphores with process resources

Named semaphores are reclaimed via their own mechanism. Having them
registered also as process-local resource will cause their destruction
on process termination if no other process holds a reference. This is
not conforming to the specification, and the smokey leaks tests fails
due to this right now.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>

---

 kernel/cobalt/posix/sem.c |   11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c
index 08c4cc3..15a2e77 100644
--- a/kernel/cobalt/posix/sem.c
+++ b/kernel/cobalt/posix/sem.c
@@ -50,7 +50,8 @@ int __cobalt_sem_destroy(xnhandle_t handle)
 
        cobalt_mark_deleted(sem);
        xnregistry_remove(sem->resnode.handle);
-       cobalt_del_resource(&sem->resnode);
+       if (!sem->pathname)
+               cobalt_del_resource(&sem->resnode);
        if (xnsynch_destroy(&sem->synchbase) == XNSYNCH_RESCHED) {
                xnsched_run();
                ret = 1;
@@ -106,9 +107,8 @@ __cobalt_sem_init(const char *name, struct 
cobalt_sem_shadow *sm,
        xnlock_get_irqsave(&nklock, s);
 
        semq = &cobalt_current_resources(pshared)->semq;
-       if (!list_empty(semq) &&
-           (sm->magic == COBALT_SEM_MAGIC ||
-            sm->magic == COBALT_NAMED_SEM_MAGIC)) {
+       if ((sm->magic == COBALT_SEM_MAGIC && !list_empty(semq)) ||
+           sm->magic == COBALT_NAMED_SEM_MAGIC) {
                osem = xnregistry_lookup(sm->handle, NULL);
                if (cobalt_obj_active(osem, COBALT_SEM_MAGIC, typeof(*osem))) {
                        ret = -EBUSY;
@@ -126,7 +126,8 @@ __cobalt_sem_init(const char *name, struct 
cobalt_sem_shadow *sm,
                goto err_lock_put;
 
        sem->magic = COBALT_SEM_MAGIC;
-       cobalt_add_resource(&sem->resnode, sem, pshared);
+       if (!name)
+               cobalt_add_resource(&sem->resnode, sem, pshared);
        sflags = flags & SEM_FIFO ? 0 : XNSYNCH_PRIO;
        xnsynch_init(&sem->synchbase, sflags, NULL);
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to