00001
00022 #ifndef _XENO_ALARM_H
00023 #define _XENO_ALARM_H
00024
00025 #include <native/types.h>
00026
00027 typedef struct rt_alarm_info {
00028
00029 RTIME expiration;
00030
00031 unsigned long expiries;
00032
00033 char name[XNOBJECT_NAME_LEN];
00034
00035 } RT_ALARM_INFO;
00036
00037 typedef struct rt_alarm_placeholder {
00038 xnhandle_t opaque;
00039 } RT_ALARM_PLACEHOLDER;
00040
00041 #if defined(__KERNEL__) || defined(__XENO_SIM__)
00042
00043 #include <nucleus/timer.h>
00044 #include <nucleus/synch.h>
00045 #include <native/ppd.h>
00046
00047 #define XENO_ALARM_MAGIC 0x55550909
00048
00049 typedef struct rt_alarm {
00050
00051 unsigned magic;
00052
00053 xntimer_t timer_base;
00054
00055 xnhandle_t handle;
00056
00057 rt_alarm_t handler;
00058
00059 void *cookie;
00060
00061 unsigned long expiries;
00062
00063 #ifdef CONFIG_XENO_OPT_PERVASIVE
00064 pid_t cpid;
00065
00066 xnsynch_t synch_base;
00067 #endif
00068
00069 xnholder_t rlink;
00070
00071 #define rlink2alarm(ln) container_of(ln, RT_ALARM, rlink)
00072
00073 xnqueue_t *rqueue;
00074
00075 char name[XNOBJECT_NAME_LEN];
00076
00077 } RT_ALARM;
00078
00079 #ifdef __cplusplus
00080 extern "C" {
00081 #endif
00082
00083 #ifdef CONFIG_XENO_OPT_NATIVE_ALARM
00084
00085 int __native_alarm_pkg_init(void);
00086
00087 void __native_alarm_pkg_cleanup(void);
00088
00089 static inline void __native_alarm_flush_rq(xnqueue_t *rq)
00090 {
00091 xeno_flush_rq(RT_ALARM, rq, alarm);
00092 }
00093
00094 #else
00095
00096 #define __native_alarm_pkg_init() ({ 0; })
00097 #define __native_alarm_pkg_cleanup() do { } while(0)
00098 #define __native_alarm_flush_rq(rq) do { } while(0)
00099
00100 #endif
00101
00102 int rt_alarm_create(RT_ALARM *alarm,
00103 const char *name,
00104 rt_alarm_t handler,
00105 void *cookie);
00106
00107 #ifdef CONFIG_XENO_OPT_PERVASIVE
00108
00109 void rt_alarm_handler(RT_ALARM *alarm,
00110 void *cookie);
00111
00112 #endif
00113
00114 #ifdef __cplusplus
00115 }
00116 #endif
00117
00118 #else
00119
00120 typedef RT_ALARM_PLACEHOLDER RT_ALARM;
00121
00122 #ifdef __cplusplus
00123 extern "C" {
00124 #endif
00125
00126 int rt_alarm_create(RT_ALARM *alarm,
00127 const char *name);
00128
00129 int rt_alarm_wait(RT_ALARM *alarm);
00130
00131 #ifdef __cplusplus
00132 }
00133 #endif
00134
00135
00136
00137 #endif
00138
00139 #ifdef __cplusplus
00140 extern "C" {
00141 #endif
00142
00143
00144
00145 int rt_alarm_delete(RT_ALARM *alarm);
00146
00147 int rt_alarm_start(RT_ALARM *alarm,
00148 RTIME value,
00149 RTIME interval);
00150
00151 int rt_alarm_stop(RT_ALARM *alarm);
00152
00153 int rt_alarm_inquire(RT_ALARM *alarm,
00154 RT_ALARM_INFO *info);
00155
00156 #ifdef __cplusplus
00157 }
00158 #endif
00159
00160 #endif