Xenomai API  2.5.6.1
include/native/buffer.h
Go to the documentation of this file.
00001 
00022 #ifndef _XENO_BUFFER_H
00023 #define _XENO_BUFFER_H
00024 
00025 #include <native/types.h>
00026 
00027 /* Creation flags. */
00028 #define B_PRIO   XNSYNCH_PRIO   /* Pend by task priority order. */
00029 #define B_FIFO   XNSYNCH_FIFO   /* Pend by FIFO order. */
00030 
00031 typedef struct rt_buffer_info {
00032 
00033         int iwaiters;
00034         int owaiters;
00035         size_t totalmem;
00036         size_t availmem;
00037         char name[XNOBJECT_NAME_LEN];
00038 
00039 } RT_BUFFER_INFO;
00040 
00041 typedef struct rt_buffer_placeholder {
00042         xnhandle_t opaque;
00043 } RT_BUFFER_PLACEHOLDER;
00044 
00045 #if (defined(__KERNEL__) || defined(__XENO_SIM__)) && !defined(DOXYGEN_CPP)
00046 
00047 #include <nucleus/synch.h>
00048 #include <nucleus/heap.h>
00049 #include <native/ppd.h>
00050 
00051 #define XENO_BUFFER_MAGIC 0x55550c0c
00052 
00053 typedef struct rt_buffer {
00054 
00055         unsigned magic;   /* !< Magic code - must be first */
00056 
00057         xnsynch_t isynch_base;  /* !< Base synchronization object -- input side. */
00058         xnsynch_t osynch_base;  /* !< Base synchronization object -- output side. */
00059         xnhandle_t handle;      /* !< Handle in registry -- zero if unregistered. */
00060         char name[XNOBJECT_NAME_LEN]; /* !< Symbolic name. */
00061 
00062         int mode;               /* !< Creation mode. */
00063         off_t rdoff;            /* !< Read offset. */
00064         off_t wroff;            /* !< Write offset. */
00065         size_t fillsz;          /* !< Filled space. */
00066 
00067         u_long wrtoken;         /* !< Write token. */
00068         u_long rdtoken;         /* !< Read token. */
00069 
00070         size_t bufsz;           /* !< Buffer size. */
00071         caddr_t bufmem;         /* !< Buffer space. */
00072 
00073 #ifdef CONFIG_XENO_OPT_PERVASIVE
00074         pid_t cpid;                     /* !< Creator's pid. */
00075 #endif /* CONFIG_XENO_OPT_PERVASIVE */
00076         xnholder_t rlink;               /* !< Link in resource queue. */
00077 #define rlink2buffer(ln)        container_of(ln, RT_BUFFER, rlink)
00078         xnqueue_t *rqueue;              /* !< Backpointer to resource queue. */
00079 
00080 } RT_BUFFER;
00081 
00082 #ifdef __cplusplus
00083 extern "C" {
00084 #endif
00085 
00086 #ifdef CONFIG_XENO_OPT_NATIVE_BUFFER
00087 
00088 int __native_buffer_pkg_init(void);
00089 
00090 void __native_buffer_pkg_cleanup(void);
00091 
00092 static inline void __native_buffer_flush_rq(xnqueue_t *rq)
00093 {
00094         xeno_flush_rq(RT_BUFFER, rq, buffer);
00095 }
00096 
00097 struct xnbufd;
00098 
00099 ssize_t rt_buffer_read_inner(RT_BUFFER *bf, struct xnbufd *bufd,
00100                              xntmode_t timeout_mode, RTIME timeout);
00101 
00102 ssize_t rt_buffer_write_inner(RT_BUFFER *bf, struct xnbufd *bufd,
00103                               xntmode_t timeout_mode, RTIME timeout);
00104 
00105 #else /* !CONFIG_XENO_OPT_NATIVE_BUFFER */
00106 
00107 #define __native_buffer_pkg_init()              ({ 0; })
00108 #define __native_buffer_pkg_cleanup()           do { } while(0)
00109 #define __native_buffer_flush_rq(rq)            do { } while(0)
00110 
00111 #endif /* !CONFIG_XENO_OPT_NATIVE_BUFFER */
00112 
00113 #ifdef __cplusplus
00114 }
00115 #endif
00116 
00117 #else /* !(__KERNEL__ || __XENO_SIM__) */
00118 
00119 typedef RT_BUFFER_PLACEHOLDER RT_BUFFER;
00120 
00121 #ifdef __cplusplus
00122 extern "C" {
00123 #endif
00124 
00125 int rt_buffer_bind(RT_BUFFER *bf,
00126                    const char *name,
00127                    RTIME timeout);
00128 
00129 static inline int rt_buffer_unbind(RT_BUFFER *bf)
00130 {
00131         bf->opaque = XN_NO_HANDLE;
00132         return 0;
00133 }
00134 
00135 #ifdef __cplusplus
00136 }
00137 #endif
00138 
00139 #endif /* __KERNEL__ || __XENO_SIM__ */
00140 
00141 #ifdef __cplusplus
00142 extern "C" {
00143 #endif
00144 
00145 /* Public interface. */
00146 
00147 int rt_buffer_create(RT_BUFFER *bf,
00148                      const char *name,
00149                      size_t bufsz,
00150                      int mode);
00151 
00152 int rt_buffer_delete(RT_BUFFER *bf);
00153 
00154 ssize_t rt_buffer_write(RT_BUFFER *bf,
00155                         const void *ptr, size_t size,
00156                         RTIME timeout);
00157 
00158 ssize_t rt_buffer_write_until(RT_BUFFER *bf,
00159                               const void *ptr, size_t size,
00160                               RTIME timeout);
00161 
00162 ssize_t rt_buffer_read(RT_BUFFER *bf,
00163                        void *ptr, size_t size,
00164                        RTIME timeout);
00165 
00166 ssize_t rt_buffer_read_until(RT_BUFFER *bf,
00167                              void *ptr, size_t size,
00168                              RTIME timeout);
00169 
00170 int rt_buffer_clear(RT_BUFFER *bf);
00171 
00172 int rt_buffer_inquire(RT_BUFFER *bf,
00173                       RT_BUFFER_INFO *info);
00174 
00175 #ifdef __cplusplus
00176 }
00177 #endif
00178 
00179 #endif /* !_XENO_BUFFER_H */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines