1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Xenomai API: include/nucleus/pipe.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.6 -->
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="main.html"><span>Main Page</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li><a href="examples.html"><span>Examples</span></a></li>
<li>
<form action="search.php" method="get">
<table cellspacing="0" cellpadding="0" border="0">
<tr>
<td><label> <u>S</u>earch for </label></td>
<td><input type="text" name="query" value="" size="20" accesskey="s"/></td>
</tr>
</table>
</form>
</li>
</ul>
</div>
<h1>include/nucleus/pipe.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * @note Copyright (C) 2001,2002,2003 Philippe Gerum.</span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> * Xenomai is free software; you can redistribute it and/or modify</span>
<a name="l00005"></a>00005 <span class="comment"> * it under the terms of the GNU General Public License as published</span>
<a name="l00006"></a>00006 <span class="comment"> * by the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA</span>
<a name="l00007"></a>00007 <span class="comment"> * 02139, USA; either version 2 of the License, or (at your option)</span>
<a name="l00008"></a>00008 <span class="comment"> * any later version.</span>
<a name="l00009"></a>00009 <span class="comment"> *</span>
<a name="l00010"></a>00010 <span class="comment"> * Xenomai is distributed in the hope that it will be useful, but</span>
<a name="l00011"></a>00011 <span class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00012"></a>00012 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span>
<a name="l00013"></a>00013 <span class="comment"> * General Public License for more details.</span>
<a name="l00014"></a>00014 <span class="comment"> *</span>
<a name="l00015"></a>00015 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
<a name="l00016"></a>00016 <span class="comment"> * along with this program; if not, write to the Free Software</span>
<a name="l00017"></a>00017 <span class="comment"> * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</span>
<a name="l00018"></a>00018 <span class="comment"> */</span>
<a name="l00019"></a>00019
<a name="l00020"></a>00020 <span class="preprocessor">#ifndef _XENO_NUCLEUS_PIPE_H</span>
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _XENO_NUCLEUS_PIPE_H</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span>
<a name="l00023"></a>00023 <span class="preprocessor">#define XNPIPE_NDEVS CONFIG_XENO_OPT_PIPE_NRDEV</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_DEV_MAJOR 150</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span>
<a name="l00026"></a>00026 <span class="preprocessor">#define XNPIPE_IOCTL_BASE 'p'</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPEIOC_GET_NRDEV _IOW(XNPIPE_IOCTL_BASE, 0, int)</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPEIOC_IFLUSH _IO(XNPIPE_IOCTL_BASE,1)</span>
<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPEIOC_OFLUSH _IO(XNPIPE_IOCTL_BASE,2)</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPEIOC_FLUSH XNPIPEIOC_OFLUSH</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPEIOC_SETSIG _IO(XNPIPE_IOCTL_BASE,3)</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span>
<a name="l00033"></a>00033 <span class="preprocessor">#define XNPIPE_NORMAL 0x0</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_URGENT 0x1</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span>
<a name="l00036"></a>00036 <span class="preprocessor">#define XNPIPE_IFLUSH 0x1</span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_OFLUSH 0x2</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span>
<a name="l00039"></a>00039 <span class="preprocessor">#define XNPIPE_MINOR_AUTO -1</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span>
<a name="l00041"></a>00041 <span class="preprocessor">#ifdef __KERNEL__</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span>
<a name="l00043"></a>00043 <span class="preprocessor">#include <nucleus/queue.h></span>
<a name="l00044"></a>00044 <span class="preprocessor">#include <nucleus/synch.h></span>
<a name="l00045"></a>00045 <span class="preprocessor">#include <nucleus/thread.h></span>
<a name="l00046"></a>00046 <span class="preprocessor">#include <linux/types.h></span>
<a name="l00047"></a>00047 <span class="preprocessor">#include <linux/poll.h></span>
<a name="l00048"></a>00048
<a name="l00049"></a>00049 <span class="preprocessor">#define XNPIPE_KERN_CONN 0x1</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_KERN_LCLOSE 0x2</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_USER_CONN 0x4</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_USER_SIGIO 0x8</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_USER_WREAD 0x10</span>
<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_USER_WREAD_READY 0x20</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_USER_WSYNC 0x40</span>
<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#define XNPIPE_USER_WSYNC_READY 0x80</span>
<a name="l00057"></a>00057 <span class="preprocessor"></span>
<a name="l00058"></a>00058 <span class="preprocessor">#define XNPIPE_USER_ALL_WAIT \</span>
<a name="l00059"></a>00059 <span class="preprocessor">(XNPIPE_USER_WREAD|XNPIPE_USER_WSYNC)</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span>
<a name="l00061"></a>00061 <span class="preprocessor">#define XNPIPE_USER_ALL_READY \</span>
<a name="l00062"></a>00062 <span class="preprocessor">(XNPIPE_USER_WREAD_READY|XNPIPE_USER_WSYNC_READY)</span>
<a name="l00063"></a>00063 <span class="preprocessor"></span>
<a name="l00064"></a>00064 <span class="keyword">typedef</span> <span class="keyword">struct </span>xnpipe_mh {
<a name="l00065"></a>00065
<a name="l00066"></a>00066 <span class="keyword">struct </span>xnholder link;
<a name="l00067"></a>00067 <span class="keywordtype">unsigned</span> size;
<a name="l00068"></a>00068 <span class="keywordtype">unsigned</span> rdoff;
<a name="l00069"></a>00069
<a name="l00070"></a>00070 } xnpipe_mh_t;
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keyword">inline</span> xnpipe_mh_t *link2mh(<span class="keyword">struct</span> xnholder *ln)
<a name="l00073"></a>00073 {
<a name="l00074"></a>00074 <span class="keywordflow">return</span> ln ? container_of(ln, xnpipe_mh_t, link) : NULL;
<a name="l00075"></a>00075 }
<a name="l00076"></a>00076
<a name="l00077"></a>00077 <span class="keyword">struct </span>xnpipe_state;
<a name="l00078"></a>00078
<a name="l00079"></a>00079 <span class="keyword">struct </span>xnpipe_operations {
<a name="l00080"></a>00080 void (*output)(<span class="keyword">struct </span>xnpipe_mh *mh, <span class="keywordtype">void</span> *xstate);
<a name="l00081"></a>00081 int (*input)(<span class="keyword">struct </span>xnpipe_mh *mh, <span class="keywordtype">int</span> retval, <span class="keywordtype">void</span> *xstate);
<a name="l00082"></a>00082 <span class="keywordtype">void</span> *(*alloc_ibuf)(<span class="keywordtype">size_t</span> size, <span class="keywordtype">void</span> *xstate);
<a name="l00083"></a>00083 void (*free_ibuf)(<span class="keywordtype">void</span> *buf, <span class="keywordtype">void</span> *xstate);
<a name="l00084"></a>00084 void (*free_obuf)(<span class="keywordtype">void</span> *buf, <span class="keywordtype">void</span> *xstate);
<a name="l00085"></a>00085 void (*release)(<span class="keywordtype">void</span> *xstate);
<a name="l00086"></a>00086 };
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <span class="keyword">struct </span>xnpipe_state {
<a name="l00089"></a>00089
<a name="l00090"></a>00090 <span class="keyword">struct </span>xnholder slink; <span class="comment">/* Link on sleep queue */</span>
<a name="l00091"></a>00091 <span class="keyword">struct </span>xnholder alink; <span class="comment">/* Link on async queue */</span>
<a name="l00092"></a>00092 <span class="preprocessor">#define link2xnpipe(ln, fld) container_of(ln, struct xnpipe_state, fld)</span>
<a name="l00093"></a>00093 <span class="preprocessor"></span>
<a name="l00094"></a>00094 <span class="keyword">struct </span>xnqueue inq; <span class="comment">/* From user-space to kernel */</span>
<a name="l00095"></a>00095 <span class="keyword">struct </span>xnqueue outq; <span class="comment">/* From kernel to user-space */</span>
<a name="l00096"></a>00096 <span class="keyword">struct </span>xnsynch synchbase;
<a name="l00097"></a>00097 <span class="keyword">struct </span>xnpipe_operations ops;
<a name="l00098"></a>00098 <span class="keywordtype">void</span> *xstate; <span class="comment">/* Extra state managed by caller */</span>
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="comment">/* Linux kernel part */</span>
<a name="l00101"></a>00101 xnflags_t status;
<a name="l00102"></a>00102 <span class="keyword">struct </span>fasync_struct *asyncq;
<a name="l00103"></a>00103 wait_queue_head_t readq; <span class="comment">/* open/read/poll waiters */</span>
<a name="l00104"></a>00104 wait_queue_head_t syncq; <span class="comment">/* sync waiters */</span>
<a name="l00105"></a>00105 <span class="keywordtype">int</span> wcount; <span class="comment">/* number of waiters on this minor */</span>
<a name="l00106"></a>00106 <span class="keywordtype">size_t</span> ionrd;
<a name="l00107"></a>00107
<a name="l00108"></a>00108 };
<a name="l00109"></a>00109
<a name="l00110"></a>00110 <span class="keyword">extern</span> <span class="keyword">struct </span>xnpipe_state xnpipe_states[];
<a name="l00111"></a>00111
<a name="l00112"></a>00112 <span class="preprocessor">#define xnminor_from_state(s) (s - xnpipe_states)</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span>
<a name="l00114"></a>00114 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00116"></a>00116 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
<a name="l00117"></a>00117
<a name="l00118"></a>00118 <span class="keywordtype">int</span> xnpipe_mount(<span class="keywordtype">void</span>);
<a name="l00119"></a>00119
<a name="l00120"></a>00120 <span class="keywordtype">void</span> xnpipe_umount(<span class="keywordtype">void</span>);
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="comment">/* Entry points of the kernel interface. */</span>
<a name="l00123"></a>00123
<a name="l00124"></a>00124 <span class="keywordtype">int</span> xnpipe_connect(<span class="keywordtype">int</span> minor,
<a name="l00125"></a>00125 <span class="keyword">struct</span> xnpipe_operations *ops, <span class="keywordtype">void</span> *xstate);
<a name="l00126"></a>00126
<a name="l00127"></a>00127 <span class="keywordtype">int</span> xnpipe_disconnect(<span class="keywordtype">int</span> minor);
<a name="l00128"></a>00128
<a name="l00129"></a>00129 ssize_t xnpipe_send(<span class="keywordtype">int</span> minor,
<a name="l00130"></a>00130 <span class="keyword">struct</span> xnpipe_mh *mh, <span class="keywordtype">size_t</span> size, <span class="keywordtype">int</span> flags);
<a name="l00131"></a>00131
<a name="l00132"></a>00132 ssize_t xnpipe_mfixup(<span class="keywordtype">int</span> minor, <span class="keyword">struct</span> xnpipe_mh *mh, ssize_t size);
<a name="l00133"></a>00133
<a name="l00134"></a>00134 ssize_t xnpipe_recv(<span class="keywordtype">int</span> minor,
<a name="l00135"></a>00135 <span class="keyword">struct</span> xnpipe_mh **pmh, xnticks_t timeout);
<a name="l00136"></a>00136
<a name="l00137"></a>00137 <span class="keywordtype">int</span> xnpipe_flush(<span class="keywordtype">int</span> minor, <span class="keywordtype">int</span> mode);
<a name="l00138"></a>00138
<a name="l00139"></a>00139 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00140"></a>00140 <span class="preprocessor"></span>}
<a name="l00141"></a>00141 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
<a name="l00142"></a>00142
<a name="l00143"></a>00143 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keyword">struct </span>xnholder *xnpipe_m_link(xnpipe_mh_t *mh)
<a name="l00144"></a>00144 {
<a name="l00145"></a>00145 <span class="keywordflow">return</span> &mh->link;
<a name="l00146"></a>00146 }
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">char</span> *xnpipe_m_data(xnpipe_mh_t *mh)
<a name="l00149"></a>00149 {
<a name="l00150"></a>00150 <span class="keywordflow">return</span> (<span class="keywordtype">char</span> *)(mh + 1);
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152
<a name="l00153"></a>00153 <span class="preprocessor">#define xnpipe_m_size(mh) ((mh)->size)</span>
<a name="l00154"></a>00154 <span class="preprocessor"></span>
<a name="l00155"></a>00155 <span class="preprocessor">#define xnpipe_m_rdoff(mh) ((mh)->rdoff)</span>
<a name="l00156"></a>00156 <span class="preprocessor"></span>
<a name="l00157"></a>00157 <span class="preprocessor">#endif </span><span class="comment">/* __KERNEL__ */</span>
<a name="l00158"></a>00158
<a name="l00159"></a>00159 <span class="preprocessor">#endif </span><span class="comment">/* !_XENO_NUCLEUS_PIPE_H */</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Mon Aug 2 12:48:36 2010 for Xenomai API by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
</body>
</html>
|