Module: xenomai-forge Branch: next Commit: 95e3a950d16b8eacfd87b5a600c1cbe368dedc3c URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=95e3a950d16b8eacfd87b5a600c1cbe368dedc3c
Author: Philippe Gerum <r...@xenomai.org> Date: Tue Sep 2 14:03:23 2014 +0200 cobalt/uapi, copperplate, alchemy, trank: make cobalt_event 32/64bit-neutral Using long integers for representing event bit masks potentially creates a portability issue for applications between 32 and 64bit CPU architectures. This issue is solved by using 32bit integers on 32/64 bit machines, which is normally more than enough for encoding the set of events received by a single event group. In addition, this enables the sharing of the event value between a 64bit kernel support and 32bit libraries without thunks. --- include/alchemy/event.h | 34 ++++++----- include/cobalt/sys/cobalt.h | 10 ++-- include/cobalt/uapi/event.h | 14 +++-- include/copperplate/eventobj.h | 18 +++--- include/trank/native/event.h | 50 ++++++++++++++++ kernel/cobalt/posix/event.c | 19 +++--- kernel/cobalt/posix/event.h | 8 +-- lib/alchemy/event.c | 37 ++++++++---- lib/cobalt/internal.c | 8 +-- lib/copperplate/eventobj.c | 32 +++++----- lib/trank/native.c | 129 ++++++++++++++++++++++++++++++++++++++++ 11 files changed, 281 insertions(+), 78 deletions(-) diff --git a/include/alchemy/event.h b/include/alchemy/event.h index 227f108..1e8cb4d 100644 --- a/include/alchemy/event.h +++ b/include/alchemy/event.h @@ -20,6 +20,7 @@ #include <stdint.h> #include <alchemy/timer.h> +#include <alchemy/compat.h> /** * @addtogroup alchemy_event @@ -51,7 +52,7 @@ struct RT_EVENT_INFO { /** * Current value of the event flag group. */ - unsigned long value; + unsigned int value; /** * Number of tasks currently waiting for events. */ @@ -68,24 +69,27 @@ typedef struct RT_EVENT_INFO RT_EVENT_INFO; extern "C" { #endif -int rt_event_create(RT_EVENT *event, - const char *name, - unsigned long ivalue, - int mode); +CURRENT_DECL(int, rt_event_create(RT_EVENT *event, + const char *name, + unsigned int ivalue, + int mode)); int rt_event_delete(RT_EVENT *event); -int rt_event_signal(RT_EVENT *event, - unsigned long mask); +CURRENT_DECL(int, rt_event_signal(RT_EVENT *event, + unsigned int mask)); int rt_event_wait_timed(RT_EVENT *event, - unsigned long mask, - unsigned long *mask_r, + unsigned int mask, + unsigned int *mask_r, int mode, const struct timespec *abs_timeout); + +#ifndef __XENO_COMPAT__ + static inline int rt_event_wait_until(RT_EVENT *event, - unsigned long mask, unsigned long *mask_r, + unsigned int mask, unsigned int *mask_r, int mode, RTIME timeout) { struct timespec ts; @@ -95,7 +99,7 @@ int rt_event_wait_until(RT_EVENT *event, static inline int rt_event_wait(RT_EVENT *event, - unsigned long mask, unsigned long *mask_r, + unsigned int mask, unsigned int *mask_r, int mode, RTIME timeout) { struct timespec ts; @@ -103,9 +107,11 @@ int rt_event_wait(RT_EVENT *event, alchemy_rel_timeout(timeout, &ts)); } -int rt_event_clear(RT_EVENT *event, - unsigned long mask, - unsigned long *mask_r); +#endif /* !__XENO_COMPAT__ */ + +CURRENT_DECL(int, rt_event_clear(RT_EVENT *event, + unsigned int mask, + unsigned int *mask_r)); int rt_event_inquire(RT_EVENT *event, RT_EVENT_INFO *info); diff --git a/include/cobalt/sys/cobalt.h b/include/cobalt/sys/cobalt.h index 2eaa421..f64ae4e 100644 --- a/include/cobalt/sys/cobalt.h +++ b/include/cobalt/sys/cobalt.h @@ -106,20 +106,20 @@ void cobalt_monitor_drain_all(cobalt_monitor_t *mon); int cobalt_monitor_drain_all_sync(cobalt_monitor_t *mon); int cobalt_event_init(cobalt_event_t *event, - unsigned long value, + unsigned int value, int flags); int cobalt_event_post(cobalt_event_t *event, - unsigned long bits); + unsigned int bits); int cobalt_event_wait(cobalt_event_t *event, - unsigned long bits, - unsigned long *bits_r, + unsigned int bits, + unsigned int *bits_r, int mode, const struct timespec *timeout); unsigned long cobalt_event_clear(cobalt_event_t *event, - unsigned long bits); + unsigned int bits); int cobalt_event_inquire(cobalt_event_t *event, struct cobalt_event_info *info, diff --git a/include/cobalt/uapi/event.h b/include/cobalt/uapi/event.h index ddb6ec4..fa7d5fd 100644 --- a/include/cobalt/uapi/event.h +++ b/include/cobalt/uapi/event.h @@ -18,11 +18,13 @@ #ifndef _COBALT_UAPI_EVENT_H #define _COBALT_UAPI_EVENT_H +#include <cobalt/uapi/kernel/types.h> + struct cobalt_event_data { - unsigned long value; - unsigned long flags; + __u32 value; + __u32 flags; #define COBALT_EVENT_PENDED 0x1 - int nwaiters; + __u32 nwaiters; }; struct cobalt_event; @@ -40,13 +42,13 @@ struct cobalt_event_shadow { xnhandle_t handle; union { struct cobalt_event_data *data; - unsigned int data_offset; + __u32 data_offset; } u; - int flags; + __u32 flags; }; struct cobalt_event_info { - unsigned long value; + unsigned int value; int flags; int nrwait; }; diff --git a/include/copperplate/eventobj.h b/include/copperplate/eventobj.h index f40bfda..a98ede9 100644 --- a/include/copperplate/eventobj.h +++ b/include/copperplate/eventobj.h @@ -50,12 +50,12 @@ struct eventobj_wait_struct { struct eventobj_corespec { struct syncobj sobj; - unsigned long value; + unsigned int value; int flags; }; struct eventobj_wait_struct { - unsigned long value; + unsigned int value; int mode; }; @@ -77,27 +77,27 @@ extern "C" { #endif int eventobj_init(struct eventobj *evobj, - unsigned long value, int flags, + unsigned int value, int flags, fnref_type(void (*)(struct eventobj *evobj)) finalizer) __must_check; int eventobj_destroy(struct eventobj *evobj); int eventobj_post(struct eventobj *evobj, - unsigned long bits); + unsigned int bits); int eventobj_wait(struct eventobj *evobj, - unsigned long bits, - unsigned long *bits_r, + unsigned int bits, + unsigned int *bits_r, int mode, const struct timespec *timeout) __must_check; int eventobj_clear(struct eventobj *evobj, - unsigned long bits, - unsigned long *bits_r); + unsigned int bits, + unsigned int *bits_r); int eventobj_inquire(struct eventobj *evobj, size_t waitsz, struct eventobj_waitentry *waitlist, - unsigned long *bits_r); + unsigned int *bits_r); #ifdef __cplusplus } diff --git a/include/trank/native/event.h b/include/trank/native/event.h index 450e8d2..037ddd0 100644 --- a/include/trank/native/event.h +++ b/include/trank/native/event.h @@ -20,4 +20,54 @@ #include <alchemy/event.h> +COMPAT_DECL(int, rt_event_create(RT_EVENT *event, const char *name, + unsigned long ivalue, int mode)); + +COMPAT_DECL(int, rt_event_signal(RT_EVENT *event, unsigned long mask)); + +COMPAT_DECL(int, rt_event_clear(RT_EVENT *event, unsigned long mask, + unsigned long *mask_r)); + +#ifdef __XENO_COMPAT__ + +static inline +int rt_event_wait_until(RT_EVENT *event, + unsigned long mask, unsigned long *mask_r, + int mode, RTIME timeout) +{ + struct timespec ts; + unsigned int _mask; + int ret; + + ret = rt_event_wait_timed(event, mask, &_mask, mode, + alchemy_abs_timeout(timeout, &ts)); + if (ret) + return ret; + + *mask_r = _mask; + + return 0; +} + +static inline +int rt_event_wait(RT_EVENT *event, + unsigned long mask, unsigned long *mask_r, + int mode, RTIME timeout) +{ + struct timespec ts; + unsigned int _mask; + int ret; + + ret = rt_event_wait_timed(event, mask, &_mask, mode, + alchemy_rel_timeout(timeout, &ts)); + if (ret) + return ret; + + *mask_r = _mask; + + return 0; +} + +#endif /* __XENO_COMPAT__ */ + #endif /* _XENOMAI_TRANK_NATIVE_EVENT_H */ diff --git a/kernel/cobalt/posix/event.c b/kernel/cobalt/posix/event.c index a7cc523..7ae74a7 100644 --- a/kernel/cobalt/posix/event.c +++ b/kernel/cobalt/posix/event.c @@ -25,8 +25,8 @@ * Cobalt event notification services * * An event flag group is a synchronization object represented by a - * long-word structure; every available bit in such word can be used - * to map a user-defined event flag. When a flag is set, the + * regular native integer; every available bit in such word can be + * used to map a user-defined event flag. When a flag is set, the * associated event is said to have occurred. * * Xenomai threads and interrupt handlers can use event flags to @@ -42,13 +42,13 @@ struct event_wait_context { struct xnthread_wait_context wc; - unsigned long value; + unsigned int value; int mode; }; COBALT_SYSCALL(event_init, current, int, (struct cobalt_event_shadow __user *u_event, - unsigned long value, int flags)) + unsigned int value, int flags)) { struct cobalt_event_shadow shadow; struct cobalt_event_data *datp; @@ -97,20 +97,21 @@ COBALT_SYSCALL(event_init, current, datp->flags = 0; datp->nwaiters = 0; datoff = xnheap_mapped_offset(heap, datp); + XENO_BUGON(COBALT, datoff != (__u32)datoff); shadow.flags = flags; shadow.handle = event->handle; - shadow.u.data_offset = datoff; + shadow.u.data_offset = (__u32)datoff; return __xn_safe_copy_to_user(u_event, &shadow, sizeof(*u_event)); } COBALT_SYSCALL(event_wait, primary, int, (struct cobalt_event_shadow __user *u_event, - unsigned long bits, - unsigned long __user *u_bits_r, + unsigned int bits, + unsigned int __user *u_bits_r, int mode, struct timespec __user *u_ts)) { - unsigned long rbits = 0, testval; + unsigned int rbits = 0, testval; xnticks_t timeout = XN_INFINITE; struct cobalt_event_data *datp; xntmode_t tmode = XN_RELATIVE; @@ -196,7 +197,7 @@ out: COBALT_SYSCALL(event_sync, current, int, (struct cobalt_event_shadow __user *u_event)) { - unsigned long bits, waitval, testval; + unsigned int bits, waitval, testval; struct xnthread_wait_context *wc; struct cobalt_event_data *datp; struct event_wait_context *ewc; diff --git a/kernel/cobalt/posix/event.h b/kernel/cobalt/posix/event.h index 4ff217f..9341800 100644 --- a/kernel/cobalt/posix/event.h +++ b/kernel/cobalt/posix/event.h @@ -27,7 +27,7 @@ struct cobalt_kqueues; struct cobalt_event { unsigned int magic; - unsigned long value; + unsigned int value; struct xnsynch synch; struct cobalt_event_data *data; struct cobalt_kqueues *owningq; @@ -38,13 +38,13 @@ struct cobalt_event { COBALT_SYSCALL_DECL(event_init, int, (struct cobalt_event_shadow __user *u_evtsh, - unsigned long value, + unsigned int value, int flags)); COBALT_SYSCALL_DECL(event_wait, int, (struct cobalt_event_shadow __user *u_evtsh, - unsigned long bits, - unsigned long __user *u_bits_r, + unsigned int bits, + unsigned int __user *u_bits_r, int mode, struct timespec __user *u_ts)); diff --git a/lib/alchemy/event.c b/lib/alchemy/event.c index 78ddc7a..0f83376 100644 --- a/lib/alchemy/event.c +++ b/lib/alchemy/event.c @@ -62,7 +62,7 @@ static int event_registry_open(struct fsobj *fsobj, void *priv) struct eventobj_waitentry *waitlist, *p; struct fsobstack *o = priv; struct alchemy_event *evcb; - unsigned long val; + unsigned int val; size_t waitsz; int ret; @@ -122,7 +122,7 @@ static void event_finalize(struct eventobj *evobj) fnref_register(libalchemy, event_finalize); /** - * @fn int rt_event_create(RT_EVENT *event, const char *name, unsigned long ivalue, int mode) + * @fn int rt_event_create(RT_EVENT *event, const char *name, unsigned int ivalue, int mode) * @brief Create an event flag group. * * Event groups provide for task synchronization by allowing a set of @@ -165,8 +165,13 @@ fnref_register(libalchemy, event_finalize); * @note Event flag groups can be shared by multiple processes which * belong to the same Xenomai session. */ +#ifndef DOXYGEN_CPP +CURRENT_IMPL(int, rt_event_create, (RT_EVENT *event, const char *name, + unsigned int ivalue, int mode)) +#else int rt_event_create(RT_EVENT *event, const char *name, - unsigned long ivalue, int mode) + unsigned int ivalue, int mode) +#endif { int evobj_flags = 0, ret = 0; struct alchemy_event *evcb; @@ -271,7 +276,7 @@ out: } /** - * @fn int rt_event_wait(RT_EVENT *event, unsigned long mask, unsigned long *mask_r, int mode, RTIME timeout) + * @fn int rt_event_wait(RT_EVENT *event, unsigned int mask, unsigned int *mask_r, int mode, RTIME timeout) * @brief Wait for an arbitrary set of events (with relative scalar timeout). * * This routine is a variant of rt_event_wait_timed() accepting a @@ -292,7 +297,7 @@ out: */ /** - * @fn int rt_event_wait_until(RT_EVENT *event, unsigned long mask, unsigned long *mask_r, int mode, RTIME abs_timeout) + * @fn int rt_event_wait_until(RT_EVENT *event, unsigned int mask, unsigned int *mask_r, int mode, RTIME abs_timeout) * @brief Wait for an arbitrary set of events (with absolute scalar timeout). * * This routine is a variant of rt_event_wait_timed() accepting an @@ -313,7 +318,7 @@ out: */ /** - * @fn int rt_event_wait_timed(RT_EVENT *event, unsigned long mask, unsigned long *mask_r, int mode, const struct timespec *abs_timeout) + * @fn int rt_event_wait_timed(RT_EVENT *event, unsigned int mask, unsigned int *mask_r, int mode, const struct timespec *abs_timeout) * @brief Wait for an arbitrary set of events. * * Waits for one or more events to be signaled in @a event, or until a @@ -375,7 +380,7 @@ out: * defaults to 1 nanosecond). */ int rt_event_wait_timed(RT_EVENT *event, - unsigned long mask, unsigned long *mask_r, + unsigned int mask, unsigned int *mask_r, int mode, const struct timespec *abs_timeout) { int evobj_mode = 0, ret = 0; @@ -406,7 +411,7 @@ out: } /** - * @fn int rt_event_signal(RT_EVENT *event, unsigned long mask) + * @fn int rt_event_signal(RT_EVENT *event, unsigned int mask) * @brief Signal an event. * * Post a set of flags to @a event. All tasks having their wait @@ -424,7 +429,12 @@ out: * * @apitags{unrestricted, switch-primary} */ -int rt_event_signal(RT_EVENT *event, unsigned long mask) +#ifndef DOXYGEN_CPP +CURRENT_IMPL(int, rt_event_signal, + (RT_EVENT *event, unsigned int mask)) +#else +int rt_event_signal(RT_EVENT *event, unsigned int mask) +#endif { struct alchemy_event *evcb; struct service svc; @@ -444,7 +454,7 @@ out: } /** - * @fn int rt_event_clear(RT_EVENT *event,unsigned long mask,unsigned long *mask_r) + * @fn int rt_event_clear(RT_EVENT *event,unsigned int mask,unsigned int *mask_r) * @brief Clear event flags. * * This routine clears a set of flags from @a event. @@ -464,8 +474,13 @@ out: * * @apitags{unrestricted, switch-primary} */ +#ifndef DOXYGEN_CPP +CURRENT_IMPL(int, rt_event_clear, + (RT_EVENT *event, unsigned int mask, unsigned int *mask_r)) +#else int rt_event_clear(RT_EVENT *event, - unsigned long mask, unsigned long *mask_r) + unsigned int mask, unsigned int *mask_r) +#endif { struct alchemy_event *evcb; struct service svc; diff --git a/lib/cobalt/internal.c b/lib/cobalt/internal.c index 8fae37e..fbcf9ee 100644 --- a/lib/cobalt/internal.c +++ b/lib/cobalt/internal.c @@ -437,7 +437,7 @@ struct cobalt_event_data *get_event_data(cobalt_event_t *event) event->u.data; } -int cobalt_event_init(cobalt_event_t *event, unsigned long value, +int cobalt_event_init(cobalt_event_t *event, unsigned int value, int flags) { struct cobalt_event_data *datp; @@ -463,7 +463,7 @@ int cobalt_event_destroy(cobalt_event_t *event) return XENOMAI_SYSCALL1(sc_cobalt_event_destroy, event); } -int cobalt_event_post(cobalt_event_t *event, unsigned long bits) +int cobalt_event_post(cobalt_event_t *event, unsigned int bits) { struct cobalt_event_data *datp = get_event_data(event); @@ -479,7 +479,7 @@ int cobalt_event_post(cobalt_event_t *event, unsigned long bits) } int cobalt_event_wait(cobalt_event_t *event, - unsigned long bits, unsigned long *bits_r, + unsigned int bits, unsigned int *bits_r, int mode, const struct timespec *timeout) { int ret, oldtype; @@ -495,7 +495,7 @@ int cobalt_event_wait(cobalt_event_t *event, } unsigned long cobalt_event_clear(cobalt_event_t *event, - unsigned long bits) + unsigned int bits) { struct cobalt_event_data *datp = get_event_data(event); diff --git a/lib/copperplate/eventobj.c b/lib/copperplate/eventobj.c index e68ec4a..7cd1583 100644 --- a/lib/copperplate/eventobj.c +++ b/lib/copperplate/eventobj.c @@ -27,7 +27,7 @@ #include "cobalt/internal.h" -int eventobj_init(struct eventobj *evobj, unsigned long value, int flags, +int eventobj_init(struct eventobj *evobj, unsigned int value, int flags, fnref_type(void (*)(struct eventobj *evobj)) finalizer) { int ret, event_flags = event_scope_attribute; @@ -60,7 +60,7 @@ int eventobj_destroy(struct eventobj *evobj) } int eventobj_wait(struct eventobj *evobj, - unsigned long bits, unsigned long *bits_r, + unsigned int bits, unsigned int *bits_r, int mode, const struct timespec *timeout) { int ret; @@ -73,7 +73,7 @@ int eventobj_wait(struct eventobj *evobj, return 0; } -int eventobj_post(struct eventobj *evobj, unsigned long bits) +int eventobj_post(struct eventobj *evobj, unsigned int bits) { int ret; @@ -84,10 +84,10 @@ int eventobj_post(struct eventobj *evobj, unsigned long bits) return 0; } -int eventobj_clear(struct eventobj *evobj, unsigned long bits, - unsigned long *bits_r) +int eventobj_clear(struct eventobj *evobj, unsigned int bits, + unsigned int *bits_r) { - unsigned long oldval; + unsigned int oldval; oldval = cobalt_event_clear(&evobj->core.event, bits); if (bits_r) @@ -98,7 +98,7 @@ int eventobj_clear(struct eventobj *evobj, unsigned long bits, int eventobj_inquire(struct eventobj *evobj, size_t waitsz, struct eventobj_waitentry *waitlist, - unsigned long *bits_r) + unsigned int *bits_r) { struct cobalt_threadstat stat; struct cobalt_event_info info; @@ -151,7 +151,7 @@ static void eventobj_finalize(struct syncobj *sobj) } fnref_register(libcopperplate, eventobj_finalize); -int eventobj_init(struct eventobj *evobj, unsigned long value, int flags, +int eventobj_init(struct eventobj *evobj, unsigned int value, int flags, fnref_type(void (*)(struct eventobj *evobj)) finalizer) { int sobj_flags = 0, ret; @@ -187,11 +187,11 @@ int eventobj_destroy(struct eventobj *evobj) } int eventobj_wait(struct eventobj *evobj, - unsigned long bits, unsigned long *bits_r, + unsigned int bits, unsigned int *bits_r, int mode, const struct timespec *timeout) { struct eventobj_wait_struct *wait; - unsigned long waitval, testval; + unsigned int waitval, testval; struct syncstate syns; int ret = 0; @@ -239,10 +239,10 @@ done: return ret; } -int eventobj_post(struct eventobj *evobj, unsigned long bits) +int eventobj_post(struct eventobj *evobj, unsigned int bits) { struct eventobj_wait_struct *wait; - unsigned long waitval, testval; + unsigned int waitval, testval; struct threadobj *thobj, *tmp; struct syncstate syns; int ret; @@ -272,11 +272,11 @@ done: } int eventobj_clear(struct eventobj *evobj, - unsigned long bits, - unsigned long *bits_r) + unsigned int bits, + unsigned int *bits_r) { struct syncstate syns; - unsigned long oldval; + unsigned int oldval; int ret; ret = syncobj_lock(&evobj->core.sobj, &syns); @@ -296,7 +296,7 @@ int eventobj_clear(struct eventobj *evobj, int eventobj_inquire(struct eventobj *evobj, size_t waitsz, struct eventobj_waitentry *waitlist, - unsigned long *bits_r) + unsigned int *bits_r) { struct threadobj *thobj; struct syncstate syns; diff --git a/lib/trank/native.c b/lib/trank/native.c index 5c9f834..437774d 100644 --- a/lib/trank/native.c +++ b/lib/trank/native.c @@ -19,6 +19,7 @@ #include <copperplate/heapobj.h> #include <trank/native/task.h> #include <trank/native/alarm.h> +#include <trank/native/event.h> #include "../alchemy/alarm.h" #ifdef DOXYGEN_CPP @@ -247,6 +248,108 @@ int COMPAT__rt_alarm_create(RT_ALARM *alarm, const char *name); int rt_alarm_wait(RT_ALARM *alarm); +/** + * @fn int COMPAT__rt_event_create(RT_EVENT *event, const char *name, unsigned long ivalue, int mode) + * @brief Create an event flag group. + * + * This call is the legacy form of the rt_event_create() service, + * using a long event mask. The new form uses a regular integer to + * hold the event mask instead. + * + * @param event The address of an event descriptor which can be later + * used to identify uniquely the created object, upon success of this + * call. + * + * @param name An ASCII string standing for the symbolic name of the + * event. When non-NULL and non-empty, a copy of this string is used + * for indexing the created event into the object registry. + * + * @param ivalue The initial value of the group's event mask. + * + * @param mode The event group creation mode. The following flags can + * be OR'ed into this bitmask: + * + * - EV_FIFO makes tasks pend in FIFO order on the event flag group. + * + * - EV_PRIO makes tasks pend in priority order on the event flag group. + * + * @return Zero is returned upon success. Otherwise: + * + * - -EINVAL is returned if @a mode is invalid. + * + * - -ENOMEM is returned if the system fails to get memory from the + * main heap in order to create the event flag group. + * + * - -EEXIST is returned if the @a name is conflicting with an already + * registered event flag group. + * + * - -EPERM is returned if this service was called from an + * asynchronous context. + * + * @apitags{thread-unrestricted, switch-secondary} + * + * @note Event flag groups can be shared by multiple processes which + * belong to the same Xenomai session. + * + * @deprecated This is a compatibility service from the Transition + * Kit. + */ +int COMPAT__rt_event_create(RT_EVENT *event, const char *name, + unsigned long ivalue, int mode); + +/** + * @fn int COMPAT__rt_event_signal(RT_EVENT *event, unsigned long mask) + * @brief Signal an event. + * + * This call is the legacy form of the rt_event_signal() service, + * using a long event mask. The new form uses a regular integer to + * hold the event mask instead. + * + * @param event The event descriptor. + * + * @param mask The set of events to be posted. + * + * @return Zero is returned upon success. Otherwise: + * + * - -EINVAL is returned if @a event is not an event flag group + * descriptor. + * + * @apitags{unrestricted, switch-primary} + * + * @deprecated This is a compatibility service from the Transition + * Kit. + */ +int COMPAT__rt_event_signal(RT_EVENT *event, unsigned int mask); + +/** + * @fn int COMPAT__rt_event_clear(RT_EVENT *event,unsigned long mask,unsigned long *mask_r) + * @brief Clear event flags. + * + * This call is the legacy form of the rt_event_clear() service, + * using a long event mask. The new form uses a regular integer to + * hold the event mask instead. + + * @param event The event descriptor. + * + * @param mask The set of event flags to be cleared. + * + * @param mask_r If non-NULL, @a mask_r is the address of a memory + * location which will receive the previous value of the event flag + * group before the flags are cleared. + * + * @return Zero is returned upon success. Otherwise: + * + * - -EINVAL is returned if @a event is not a valid event flag group + * descriptor. + * + * @apitags{unrestricted, switch-primary} + * + * @deprecated This is a compatibility service from the Transition + * Kit. + */ +int COMPAT__rt_event_clear(RT_EVENT *event, + unsigned long mask, unsigned long *mask_r); + #else /* !DOXYGEN_CPP */ int rt_task_create(RT_TASK *task, const char *name, @@ -449,6 +552,32 @@ int rt_alarm_delete(RT_ALARM *alarm) return 0; } +int rt_event_create(RT_EVENT *event, const char *name, + unsigned long ivalue, int mode) +{ + return __CURRENT(rt_event_create(event, name, ivalue, mode)); +} + +int rt_event_signal(RT_EVENT *event, unsigned long mask) +{ + return __CURRENT(rt_event_signal(event, mask)); +} + +int rt_event_clear(RT_EVENT *event, unsigned long mask, + unsigned long *mask_r) +{ + unsigned int _mask; + int ret; + + ret = __CURRENT(rt_event_clear(event, mask, &_mask)); + if (ret) + return ret; + + *mask_r = _mask; + + return 0; +} + #endif /* !DOXYGEN_CPP */ /** @} */ _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git