Module: xenomai-forge
Branch: next
Commit: 3cf9ee77ca3b102e123575b0cc7926eca98d1d23
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=3cf9ee77ca3b102e123575b0cc7926eca98d1d23

Author: Philippe Gerum <r...@xenomai.org>
Date:   Mon Sep  1 19:31:26 2014 +0200

cobalt/posix/sem, lib/cobalt: unify sem_init() calls on extended (np) form

---

 include/cobalt/uapi/sem.h     |    1 -
 include/cobalt/uapi/syscall.h |    2 +-
 kernel/cobalt/posix/nsem.c    |   14 +++++++-------
 kernel/cobalt/posix/sem.c     |   43 ++++++++++++++---------------------------
 kernel/cobalt/posix/sem.h     |   17 +++++++---------
 kernel/cobalt/posix/syscall.c |    1 -
 lib/cobalt/semaphore.c        |   13 +++++++------
 7 files changed, 36 insertions(+), 55 deletions(-)

diff --git a/include/cobalt/uapi/sem.h b/include/cobalt/uapi/sem.h
index dcd6388..8becd88 100644
--- a/include/cobalt/uapi/sem.h
+++ b/include/cobalt/uapi/sem.h
@@ -45,7 +45,6 @@ struct cobalt_sem_info {
        int nrwait;
 };
 
-/* For Cobalt's sem_init_np() extension. */
 #define SEM_FIFO       0x1
 #define SEM_PULSE      0x2
 #define SEM_PSHARED    0x4
diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h
index 904b278..3074af5 100644
--- a/include/cobalt/uapi/syscall.h
+++ b/include/cobalt/uapi/syscall.h
@@ -42,7 +42,7 @@
 #define sc_cobalt_sem_unlink                   19
 #define sc_cobalt_sem_timedwait                20
 #define sc_cobalt_sem_inquire                  21
-#define sc_cobalt_sem_init_np                  22
+/* 22 unimp */
 #define sc_cobalt_sem_broadcast_np             23
 #define sc_cobalt_clock_getres                 24
 #define sc_cobalt_clock_gettime                25
diff --git a/kernel/cobalt/posix/nsem.c b/kernel/cobalt/posix/nsem.c
index 1ae97c5..8294b3d 100644
--- a/kernel/cobalt/posix/nsem.c
+++ b/kernel/cobalt/posix/nsem.c
@@ -99,8 +99,8 @@ sem_open(struct cobalt_process *cc, struct cobalt_sem_shadow 
__user *ushadow,
                        return ERR_PTR(-ENOENT);
 
                shadow.magic = 0;
-               sem = cobalt_sem_init_inner
-                       (&name[1], &shadow, SEM_PSHARED | SEM_NAMED, value);
+               sem = __cobalt_sem_init(&name[1], &shadow,
+                                       SEM_PSHARED | SEM_NAMED, value);
                if (IS_ERR(sem)) {
                        rc = PTR_ERR(sem);
                        if (rc == -EEXIST)
@@ -109,7 +109,7 @@ sem_open(struct cobalt_process *cc, struct 
cobalt_sem_shadow __user *ushadow,
                }
 
                if (__xn_safe_copy_to_user(ushadow, &shadow, sizeof(shadow))) {
-                       cobalt_sem_destroy_inner(shadow.handle);
+                       __cobalt_sem_destroy(shadow.handle);
                        return ERR_PTR(-EFAULT);
                }
                handle = shadow.handle;
@@ -169,7 +169,7 @@ static int sem_close(struct cobalt_process *cc, xnhandle_t 
handle)
        xnid_remove(&cc->usems, &u->id);
        xnlock_put_irqrestore(&named_sem_lock, s);
 
-       cobalt_sem_destroy_inner(handle);
+       __cobalt_sem_destroy(handle);
 
        xnfree(u);
        return 1;
@@ -179,9 +179,9 @@ static int sem_close(struct cobalt_process *cc, xnhandle_t 
handle)
        return err;
 }
 
-void cobalt_sem_unlink_inner(xnhandle_t handle)
+void __cobalt_sem_unlink(xnhandle_t handle)
 {
-       if (cobalt_sem_destroy_inner(handle) == -EBUSY)
+       if (__cobalt_sem_destroy(handle) == -EBUSY)
                xnregistry_unlink(xnregistry_key(handle));
 }
 
@@ -247,7 +247,7 @@ static inline int sem_unlink(const char *name)
        if (ret == -EWOULDBLOCK)
                return -ENOENT;
 
-       cobalt_sem_unlink_inner(handle);
+       __cobalt_sem_unlink(handle);
 
        return 0;
 }
diff --git a/kernel/cobalt/posix/sem.c b/kernel/cobalt/posix/sem.c
index bba8f48..16fb3ac 100644
--- a/kernel/cobalt/posix/sem.c
+++ b/kernel/cobalt/posix/sem.c
@@ -30,7 +30,7 @@ static inline struct cobalt_kqueues *sem_kqueue(struct 
cobalt_sem *sem)
        return cobalt_kqueues(pshared);
 }
 
-int cobalt_sem_destroy_inner(xnhandle_t handle)
+int __cobalt_sem_destroy(xnhandle_t handle)
 {
        struct cobalt_sem *sem;
        int ret = 0;
@@ -68,8 +68,8 @@ int cobalt_sem_destroy_inner(xnhandle_t handle)
 }
 
 struct cobalt_sem *
-cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sm,
-                     int flags, unsigned int value)
+__cobalt_sem_init(const char *name, struct cobalt_sem_shadow *sm,
+                 int flags, unsigned int value)
 {
        struct cobalt_sem *sem, *osem;
        struct cobalt_kqueues *kq;
@@ -125,7 +125,7 @@ cobalt_sem_init_inner(const char *name, struct 
cobalt_sem_shadow *sm,
        }
 
        xnlock_put_irqrestore(&nklock, s);
-       cobalt_sem_destroy_inner(sm->handle);
+       __cobalt_sem_destroy(sm->handle);
        xnlock_get_irqsave(&nklock, s);
   do_init:
        if (value > (unsigned)SEM_VALUE_MAX) {
@@ -204,7 +204,7 @@ static int sem_destroy(struct cobalt_sem_shadow *sm)
        cobalt_mark_deleted(sm);
        xnlock_put_irqrestore(&nklock, s);
 
-       ret = cobalt_sem_destroy_inner(sem->handle);
+       ret = __cobalt_sem_destroy(sem->handle);
 
        return warn ? ret : 0;
 
@@ -395,7 +395,8 @@ static int sem_getvalue(xnhandle_t handle, int *value)
        return 0;
 }
 
-int cobalt_sem_init(struct cobalt_sem_shadow __user *u_sem, int pshared, 
unsigned value)
+int cobalt_sem_init(struct cobalt_sem_shadow __user *u_sem,
+                   int flags, unsigned int value)
 {
        struct cobalt_sem_shadow sm;
        struct cobalt_sem *sem;
@@ -403,7 +404,11 @@ int cobalt_sem_init(struct cobalt_sem_shadow __user 
*u_sem, int pshared, unsigne
        if (__xn_safe_copy_from_user(&sm, u_sem, sizeof(sm)))
                return -EFAULT;
 
-       sem = cobalt_sem_init_inner("", &sm, pshared ? SEM_PSHARED : 0, value);
+       if (flags & ~(SEM_FIFO|SEM_PULSE|SEM_PSHARED|SEM_REPORT|\
+                     SEM_WARNDEL|SEM_RAWCLOCK|SEM_NOBUSYDEL))
+               return -EINVAL;
+
+       sem = __cobalt_sem_init("", &sm, flags, value);
        if (IS_ERR(sem))
                return PTR_ERR(sem);
 
@@ -483,26 +488,6 @@ int cobalt_sem_destroy(struct cobalt_sem_shadow __user 
*u_sem)
        return __xn_safe_copy_to_user(u_sem, &sm, sizeof(*u_sem)) ?: err;
 }
 
-int cobalt_sem_init_np(struct cobalt_sem_shadow __user *u_sem,
-                      int flags, unsigned value)
-{
-       struct cobalt_sem_shadow sm;
-       struct cobalt_sem *sem;
-
-       if (__xn_safe_copy_from_user(&sm, u_sem, sizeof(sm)))
-               return -EFAULT;
-
-       if (flags & ~(SEM_FIFO|SEM_PULSE|SEM_PSHARED|SEM_REPORT|\
-                     SEM_WARNDEL|SEM_RAWCLOCK|SEM_NOBUSYDEL))
-               return -EINVAL;
-
-       sem = cobalt_sem_init_inner("", &sm, flags, value);
-       if (IS_ERR(sem))
-               return PTR_ERR(sem);
-
-       return __xn_safe_copy_to_user(u_sem, &sm, sizeof(*u_sem));
-}
-
 int cobalt_sem_broadcast_np(struct cobalt_sem_shadow __user *u_sem)
 {
        struct cobalt_sem *sm;
@@ -616,8 +601,8 @@ void cobalt_semq_cleanup(struct cobalt_kqueues *q)
        list_for_each_entry_safe(sem, tmp, &q->semq, link) {
                xnlock_put_irqrestore(&nklock, s);
                if (sem->flags & SEM_NAMED)
-                       cobalt_sem_unlink_inner(sem->handle);
-               cobalt_sem_destroy_inner(sem->handle);
+                       __cobalt_sem_unlink(sem->handle);
+               __cobalt_sem_destroy(sem->handle);
                xnlock_get_irqsave(&nklock, s);
        }
 out:
diff --git a/kernel/cobalt/posix/sem.h b/kernel/cobalt/posix/sem.h
index 2612700..1dc3a94 100644
--- a/kernel/cobalt/posix/sem.h
+++ b/kernel/cobalt/posix/sem.h
@@ -58,18 +58,18 @@ typedef struct
 #define SEM_FAILED     NULL
 #define SEM_NAMED      0x80000000
 
-struct cobalt_sem *
-cobalt_sem_init_inner(const char *name, struct cobalt_sem_shadow *sem,
-               int flags, unsigned value);
-
-int cobalt_sem_destroy_inner(xnhandle_t handle);
+int __cobalt_sem_destroy(xnhandle_t handle);
 
-void cobalt_sem_unlink_inner(xnhandle_t handle);
+void __cobalt_sem_unlink(xnhandle_t handle);
 
 void cobalt_sem_usems_cleanup(struct cobalt_process *cc);
 
+struct cobalt_sem *
+__cobalt_sem_init(const char *name, struct cobalt_sem_shadow *sem,
+                 int flags, unsigned value);
+
 int cobalt_sem_init(struct cobalt_sem_shadow __user *u_sem,
-                   int pshared, unsigned value);
+                   int flags, unsigned value);
 
 int cobalt_sem_post(struct cobalt_sem_shadow __user *u_sem);
 
@@ -93,9 +93,6 @@ int cobalt_sem_close(struct cobalt_sem_shadow __user *usm);
 
 int cobalt_sem_unlink(const char __user *u_name);
 
-int cobalt_sem_init_np(struct cobalt_sem_shadow __user *u_sem,
-                      int flags, unsigned value);
-
 int cobalt_sem_broadcast_np(struct cobalt_sem_shadow __user *u_sem);
 
 int cobalt_sem_inquire(struct cobalt_sem_shadow __user *u_sem,
diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index becb773..91f99e8 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -745,7 +745,6 @@ static struct cobalt_syscall cobalt_syscalls[] = {
        __COBALT_CALL(sc_cobalt_sem_open, cobalt_sem_open, current),
        __COBALT_CALL(sc_cobalt_sem_close, cobalt_sem_close, current),
        __COBALT_CALL(sc_cobalt_sem_unlink, cobalt_sem_unlink, current),
-       __COBALT_CALL(sc_cobalt_sem_init_np, cobalt_sem_init_np, current),
        __COBALT_CALL(sc_cobalt_sem_broadcast_np, cobalt_sem_broadcast_np, 
current),
        __COBALT_CALL(sc_cobalt_sem_inquire, cobalt_sem_inquire, current),
        __COBALT_CALL(sc_cobalt_clock_getres, cobalt_clock_getres, current),
diff --git a/lib/cobalt/semaphore.c b/lib/cobalt/semaphore.c
index 33ffbc6..4197318 100644
--- a/lib/cobalt/semaphore.c
+++ b/lib/cobalt/semaphore.c
@@ -82,14 +82,15 @@ static inline struct sem_dat *sem_get_datp(struct 
cobalt_sem_shadow *shadow)
  * Specification.</a>
  *
  */
-COBALT_IMPL(int, sem_init, (sem_t *sem, int pshared, unsigned value))
+COBALT_IMPL(int, sem_init, (sem_t *sem, int pshared, unsigned int value))
 {
        struct cobalt_sem_shadow *_sem = &((union cobalt_sem_union 
*)sem)->shadow_sem;
-       int err;
+       int ret;
 
-       err = -XENOMAI_SYSCALL3(sc_cobalt_sem_init, _sem, pshared, value);
-       if (err) {
-               errno = err;
+       ret = -XENOMAI_SYSCALL3(sc_cobalt_sem_init,
+                               _sem, pshared ? SEM_PSHARED : 0, value);
+       if (ret) {
+               errno = ret;
                return -1;
        }
 
@@ -596,7 +597,7 @@ int sem_init_np(sem_t *sem, int flags, unsigned int value)
        struct cobalt_sem_shadow *_sem = &((union cobalt_sem_union 
*)sem)->shadow_sem;
        int err;
 
-       err = -XENOMAI_SYSCALL3(sc_cobalt_sem_init_np, _sem, flags, value);
+       err = -XENOMAI_SYSCALL3(sc_cobalt_sem_init, _sem, flags, value);
        if (!err)
                return 0;
 


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

Reply via email to