00001
00022 #ifndef _XENO_EVENT_H
00023 #define _XENO_EVENT_H
00024
00025 #include <nucleus/synch.h>
00026 #include <native/types.h>
00027
00028
00029 #define EV_PRIO XNSYNCH_PRIO
00030 #define EV_FIFO XNSYNCH_FIFO
00031
00032
00033 #define EV_ANY 0x1
00034 #define EV_ALL 0x0
00035
00036 typedef struct rt_event_info {
00037
00038 unsigned long value;
00039
00040 int nwaiters;
00041
00042 char name[XNOBJECT_NAME_LEN];
00043
00044 } RT_EVENT_INFO;
00045
00046 typedef struct rt_event_placeholder {
00047 xnhandle_t opaque;
00048 } RT_EVENT_PLACEHOLDER;
00049
00050 #if (defined(__KERNEL__) || defined(__XENO_SIM__)) && !defined(DOXYGEN_CPP)
00051
00052 #include <native/ppd.h>
00053
00054 #define XENO_EVENT_MAGIC 0x55550404
00055
00056 typedef struct rt_event {
00057
00058 unsigned magic;
00059
00060 xnsynch_t synch_base;
00061
00062 unsigned long value;
00063
00064 xnhandle_t handle;
00065
00066 char name[XNOBJECT_NAME_LEN];
00067
00068 #ifdef CONFIG_XENO_OPT_PERVASIVE
00069 pid_t cpid;
00070 #endif
00071
00072 xnholder_t rlink;
00073
00074 #define rlink2event(ln) container_of(ln, RT_EVENT, rlink)
00075
00076 xnqueue_t *rqueue;
00077
00078 } RT_EVENT;
00079
00080 #ifdef __cplusplus
00081 extern "C" {
00082 #endif
00083
00084 #ifdef CONFIG_XENO_OPT_NATIVE_EVENT
00085
00086 int __native_event_pkg_init(void);
00087
00088 void __native_event_pkg_cleanup(void);
00089
00090 static inline void __native_event_flush_rq(xnqueue_t *rq)
00091 {
00092 xeno_flush_rq(RT_EVENT, rq, event);
00093 }
00094
00095 #else
00096
00097 #define __native_event_pkg_init() ({ 0; })
00098 #define __native_event_pkg_cleanup() do { } while(0)
00099 #define __native_event_flush_rq(rq) do { } while(0)
00100
00101 #endif
00102
00103 #ifdef __cplusplus
00104 }
00105 #endif
00106
00107 #else
00108
00109 typedef RT_EVENT_PLACEHOLDER RT_EVENT;
00110
00111 #ifdef __cplusplus
00112 extern "C" {
00113 #endif
00114
00115 int rt_event_bind(RT_EVENT *event,
00116 const char *name,
00117 RTIME timeout);
00118
00119 static inline int rt_event_unbind (RT_EVENT *event)
00120
00121 {
00122 event->opaque = XN_NO_HANDLE;
00123 return 0;
00124 }
00125
00126 #ifdef __cplusplus
00127 }
00128 #endif
00129
00130 #endif
00131
00132 #ifdef __cplusplus
00133 extern "C" {
00134 #endif
00135
00136
00137
00138 int rt_event_create(RT_EVENT *event,
00139 const char *name,
00140 unsigned long ivalue,
00141 int mode);
00142
00143 int rt_event_delete(RT_EVENT *event);
00144
00145 int rt_event_signal(RT_EVENT *event,
00146 unsigned long mask);
00147
00148 int rt_event_wait(RT_EVENT *event,
00149 unsigned long mask,
00150 unsigned long *mask_r,
00151 int mode,
00152 RTIME timeout);
00153
00154 int rt_event_clear(RT_EVENT *event,
00155 unsigned long mask,
00156 unsigned long *mask_r);
00157
00158 int rt_event_inquire(RT_EVENT *event,
00159 RT_EVENT_INFO *info);
00160
00161 #ifdef __cplusplus
00162 }
00163 #endif
00164
00165 #endif