File: synch_8h-source.html

package info (click to toggle)
xenomai 2.4.4-3
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 29,316 kB
  • ctags: 23,320
  • sloc: ansic: 75,366; sh: 10,477; makefile: 1,672; xml: 1,356; asm: 607; php: 316; perl: 155
file content (164 lines) | stat: -rw-r--r-- 14,286 bytes parent folder | download
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
<!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/synch.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.5 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;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>&nbsp;<u>S</u>earch&nbsp;for&nbsp;</label></td>
            <td><input type="text" name="query" value="" size="20" accesskey="s"/></td>
          </tr>
        </table>
      </form>
    </li>
    </ul>
  </div>
<h1>include/nucleus/synch.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 &lt;rpm@xenomai.org&gt;.</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; either version 2 of the License,</span>
<a name="l00007"></a>00007 <span class="comment"> * 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"> * Xenomai is distributed in the hope that it will be useful, but</span>
<a name="l00010"></a>00010 <span class="comment"> * 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 GNU</span>
<a name="l00012"></a>00012 <span class="comment"> * 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 Xenomai; 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</span>
<a name="l00017"></a>00017 <span class="comment"> * 02111-1307, USA.</span>
<a name="l00018"></a>00018 <span class="comment"> *</span>
<a name="l00019"></a>00019 <span class="comment"> * \ingroup synch</span>
<a name="l00020"></a>00020 <span class="comment"> */</span>
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="preprocessor">#ifndef _XENO_NUCLEUS_SYNCH_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#define _XENO_NUCLEUS_SYNCH_H</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;nucleus/queue.h&gt;</span>
<a name="l00026"></a>00026 
<a name="l00027"></a>00027 <span class="comment">/* Creation flags */</span>
<a name="l00028"></a>00028 <span class="preprocessor">#define XNSYNCH_FIFO    0x0</span>
<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_PRIO    0x1</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_NOPIP   0x0</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_PIP     0x2</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_DREORD  0x4</span>
<a name="l00033"></a>00033 <span class="preprocessor"></span>
<a name="l00034"></a>00034 <span class="preprocessor">#if defined(__KERNEL__) || defined(__XENO_SIM__)</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span>
<a name="l00036"></a>00036 <span class="preprocessor">#define XNSYNCH_CLAIMED 0x8     </span><span class="comment">/* Claimed by other thread(s) w/ PIP */</span>
<a name="l00037"></a>00037 
<a name="l00038"></a>00038 <span class="comment">/* Spare flags usable by upper interfaces */</span>
<a name="l00039"></a>00039 <span class="preprocessor">#define XNSYNCH_SPARE0  0x01000000</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_SPARE1  0x02000000</span>
<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_SPARE2  0x04000000</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_SPARE3  0x08000000</span>
<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_SPARE4  0x10000000</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_SPARE5  0x20000000</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_SPARE6  0x40000000</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#define XNSYNCH_SPARE7  0x80000000</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span>
<a name="l00048"></a>00048 <span class="comment">/* Statuses */</span>
<a name="l00049"></a>00049 <span class="preprocessor">#define XNSYNCH_DONE    0       </span><span class="comment">/* Resource available / operation complete */</span>
<a name="l00050"></a>00050 <span class="preprocessor">#define XNSYNCH_WAIT    1       </span><span class="comment">/* Calling thread blocked -- start rescheduling */</span>
<a name="l00051"></a>00051 <span class="preprocessor">#define XNSYNCH_RESCHED 2       </span><span class="comment">/* Force rescheduling */</span>
<a name="l00052"></a>00052 
<a name="l00053"></a>00053 <span class="keyword">struct </span>xnthread;
<a name="l00054"></a>00054 <span class="keyword">struct </span>xnsynch;
<a name="l00055"></a>00055 <span class="keyword">struct </span>xnmutex;
<a name="l00056"></a>00056 
<a name="l00057"></a>00057 <span class="keyword">typedef</span> <span class="keyword">struct </span>xnsynch {
<a name="l00058"></a>00058 
<a name="l00059"></a>00059     xnpholder_t link;   <span class="comment">/* Link in claim queues */</span>
<a name="l00060"></a>00060 
<a name="l00061"></a>00061 <span class="preprocessor">#define link2synch(ln)          container_of(ln, xnsynch_t, link)</span>
<a name="l00062"></a>00062 <span class="preprocessor"></span>
<a name="l00063"></a>00063     xnflags_t status;   <span class="comment">/* Status word */</span>
<a name="l00064"></a>00064 
<a name="l00065"></a>00065     xnpqueue_t pendq;   <span class="comment">/* Pending threads */</span>
<a name="l00066"></a>00066 
<a name="l00067"></a>00067     <span class="keyword">struct </span>xnthread *owner; <span class="comment">/* Thread which owns the resource */</span>
<a name="l00068"></a>00068 
<a name="l00069"></a>00069     void (*cleanup)(<span class="keyword">struct </span>xnsynch *synch); <span class="comment">/* Cleanup handler */</span>
<a name="l00070"></a>00070 
<a name="l00071"></a>00071     XNARCH_DECL_DISPLAY_CONTEXT();
<a name="l00072"></a>00072 
<a name="l00073"></a>00073 } xnsynch_t;
<a name="l00074"></a>00074 
<a name="l00075"></a>00075 <span class="preprocessor">#define xnsynch_test_flags(synch,flags) testbits((synch)-&gt;status,flags)</span>
<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#define xnsynch_set_flags(synch,flags)  setbits((synch)-&gt;status,flags)</span>
<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#define xnsynch_clear_flags(synch,flags)        clrbits((synch)-&gt;status,flags)</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#define xnsynch_wait_queue(synch)               (&amp;((synch)-&gt;pendq))</span>
<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#define xnsynch_nsleepers(synch)                countpq(&amp;((synch)-&gt;pendq))</span>
<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#define xnsynch_pended_p(synch)         (!emptypq_p(&amp;((synch)-&gt;pendq)))</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define xnsynch_owner(synch)            ((synch)-&gt;owner)</span>
<a name="l00082"></a>00082 <span class="preprocessor"></span>
<a name="l00083"></a>00083 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
<a name="l00085"></a>00085 <span class="preprocessor">#endif</span>
<a name="l00086"></a>00086 <span class="preprocessor"></span>
<a name="l00087"></a>00087 <span class="keywordtype">void</span> <a class="code" href="group__synch.html#g9ba3d7a44aca6f7246ba1a5fa3f3251a" title="Initialize a synchronization object.">xnsynch_init</a>(xnsynch_t *synch,
<a name="l00088"></a>00088                   xnflags_t flags);
<a name="l00089"></a>00089 
<a name="l00090"></a>00090 <span class="preprocessor">#define xnsynch_destroy(synch) xnsynch_flush(synch,XNRMID)</span>
<a name="l00091"></a>00091 <span class="preprocessor"></span>
<a name="l00092"></a>00092 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> xnsynch_set_owner (xnsynch_t *synch, <span class="keyword">struct</span> xnthread *thread)
<a name="l00093"></a>00093 {
<a name="l00094"></a>00094     synch-&gt;owner = thread;
<a name="l00095"></a>00095 }
<a name="l00096"></a>00096 
<a name="l00097"></a>00097 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> xnsynch_register_cleanup (xnsynch_t *synch, <span class="keywordtype">void</span> (*handler)(xnsynch_t *))
<a name="l00098"></a>00098 {
<a name="l00099"></a>00099     synch-&gt;cleanup = handler;
<a name="l00100"></a>00100 }
<a name="l00101"></a>00101 
<a name="l00102"></a>00102 <span class="keywordtype">void</span> <a class="code" href="group__synch.html#g6a230ca2035ff7494b517f52cd4fd800" title="Sleep on a synchronization object.">xnsynch_sleep_on</a>(xnsynch_t *synch,
<a name="l00103"></a>00103                       xnticks_t timeout,
<a name="l00104"></a>00104                       xntmode_t timeout_mode);
<a name="l00105"></a>00105 
<a name="l00106"></a>00106 <span class="keyword">struct </span>xnthread *<a class="code" href="group__synch.html#gc9926fd6af7a7fe01b9f8d02c1a62957" title="Give the resource ownership to the next waiting thread.">xnsynch_wakeup_one_sleeper</a>(xnsynch_t *synch);
<a name="l00107"></a>00107 
<a name="l00108"></a>00108 <span class="keyword">struct </span>xnthread *<a class="code" href="group__synch.html#g80c718b07372cfc4b1c18b4d5ac1c7ce" title="Access the thread leading a synch object wait queue.">xnsynch_peek_pendq</a>(xnsynch_t *synch);
<a name="l00109"></a>00109 
<a name="l00110"></a>00110 xnpholder_t *<a class="code" href="group__synch.html#g15b56df22d23acd5de3d1d622b2caa6a" title="Give the resource ownership to a given waiting thread.">xnsynch_wakeup_this_sleeper</a>(xnsynch_t *synch,
<a name="l00111"></a>00111                                          xnpholder_t *holder);
<a name="l00112"></a>00112 
<a name="l00113"></a>00113 <span class="keywordtype">int</span> <a class="code" href="group__synch.html#g0a340f5c1541bc6f431c105928ec8489" title="Unblock all waiters pending on a resource.">xnsynch_flush</a>(xnsynch_t *synch,
<a name="l00114"></a>00114                   xnflags_t reason);
<a name="l00115"></a>00115 
<a name="l00116"></a>00116 <span class="keywordtype">void</span> <a class="code" href="group__synch.html#gc9da9b803c6e27b32ebd2651dcd23922" title="Release all ownerships.">xnsynch_release_all_ownerships</a>(<span class="keyword">struct</span> xnthread *thread);
<a name="l00117"></a>00117 
<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a class="code" href="group__synch.html#g800c68e26b7fc0eca599e18785137b5c" title="Change a sleeper&amp;#39;s priority.">xnsynch_renice_sleeper</a>(<span class="keyword">struct</span> xnthread *thread);
<a name="l00119"></a>00119 
<a name="l00120"></a>00120 <span class="keywordtype">void</span> <a class="code" href="group__synch.html#gcf7a1aacc7be8816ea644474e75434f9" title="Abort a wait for a resource.">xnsynch_forget_sleeper</a>(<span class="keyword">struct</span> xnthread *thread);
<a name="l00121"></a>00121 
<a name="l00122"></a>00122 <span class="keyword">struct </span>xnthread *xnsynch_forget_one_sleeper(xnsynch_t *synch);
<a name="l00123"></a>00123 
<a name="l00124"></a>00124 <span class="preprocessor">#ifdef __cplusplus</span>
<a name="l00125"></a>00125 <span class="preprocessor"></span>}
<a name="l00126"></a>00126 <span class="preprocessor">#endif</span>
<a name="l00127"></a>00127 <span class="preprocessor"></span>
<a name="l00128"></a>00128 <span class="preprocessor">#endif </span><span class="comment">/* __KERNEL__ || __XENO_SIM__ */</span>
<a name="l00129"></a>00129 
<a name="l00130"></a>00130 <span class="preprocessor">#endif </span><span class="comment">/* !_XENO_NUCLEUS_SYNCH_H_ */</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Jun 8 18:08:49 2008 for Xenomai API by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
</body>
</html>