00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _RTAI_RT_MSGQ_H
00022 #define _RTAI_RT_MSGQ_H
00023
00024 #include <linux/version.h>
00025 #include <rtai_sem.h>
00026
00027 #define MSGQ_INIT TBX_INIT
00028 #define MSGQ_DELETE TBX_DELETE
00029 #define NAMED_MSGQ_INIT NAMED_TBX_INIT
00030 #define NAMED_MSGQ_DELETE NAMED_TBX_DELETE
00031 #define MSG_SEND TBX_SEND
00032 #define MSG_SEND_IF TBX_SEND_IF
00033 #define MSG_SEND_UNTIL TBX_SEND_UNTIL
00034 #define MSG_SEND_TIMED TBX_SEND_TIMED
00035 #define MSG_RECEIVE TBX_RECEIVE
00036 #define MSG_RECEIVE_IF TBX_RECEIVE_IF
00037 #define MSG_RECEIVE_UNTIL TBX_RECEIVE_UNTIL
00038 #define MSG_RECEIVE_TIMED TBX_RECEIVE_TIMED
00039 #define MSG_BROADCAST TBX_BROADCAST
00040 #define MSG_BROADCAST_IF TBX_BROADCAST_IF
00041 #define MSG_BROADCAST_UNTIL TBX_BROADCAST_UNTIL
00042 #define MSG_BROADCAST_TIMED TBX_BROADCAST_TIMED
00043 #define MSG_EVDRP TBX_URGENT
00044
00045 #define TBX RT_MSGQ
00046
00047 #ifdef __KERNEL__
00048
00049 typedef struct rt_msgh {
00050 void *malloc;
00051 int broadcast;
00052 int size;
00053 int priority;
00054 void *next;
00055 } RT_MSGH;
00056
00057 #define RT_MSGH_SIZE (sizeof(RT_MSGH))
00058
00059 typedef struct rt_msg {
00060 RT_MSGH hdr;
00061 char msg[1];
00062 } RT_MSG;
00063
00064 typedef struct rt_msgq {
00065 int nmsg;
00066 int fastsize;
00067 int slot;
00068 void **slots;
00069 void *firstmsg;
00070 SEM receivers, senders;
00071 SEM received, freslots;
00072 SEM broadcast;
00073 spinlock_t lock;
00074 } RT_MSGQ;
00075
00076 #include <linux/types.h>
00077
00078 #ifdef __cplusplus
00079 extern "C" {
00080 #endif
00081
00082 int __rtai_msg_queue_init(void);
00083
00084 void __rtai_msg_queue_exit(void);
00085
00086 RTAI_SYSCALL_MODE int rt_msgq_init(RT_MSGQ *msgq, int nmsg, int msg_size);
00087
00088 RTAI_SYSCALL_MODE int rt_msgq_delete(RT_MSGQ *msgq);
00089
00090 RTAI_SYSCALL_MODE RT_MSGQ *_rt_named_msgq_init(unsigned long msgq_name, int nmsg, int size);
00091 static inline RT_MSGQ *rt_named_msgq_init(const char *msgq_name, int nmsg, int size)
00092 {
00093 return _rt_named_msgq_init(nam2num(msgq_name), nmsg, size);
00094 }
00095
00096 RTAI_SYSCALL_MODE int rt_named_msgq_delete(RT_MSGQ *msgq);
00097
00098 RTAI_SYSCALL_MODE int _rt_msg_send(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, int space);
00099 static inline int rt_msg_send(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri)
00100 {
00101 return _rt_msg_send(msgq, msg, msg_size, msgpri, 1);
00102 }
00103
00104 RTAI_SYSCALL_MODE int _rt_msg_send_if(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, int space);
00105 static inline int rt_msg_send_if(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri)
00106 {
00107 return _rt_msg_send_if(msgq, msg, msg_size, msgpri, 1);
00108 }
00109
00110 RTAI_SYSCALL_MODE int _rt_msg_send_until(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME until, int space);
00111 static inline int rt_msg_send_until(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME until)
00112 {
00113 return _rt_msg_send_until(msgq, msg, msg_size, msgpri, until, 1);
00114 }
00115
00116 RTAI_SYSCALL_MODE int _rt_msg_send_timed(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME delay, int space);
00117 static inline int rt_msg_send_timed(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME delay)
00118 {
00119 return _rt_msg_send_timed(msgq, msg, msg_size, msgpri, delay, 1);
00120 }
00121
00122 RTAI_SYSCALL_MODE int _rt_msg_receive(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri, int space);
00123 static inline int rt_msg_receive(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri)
00124 {
00125 return _rt_msg_receive(msgq, msg, msg_size, msgpri, 1);
00126 }
00127
00128 RTAI_SYSCALL_MODE int _rt_msg_receive_if(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri, int space);
00129 static inline int rt_msg_receive_if(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri)
00130 {
00131 return _rt_msg_receive_if(msgq, msg, msg_size, msgpri, 1);
00132 }
00133
00134 RTAI_SYSCALL_MODE int _rt_msg_receive_until(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri, RTIME until, int space);
00135 static inline int rt_msg_receive_until(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri, RTIME until)
00136 {
00137 return _rt_msg_receive_until(msgq, msg, msg_size, msgpri, until, 1);
00138 }
00139
00140 RTAI_SYSCALL_MODE int _rt_msg_receive_timed(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri, RTIME delay, int space);
00141 static inline int rt_msg_receive_timed(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri, RTIME delay)
00142 {
00143 return _rt_msg_receive_timed(msgq, msg, msg_size, msgpri, delay, 1);
00144 }
00145
00146 RTAI_SYSCALL_MODE int _rt_msg_evdrp(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri, int space);
00147 static inline int rt_msg_evdrp(RT_MSGQ *msgq, void *msg, int msg_size, int *msgpri)
00148 {
00149 return _rt_msg_evdrp(msgq, msg, msg_size, msgpri, 1);
00150 }
00151
00152 RTAI_SYSCALL_MODE int _rt_msg_broadcast(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, int space);
00153 static inline int rt_msg_broadcast(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri)
00154 {
00155 return _rt_msg_broadcast(msgq, msg, msg_size, msgpri, 1);
00156 }
00157
00158 RTAI_SYSCALL_MODE int _rt_msg_broadcast_if(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, int space);
00159 static inline int rt_msg_broadcast_if(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri)
00160 {
00161 return _rt_msg_broadcast_if(msgq, msg, msg_size, msgpri, 1);
00162 }
00163
00164 RTAI_SYSCALL_MODE int _rt_msg_broadcast_until(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME until, int space);
00165 static inline int rt_msg_broadcast_until(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME until)
00166 {
00167 return _rt_msg_broadcast_until(msgq, msg, msg_size, msgpri, until, 1);
00168 }
00169
00170 RTAI_SYSCALL_MODE int _rt_msg_broadcast_timed(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME delay, int space);
00171 static inline int rt_msg_broadcast_delay(RT_MSGQ *msgq, void *msg, int msg_size, int msgpri, RTIME delay)
00172 {
00173 return _rt_msg_broadcast_until(msgq, msg, msg_size, msgpri, delay, 1);
00174 }
00175
00176 #ifdef __cplusplus
00177 }
00178 #endif
00179
00180 #else
00181
00182 #include <signal.h>
00183 #include <rtai_lxrt.h>
00184
00185 struct rt_msgh;
00186
00187 #ifdef __cplusplus
00188 extern "C" {
00189 #endif
00190
00191 typedef struct rt_msgq {
00192 int dummy;
00193 } RT_MSGQ;
00194
00195 RTAI_PROTO(RT_MSGQ *, rt_msgq_init, (unsigned long msgq, int nmsg, int msg_size))
00196 {
00197 struct { unsigned long msgq; long nmsg; long msg_size; } arg = { msgq, nmsg, msg_size };
00198 return rtai_lxrt(BIDX, SIZARG, NAMED_MSGQ_INIT, &arg).v[LOW];
00199 }
00200
00201 RTAI_PROTO(int, rt_msgq_delete, (RT_MSGQ *msgq))
00202 {
00203 struct { RT_MSGQ *msgq; } arg = { msgq };
00204 return rtai_lxrt(BIDX, SIZARG, NAMED_MSGQ_DELETE, &arg).i[LOW];
00205 }
00206
00207 RTAI_PROTO(RT_MSGQ *, rt_named_msgq_init,(const char *name, int nmsg, int size))
00208 {
00209 struct { unsigned long name; long nmsg; long size; } arg = { nam2num(name), nmsg, size };
00210 return rtai_lxrt(BIDX, SIZARG, NAMED_MSGQ_INIT, &arg).v[LOW];
00211 }
00212
00213 RTAI_PROTO(int, rt_named_msgq_delete, (RT_MSGQ *msgq))
00214 {
00215 struct { RT_MSGQ *msgq; } arg = { msgq };
00216 return rtai_lxrt(BIDX, SIZARG, NAMED_MSGQ_DELETE, &arg).i[LOW];
00217 }
00218
00219 RTAI_PROTO(int, rt_msg_send, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio))
00220 {
00221 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; long space; } arg = { msgq, msg, msg_size, msgprio, 0 };
00222 return rtai_lxrt(BIDX, SIZARG, MSG_SEND, &arg).i[LOW];
00223 }
00224
00225 RTAI_PROTO(int, rt_msg_send_if, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio))
00226 {
00227 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; long space; } arg = { msgq, msg, msg_size, msgprio, 0 };
00228 return rtai_lxrt(BIDX, SIZARG, MSG_SEND_IF, &arg).i[LOW];
00229 }
00230
00231 RTAI_PROTO(int, rt_msg_send_until, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio, RTIME until))
00232 {
00233 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; RTIME until; long space; } arg = { msgq, msg, msg_size, msgprio, until, 0 };
00234 return rtai_lxrt(BIDX, SIZARG, MSG_SEND_UNTIL, &arg).i[LOW];
00235 }
00236
00237 RTAI_PROTO(int, rt_msg_send_timed, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio, RTIME delay))
00238 {
00239 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; RTIME delay; long space; } arg = { msgq, msg, msg_size, msgprio, delay, 0 };
00240 return rtai_lxrt(BIDX, SIZARG, MSG_SEND_TIMED, &arg).i[LOW];
00241 }
00242
00243 RTAI_PROTO(int, rt_msg_receive, (RT_MSGQ *msgq, void *msg, int msg_size, int *msgprio))
00244 {
00245 struct { RT_MSGQ *msgq; void *msg; long msg_size; int *msgprio; long space; } arg = { msgq, msg, msg_size, msgprio, 0 };
00246 return rtai_lxrt(BIDX, SIZARG, MSG_RECEIVE, &arg).i[LOW];
00247 }
00248
00249 RTAI_PROTO(int, rt_msg_receive_if, (RT_MSGQ *msgq, void *msg, int msg_size, int *msgprio))
00250 {
00251 struct { RT_MSGQ *msgq; void *msg; long msg_size; int *msgprio; long space; } arg = { msgq, msg, msg_size, msgprio, 0 };
00252 return rtai_lxrt(BIDX, SIZARG, MSG_RECEIVE_IF, &arg).i[LOW];
00253 }
00254
00255 RTAI_PROTO(int, rt_msg_receive_until, (RT_MSGQ *msgq, void *msg, int msg_size, int *msgprio, RTIME until))
00256 {
00257 struct { RT_MSGQ *msgq; void *msg; long msg_size; int *msgprio; RTIME until; long space; } arg = { msgq, msg, msg_size, msgprio, until, 0 };
00258 return rtai_lxrt(BIDX, SIZARG, MSG_RECEIVE_UNTIL, &arg).i[LOW];
00259 }
00260
00261 RTAI_PROTO(int, rt_msg_receive_timed, (RT_MSGQ *msgq, void *msg, int msg_size, int *msgprio, RTIME delay))
00262 {
00263 struct { RT_MSGQ *msgq; void *msg; long msg_size; int *msgprio; RTIME delay; long space; } arg = { msgq, msg, msg_size, msgprio, delay, 0 };
00264 return rtai_lxrt(BIDX, SIZARG, MSG_RECEIVE_TIMED, &arg).i[LOW];
00265 }
00266
00267 RTAI_PROTO(int, rt_msg_evdrp, (RT_MSGQ *msgq, void *msg, int msg_size, int *msgprio))
00268 {
00269 struct { RT_MSGQ *msgq; void *msg; long msg_size; int *msgprio; long space; } arg = { msgq, msg, msg_size, msgprio, 0 };
00270 return rtai_lxrt(BIDX, SIZARG, MSG_EVDRP, &arg).i[LOW];
00271 }
00272
00273 RTAI_PROTO(int, rt_msg_broadcast, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio))
00274 {
00275 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; long space; } arg = { msgq, msg, msg_size, msgprio, 0 };
00276 return rtai_lxrt(BIDX, SIZARG, MSG_BROADCAST, &arg).i[LOW];
00277 }
00278
00279 RTAI_PROTO(int, rt_msg_broadcast_if, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio))
00280 {
00281 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; long space; } arg = { msgq, msg, msg_size, msgprio, 0 };
00282 return rtai_lxrt(BIDX, SIZARG, MSG_BROADCAST_IF, &arg).i[LOW];
00283 }
00284
00285 RTAI_PROTO(int, rt_msg_broadcast_until, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio, RTIME until))
00286 {
00287 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; RTIME until; long space; } arg = { msgq, msg, msg_size, msgprio, until, 0 };
00288 return rtai_lxrt(BIDX, SIZARG, MSG_BROADCAST_UNTIL, &arg).i[LOW];
00289 }
00290
00291 RTAI_PROTO(int, rt_msg_broadcast_timed, (RT_MSGQ *msgq, void *msg, int msg_size, int msgprio, RTIME delay))
00292 {
00293 struct { RT_MSGQ *msgq; void *msg; long msg_size; long msgprio; RTIME delay; long space; } arg = { msgq, msg, msg_size, msgprio, delay, 0 };
00294 return rtai_lxrt(BIDX, SIZARG, MSG_BROADCAST_TIMED, &arg).i[LOW];
00295 }
00296
00297 #ifdef __cplusplus
00298 }
00299 #endif
00300
00301 #endif
00302
00303 #define rt_tbx_init(tbx, size, flags) rt_msgq_init(tbx, size, 0)
00304 #define rt_tbx_delete(tbx) rt_msgq_delete(tbx)
00305
00306 #define rt_tbx_send(tbx, msg, msg_size) rt_msg_send(tbx, msg, msg_size, 1)
00307 #define rt_tbx_send_if(tbx, msg, msg_size) rt_msg_send_if(tbx, msg, msg_size, 1)
00308 #define rt_tbx_send_until(tbx, msg, msg_size, until) rt_msg_send_until(tbx, msg, msg_size, 1, until)
00309 #define rt_tbx_send_timed(tbx, msg, msg_size, delay) rt_msg_send_timed(tbx, msg, msg_size, 1, delay)
00310
00311 #define rt_tbx_receive(tbx, msg, msg_size) rt_msg_receive(tbx, msg, msg_size, 0)
00312 #define rt_tbx_receive_if(tbx, msg, msg_size) rt_msg_receive_if(tbx, msg, msg_size, 0)
00313 #define rt_tbx_receive_until(tbx, msg, msg_size, until) rt_msg_receive_until(tbx, msg, msg_size, 0, until)
00314 #define rt_tbx_receive_timed(tbx, msg, msg_size, delay) rt_msg_receive_timed(tbx, msg, msg_size, 0, delay)
00315
00316 #define rt_tbx_broadcast(tbx, msg, msg_size) rt_msg_broadcast(tbx, msg, msg_size, 0)
00317 #define rt_tbx_broadcast_if(tbx, msg, msg_size) rt_msg_broadcast_if(tbx, msg, msg_size, 0)
00318 #define rt_tbx_broadcast_until(tbx, msg, msg_size, until) rt_msg_broadcast_until(tbx, msg, msg_size, 0, until)
00319 #define rt_tbx_broadcast_timed(tbx, msg, msg_size, delay) rt_msg_broadcast_timed(tbx, msg, msg_size, 0, delay)
00320
00321 #define rt_tbx_urgent(tbx, msg, msg_size) rt_msg_send(tbx, msg, msg_size, 0)
00322 #define rt_tbx_urgent_if(tbx, msg, msg_size) rt_msg_send_if(tbx, msg, msg_size, 0)
00323 #define rt_tbx_urgent_until(tbx, msg, msg_size, until) rt_msg_send_until(tbx, msg, msg_size, 0, until)
00324 #define rt_tbx_urgent_timed(tbx, msg, msg_size, delay) rt_msg_send_timed(tbx, msg, msg_size, 0, delay)
00325
00326 #endif