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