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 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
|
<!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: ksrc/skins/posix/internal.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>ksrc/skins/posix/internal.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"> * Written by Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>.</span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> * This program is free software; you can redistribute it and/or</span>
<a name="l00005"></a>00005 <span class="comment"> * modify it under the terms of the GNU General Public License as</span>
<a name="l00006"></a>00006 <span class="comment"> * published by the Free Software Foundation; either version 2 of the</span>
<a name="l00007"></a>00007 <span class="comment"> * License, or (at your option) any later version.</span>
<a name="l00008"></a>00008 <span class="comment"> *</span>
<a name="l00009"></a>00009 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
<a name="l00010"></a>00010 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00011"></a>00011 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<a name="l00012"></a>00012 <span class="comment"> * GNU General Public License for more details.</span>
<a name="l00013"></a>00013 <span class="comment"> *</span>
<a name="l00014"></a>00014 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
<a name="l00015"></a>00015 <span class="comment"> * along with this program; if not, write to the Free Software</span>
<a name="l00016"></a>00016 <span class="comment"> * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</span>
<a name="l00017"></a>00017 <span class="comment"> */</span>
<a name="l00018"></a>00018
<a name="l00019"></a>00019 <span class="preprocessor">#ifndef _POSIX_INTERNAL_H</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span><span class="preprocessor">#define _POSIX_INTERNAL_H</span>
<a name="l00021"></a>00021 <span class="preprocessor"></span>
<a name="l00022"></a>00022 <span class="preprocessor">#include <nucleus/xenomai.h></span>
<a name="l00023"></a>00023 <span class="preprocessor">#include <nucleus/ppd.h></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include <<a class="code" href="select_8h.html" title="file descriptors events multiplexing header.">nucleus/select.h</a>></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include <posix/posix.h></span>
<a name="l00026"></a>00026 <span class="preprocessor">#include <posix/registry.h></span>
<a name="l00027"></a>00027
<a name="l00028"></a>00028 <span class="comment">/* debug support */</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include <nucleus/assert.h></span>
<a name="l00030"></a>00030
<a name="l00031"></a>00031 <span class="preprocessor">#ifndef CONFIG_XENO_OPT_DEBUG_POSIX</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#define CONFIG_XENO_OPT_DEBUG_POSIX 0</span>
<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span>
<a name="l00035"></a>00035 <span class="preprocessor">#define PSE51_MAGIC(n) (0x8686##n##n)</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_ANY_MAGIC PSE51_MAGIC(00)</span>
<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_THREAD_MAGIC PSE51_MAGIC(01)</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_THREAD_ATTR_MAGIC PSE51_MAGIC(02)</span>
<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_MUTEX_MAGIC PSE51_MAGIC(03)</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_MUTEX_ATTR_MAGIC (PSE51_MAGIC(04) & ((1 << 24) - 1))</span>
<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_COND_MAGIC PSE51_MAGIC(05)</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_COND_ATTR_MAGIC (PSE51_MAGIC(05) & ((1 << 24) - 1))</span>
<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_SEM_MAGIC PSE51_MAGIC(06)</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_KEY_MAGIC PSE51_MAGIC(07)</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_ONCE_MAGIC PSE51_MAGIC(08)</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_MQ_MAGIC PSE51_MAGIC(09)</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_MQD_MAGIC PSE51_MAGIC(0A)</span>
<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_INTR_MAGIC PSE51_MAGIC(0B)</span>
<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_NAMED_SEM_MAGIC PSE51_MAGIC(0C)</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_TIMER_MAGIC PSE51_MAGIC(0D)</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_SHM_MAGIC PSE51_MAGIC(0E)</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span>
<a name="l00053"></a>00053 <span class="preprocessor">#define PSE51_MIN_PRIORITY XNSCHED_LOW_PRIO</span>
<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#define PSE51_MAX_PRIORITY XNSCHED_HIGH_PRIO</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span>
<a name="l00056"></a>00056 <span class="preprocessor">#define ONE_BILLION 1000000000</span>
<a name="l00057"></a>00057 <span class="preprocessor"></span>
<a name="l00058"></a>00058 <span class="preprocessor">#define pse51_obj_active(h,m,t) \</span>
<a name="l00059"></a>00059 <span class="preprocessor"> ((h) && ((t *)(h))->magic == (m))</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span>
<a name="l00061"></a>00061 <span class="preprocessor">#define pse51_obj_deleted(h,m,t) \</span>
<a name="l00062"></a>00062 <span class="preprocessor"> ((h) && ((t *)(h))->magic == ~(m))</span>
<a name="l00063"></a>00063 <span class="preprocessor"></span>
<a name="l00064"></a>00064 <span class="preprocessor">#define pse51_mark_deleted(t) ((t)->magic = ~(t)->magic)</span>
<a name="l00065"></a>00065 <span class="preprocessor"></span>
<a name="l00066"></a>00066 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l00067"></a>00067 xnqueue_t condq;
<a name="l00068"></a>00068 xnqueue_t intrq;
<a name="l00069"></a>00069 xnqueue_t mutexq;
<a name="l00070"></a>00070 xnqueue_t semq;
<a name="l00071"></a>00071 xnqueue_t threadq;
<a name="l00072"></a>00072 xnqueue_t timerq;
<a name="l00073"></a>00073 } pse51_kqueues_t;
<a name="l00074"></a>00074
<a name="l00075"></a>00075 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_PERVASIVE</span>
<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l00077"></a>00077 pse51_kqueues_t kqueues;
<a name="l00078"></a>00078 pse51_assocq_t uqds;
<a name="l00079"></a>00079 pse51_assocq_t usems;
<a name="l00080"></a>00080 pse51_assocq_t umaps;
<a name="l00081"></a>00081 pse51_assocq_t ufds;
<a name="l00082"></a>00082
<a name="l00083"></a>00083 xnshadow_ppd_t ppd;
<a name="l00084"></a>00084
<a name="l00085"></a>00085 <span class="preprocessor">#define ppd2queues(addr) \</span>
<a name="l00086"></a>00086 <span class="preprocessor"> ((pse51_queues_t *) ((char *) (addr) - offsetof(pse51_queues_t, ppd)))</span>
<a name="l00087"></a>00087 <span class="preprocessor"></span>
<a name="l00088"></a>00088 } pse51_queues_t;
<a name="l00089"></a>00089
<a name="l00090"></a>00090 <span class="keyword">extern</span> <span class="keywordtype">int</span> pse51_muxid;
<a name="l00091"></a>00091 <span class="preprocessor">#endif </span><span class="comment">/* CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l00092"></a>00092
<a name="l00093"></a>00093 <span class="keyword">extern</span> xntbase_t *pse51_tbase;
<a name="l00094"></a>00094
<a name="l00095"></a>00095 <span class="keyword">extern</span> pse51_kqueues_t pse51_global_kqueues;
<a name="l00096"></a>00096
<a name="l00097"></a>00097 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_PERVASIVE</span>
<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keyword">inline</span> pse51_queues_t *pse51_queues(<span class="keywordtype">void</span>)
<a name="l00099"></a>00099 {
<a name="l00100"></a>00100 xnshadow_ppd_t *ppd;
<a name="l00101"></a>00101 spl_t s;
<a name="l00102"></a>00102
<a name="l00103"></a>00103 xnlock_get_irqsave(&nklock, s);
<a name="l00104"></a>00104
<a name="l00105"></a>00105 ppd = <a class="code" href="group__shadow.html#g14c8b586498491f886d7b5335f92c3b1" title="Return the per-process data attached to the calling process.">xnshadow_ppd_get</a>(pse51_muxid);
<a name="l00106"></a>00106
<a name="l00107"></a>00107 xnlock_put_irqrestore(&nklock, s);
<a name="l00108"></a>00108
<a name="l00109"></a>00109 <span class="keywordflow">if</span> (!ppd)
<a name="l00110"></a>00110 <span class="keywordflow">return</span> NULL;
<a name="l00111"></a>00111
<a name="l00112"></a>00112 <span class="keywordflow">return</span> ppd2queues(ppd);
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114 <span class="preprocessor">#endif </span><span class="comment">/* CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l00115"></a>00115
<a name="l00116"></a>00116 <span class="keyword">static</span> <span class="keyword">inline</span> pse51_kqueues_t *pse51_kqueues(<span class="keywordtype">int</span> pshared)
<a name="l00117"></a>00117 {
<a name="l00118"></a>00118 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_PERVASIVE</span>
<a name="l00119"></a>00119 <span class="preprocessor"></span> xnshadow_ppd_t *ppd;
<a name="l00120"></a>00120
<a name="l00121"></a>00121 <span class="keywordflow">if</span> (pshared || !(ppd = <a class="code" href="group__shadow.html#g14c8b586498491f886d7b5335f92c3b1" title="Return the per-process data attached to the calling process.">xnshadow_ppd_get</a>(pse51_muxid)))
<a name="l00122"></a>00122 <span class="keywordflow">return</span> &pse51_global_kqueues;
<a name="l00123"></a>00123
<a name="l00124"></a>00124 <span class="keywordflow">return</span> &ppd2queues(ppd)->kqueues;
<a name="l00125"></a>00125 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l00126"></a>00126 <span class="keywordflow">return</span> &pse51_global_kqueues;
<a name="l00127"></a>00127 <span class="preprocessor">#endif </span><span class="comment">/* !CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l00128"></a>00128 }
<a name="l00129"></a>00129
<a name="l00130"></a>00130 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> ticks2ts(<span class="keyword">struct</span> timespec *ts, xnticks_t ticks)
<a name="l00131"></a>00131 {
<a name="l00132"></a>00132 ts->tv_sec = xnarch_divrem_billion(xntbase_ticks2ns(pse51_tbase, ticks),
<a name="l00133"></a>00133 &ts->tv_nsec);
<a name="l00134"></a>00134 }
<a name="l00135"></a>00135
<a name="l00136"></a>00136 <span class="keyword">static</span> <span class="keyword">inline</span> xnticks_t ts2ticks_floor(<span class="keyword">const</span> <span class="keyword">struct</span> timespec *ts)
<a name="l00137"></a>00137 {
<a name="l00138"></a>00138 xntime_t nsecs = ts->tv_nsec;
<a name="l00139"></a>00139 <span class="keywordflow">if</span>(ts->tv_sec)
<a name="l00140"></a>00140 nsecs += (xntime_t) ts->tv_sec * ONE_BILLION;
<a name="l00141"></a>00141 <span class="keywordflow">return</span> xntbase_ns2ticks(pse51_tbase, nsecs);
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143
<a name="l00144"></a>00144 <span class="keyword">static</span> <span class="keyword">inline</span> xnticks_t ts2ticks_ceil(<span class="keyword">const</span> <span class="keyword">struct</span> timespec *ts)
<a name="l00145"></a>00145 {
<a name="l00146"></a>00146 xntime_t nsecs = ts->tv_nsec;
<a name="l00147"></a>00147 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> rem;
<a name="l00148"></a>00148 xnticks_t ticks;
<a name="l00149"></a>00149 <span class="keywordflow">if</span>(ts->tv_sec)
<a name="l00150"></a>00150 nsecs += (xntime_t) ts->tv_sec * ONE_BILLION;
<a name="l00151"></a>00151 ticks = xnarch_ulldiv(nsecs, xntbase_get_tickval(pse51_tbase), &rem);
<a name="l00152"></a>00152 <span class="keywordflow">return</span> rem ? ticks+1 : ticks;
<a name="l00153"></a>00153 }
<a name="l00154"></a>00154
<a name="l00155"></a>00155 <span class="keyword">static</span> <span class="keyword">inline</span> xnticks_t tv2ticks_ceil(<span class="keyword">const</span> <span class="keyword">struct</span> timeval *tv)
<a name="l00156"></a>00156 {
<a name="l00157"></a>00157 xntime_t nsecs = tv->tv_usec * 1000;
<a name="l00158"></a>00158 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> rem;
<a name="l00159"></a>00159 xnticks_t ticks;
<a name="l00160"></a>00160 <span class="keywordflow">if</span>(tv->tv_sec)
<a name="l00161"></a>00161 nsecs += (xntime_t) tv->tv_sec * ONE_BILLION;
<a name="l00162"></a>00162 ticks = xnarch_ulldiv(nsecs, xntbase_get_tickval(pse51_tbase), &rem);
<a name="l00163"></a>00163 <span class="keywordflow">return</span> rem ? ticks+1 : ticks;
<a name="l00164"></a>00164 }
<a name="l00165"></a>00165
<a name="l00166"></a>00166 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> ticks2tv(<span class="keyword">struct</span> timeval *tv, xnticks_t ticks)
<a name="l00167"></a>00167 {
<a name="l00168"></a>00168 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> nsecs;
<a name="l00169"></a>00169 tv->tv_sec = xnarch_divrem_billion(xntbase_ticks2ns(pse51_tbase, ticks),
<a name="l00170"></a>00170 &nsecs);
<a name="l00171"></a>00171 tv->tv_usec = nsecs / 1000;
<a name="l00172"></a>00172 }
<a name="l00173"></a>00173
<a name="l00174"></a>00174 <span class="keyword">static</span> <span class="keyword">inline</span> xnticks_t clock_get_ticks(clockid_t clock_id)
<a name="l00175"></a>00175 {
<a name="l00176"></a>00176 <span class="keywordflow">if</span>(clock_id == CLOCK_REALTIME)
<a name="l00177"></a>00177 <span class="keywordflow">return</span> <a class="code" href="group__timebase.html#g5246b53b5b2d1b11d4fab4312fd16fda" title="Get the clock time for a given time base.">xntbase_get_time</a>(pse51_tbase);
<a name="l00178"></a>00178 <span class="keywordflow">else</span>
<a name="l00179"></a>00179 <span class="keywordflow">return</span> xntbase_get_jiffies(pse51_tbase);
<a name="l00180"></a>00180 }
<a name="l00181"></a>00181
<a name="l00182"></a>00182 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> clock_flag(<span class="keywordtype">int</span> flag, clockid_t clock_id)
<a name="l00183"></a>00183 {
<a name="l00184"></a>00184 <span class="keywordflow">switch</span>(flag & TIMER_ABSTIME) {
<a name="l00185"></a>00185 <span class="keywordflow">case</span> 0:
<a name="l00186"></a>00186 <span class="keywordflow">return</span> XN_RELATIVE;
<a name="l00187"></a>00187
<a name="l00188"></a>00188 <span class="keywordflow">case</span> TIMER_ABSTIME:
<a name="l00189"></a>00189 <span class="keywordflow">switch</span>(clock_id) {
<a name="l00190"></a>00190 <span class="keywordflow">case</span> CLOCK_MONOTONIC:
<a name="l00191"></a>00191 <span class="keywordflow">return</span> XN_ABSOLUTE;
<a name="l00192"></a>00192
<a name="l00193"></a>00193 <span class="keywordflow">case</span> CLOCK_REALTIME:
<a name="l00194"></a>00194 <span class="keywordflow">return</span> XN_REALTIME;
<a name="l00195"></a>00195 }
<a name="l00196"></a>00196 }
<a name="l00197"></a>00197 <span class="keywordflow">return</span> -EINVAL;
<a name="l00198"></a>00198 }
<a name="l00199"></a>00199
<a name="l00200"></a>00200 <span class="keywordtype">int</span> pse51_mq_select_bind(mqd_t fd, <span class="keyword">struct</span> xnselector *selector,
<a name="l00201"></a>00201 <span class="keywordtype">unsigned</span> type, <span class="keywordtype">unsigned</span> index);
<a name="l00202"></a>00202
<a name="l00203"></a>00203 <span class="preprocessor">#endif </span><span class="comment">/* !_POSIX_INTERNAL_H */</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Mon Aug 2 12:48:37 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>
|