queue.h

Go to the documentation of this file.
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 /* Creation flags. */
00030 #define Q_PRIO   XNSYNCH_PRIO   /* Pend by task priority order. */
00031 #define Q_FIFO   XNSYNCH_FIFO   /* Pend by FIFO order. */
00032 #define Q_DMA    0x100          /* Use memory suitable for DMA. */
00033 #define Q_SHARED 0x200          /* Use mappable shared memory. */
00034 
00035 #define Q_UNLIMITED 0           /* No size limit. */
00036 
00037 /* Operation flags. */
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;               /* !< Number of pending tasks. */
00045 
00046     int nmessages;              /* !< Number of queued messages. */
00047 
00048     int mode;                   /* !< Creation mode. */
00049 
00050     size_t qlimit;              /* !< Queue limit. */
00051 
00052     size_t poolsize;            /* !< Size of pool memory. */
00053 
00054     char name[XNOBJECT_NAME_LEN]; /* !< Symbolic name. */
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;   /* !< Magic code - must be first */
00077 
00078     xnsynch_t synch_base; /* !< Base synchronization object. */
00079 
00080     xnqueue_t pendq;    /* !< Pending message queue. */
00081 
00082     xnheap_t bufpool;   /* !< Message buffer pool. */
00083 
00084     int mode;           /* !< Creation mode. */
00085 
00086     rt_handle_t handle; /* !< Handle in registry -- zero if unregistered. */
00087 
00088     int qlimit;         /* !< Maximum queued elements. */
00089 
00090     char name[XNOBJECT_NAME_LEN]; /* !< Symbolic name. */
00091 
00092 #if defined(__KERNEL__) && defined(CONFIG_RTAI_OPT_FUSION)
00093     pid_t cpid;                 /* !< Creator's pid. */
00094 #endif /* __KERNEL__ && CONFIG_RTAI_OPT_FUSION */
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 /* !(__KERNEL__ || __RTAI_SIM__) */
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 /* __KERNEL__ || __RTAI_SIM__ */
00142 
00143 #ifdef __cplusplus
00144 extern "C" {
00145 #endif
00146 
00147 /* Public interface. */
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 /* !_RTAI_QUEUE_H */

Generated on Sat Sep 3 12:32:47 2005 for RTAI Fusion API by  doxygen 1.4.2