00001
00022 #ifndef _XENO_QUEUE_H
00023 #define _XENO_QUEUE_H
00024
00025 #include <nucleus/synch.h>
00026 #include <nucleus/heap.h>
00027 #include <native/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 size_t usedmem;
00055
00056 char name[XNOBJECT_NAME_LEN];
00057
00058 } RT_QUEUE_INFO;
00059
00060 typedef struct rt_queue_placeholder {
00061
00062 xnhandle_t opaque;
00063
00064 void *opaque2;
00065
00066 caddr_t mapbase;
00067
00068 size_t mapsize;
00069
00070 } RT_QUEUE_PLACEHOLDER;
00071
00072 #if defined(__KERNEL__) || defined(__XENO_SIM__)
00073
00074 #include <native/ppd.h>
00075
00076 #define XENO_QUEUE_MAGIC 0x55550707
00077
00078 typedef struct rt_queue {
00079
00080 unsigned magic;
00081
00082 xnsynch_t synch_base;
00083
00084 xnqueue_t pendq;
00085
00086 xnheap_t bufpool;
00087
00088 int mode;
00089
00090 xnhandle_t handle;
00091
00092 int qlimit;
00093
00094 char name[XNOBJECT_NAME_LEN];
00095
00096 #ifdef CONFIG_XENO_OPT_PERVASIVE
00097 pid_t cpid;
00098 #endif
00099
00100 xnholder_t rlink;
00101
00102 #define rlink2queue(ln) container_of(ln, RT_QUEUE, rlink)
00103
00104 xnqueue_t *rqueue;
00105
00106 } RT_QUEUE;
00107
00108 typedef struct rt_queue_msg {
00109
00110 size_t size;
00111
00112 volatile unsigned refcount;
00113
00114 xnholder_t link;
00115
00116 #define link2rtmsg(ln) container_of(ln, rt_queue_msg_t, link)
00117
00118 } rt_queue_msg_t;
00119
00120 #ifdef __cplusplus
00121 extern "C" {
00122 #endif
00123
00124 #ifdef CONFIG_XENO_OPT_NATIVE_QUEUE
00125
00126 int __native_queue_pkg_init(void);
00127
00128 void __native_queue_pkg_cleanup(void);
00129
00130 static inline void __native_queue_flush_rq(xnqueue_t *rq)
00131 {
00132 xeno_flush_rq_norelease(RT_QUEUE, rq, queue);
00133 }
00134
00135 ssize_t rt_queue_receive_inner(RT_QUEUE *q, void **bufp,
00136 xntmode_t timeout_mode, RTIME timeout);
00137
00138 int rt_queue_delete_inner(RT_QUEUE *q,
00139 void __user *mapaddr);
00140
00141 #else
00142
00143 #define __native_queue_pkg_init() ({ 0; })
00144 #define __native_queue_pkg_cleanup() do { } while(0)
00145 #define __native_queue_flush_rq(rq) do { } while(0)
00146
00147 #endif
00148
00149 #ifdef __cplusplus
00150 }
00151 #endif
00152
00153 #else
00154
00155 typedef RT_QUEUE_PLACEHOLDER RT_QUEUE;
00156
00157 #ifdef __cplusplus
00158 extern "C" {
00159 #endif
00160
00161 int rt_queue_bind(RT_QUEUE *q,
00162 const char *name,
00163 RTIME timeout);
00164
00165 int rt_queue_unbind(RT_QUEUE *q);
00166
00167 #ifdef __cplusplus
00168 }
00169 #endif
00170
00171 #endif
00172
00173 #ifdef __cplusplus
00174 extern "C" {
00175 #endif
00176
00177
00178
00179 int rt_queue_create(RT_QUEUE *q,
00180 const char *name,
00181 size_t poolsize,
00182 size_t qlimit,
00183 int mode);
00184
00185 int rt_queue_delete(RT_QUEUE *q);
00186
00187 void *rt_queue_alloc(RT_QUEUE *q,
00188 size_t size);
00189
00190 int rt_queue_free(RT_QUEUE *q,
00191 void *buf);
00192
00193 int rt_queue_send(RT_QUEUE *q,
00194 void *buf,
00195 size_t size,
00196 int mode);
00197
00198 int rt_queue_write(RT_QUEUE *q,
00199 const void *buf,
00200 size_t size,
00201 int mode);
00202
00203 ssize_t rt_queue_receive(RT_QUEUE *q,
00204 void **bufp,
00205 RTIME timeout);
00206
00207 ssize_t rt_queue_receive_until(RT_QUEUE *q,
00208 void **bufp,
00209 RTIME timeout);
00210
00211 ssize_t rt_queue_read(RT_QUEUE *q,
00212 void *bufp,
00213 size_t size,
00214 RTIME timeout);
00215
00216 ssize_t rt_queue_read_until(RT_QUEUE *q,
00217 void *bufp,
00218 size_t size,
00219 RTIME timeout);
00220
00221 int rt_queue_flush(RT_QUEUE *q);
00222
00223 int rt_queue_inquire(RT_QUEUE *q,
00224 RT_QUEUE_INFO *info);
00225
00226 #ifdef __cplusplus
00227 }
00228 #endif
00229
00230 #endif