00001
00022 #ifndef _RTAI_QUEUE_H
00023 #define _RTAI_QUEUE_H
00024
00025 #include <nucleus/synch.h>
00026 #include <nucleus/heap.h>
00027 #include <rtai/types.h>
00028
00029
00030 #define Q_PRIO XNSYNCH_PRIO
00031 #define Q_FIFO XNSYNCH_FIFO
00032 #define Q_DMA 0x100
00033 #define Q_SHARED 0x200
00034
00035 #define Q_UNLIMITED 0
00036
00037
00038 #define Q_NORMAL 0x0
00039 #define Q_URGENT 0x1
00040 #define Q_BROADCAST 0x2
00041
00042 typedef struct rt_queue_info {
00043
00044 int nwaiters;
00045
00046 int nmessages;
00047
00048 int mode;
00049
00050 size_t qlimit;
00051
00052 size_t poolsize;
00053
00054 char name[XNOBJECT_NAME_LEN];
00055
00056 } RT_QUEUE_INFO;
00057
00058 typedef struct rt_queue_placeholder {
00059
00060 rt_handle_t opaque;
00061
00062 void *opaque2;
00063
00064 caddr_t mapbase;
00065
00066 size_t mapsize;
00067
00068 } RT_QUEUE_PLACEHOLDER;
00069
00070 #if defined(__KERNEL__) || defined(__RTAI_SIM__)
00071
00072 #define RTAI_QUEUE_MAGIC 0x55550707
00073
00074 typedef struct rt_queue {
00075
00076 unsigned magic;
00077
00078 xnsynch_t synch_base;
00079
00080 xnqueue_t pendq;
00081
00082 xnheap_t bufpool;
00083
00084 int mode;
00085
00086 rt_handle_t handle;
00087
00088 int qlimit;
00089
00090 char name[XNOBJECT_NAME_LEN];
00091
00092 #if defined(__KERNEL__) && defined(CONFIG_RTAI_OPT_FUSION)
00093 pid_t cpid;
00094 #endif
00095
00096 } RT_QUEUE;
00097
00098 typedef struct rt_queue_msg {
00099
00100 size_t size;
00101
00102 volatile unsigned refcount;
00103
00104 xnholder_t link;
00105
00106 #define link2rtmsg(laddr) \
00107 ((rt_queue_msg_t *)(((char *)laddr) - (int)(&((rt_queue_msg_t *)0)->link)))
00108
00109 } rt_queue_msg_t;
00110
00111 #ifdef __cplusplus
00112 extern "C" {
00113 #endif
00114
00115 int __queue_pkg_init(void);
00116
00117 void __queue_pkg_cleanup(void);
00118
00119 #ifdef __cplusplus
00120 }
00121 #endif
00122
00123 #else
00124
00125 typedef RT_QUEUE_PLACEHOLDER RT_QUEUE;
00126
00127 #ifdef __cplusplus
00128 extern "C" {
00129 #endif
00130
00131 int rt_queue_bind(RT_QUEUE *q,
00132 const char *name,
00133 RTIME timeout);
00134
00135 int rt_queue_unbind(RT_QUEUE *q);
00136
00137 #ifdef __cplusplus
00138 }
00139 #endif
00140
00141 #endif
00142
00143 #ifdef __cplusplus
00144 extern "C" {
00145 #endif
00146
00147
00148
00149 int rt_queue_create(RT_QUEUE *q,
00150 const char *name,
00151 size_t poolsize,
00152 size_t qlimit,
00153 int mode);
00154
00155 int rt_queue_delete(RT_QUEUE *q);
00156
00157 void *rt_queue_alloc(RT_QUEUE *q,
00158 size_t size);
00159
00160 int rt_queue_free(RT_QUEUE *q,
00161 void *buf);
00162
00163 int rt_queue_send(RT_QUEUE *q,
00164 void *buf,
00165 size_t size,
00166 int mode);
00167
00168 ssize_t rt_queue_recv(RT_QUEUE *q,
00169 void **bufp,
00170 RTIME timeout);
00171
00172 int rt_queue_inquire(RT_QUEUE *q,
00173 RT_QUEUE_INFO *info);
00174
00175 #ifdef __cplusplus
00176 }
00177 #endif
00178
00179 #endif