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