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

Reply via email to