ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/vendor/libpeak-0.1.2/doc/html/group__task__sync.html
Revision: 3251
Committed: Wed Apr 2 16:58:30 2014 UTC (10 years ago) by michael
Content type: text/html
File size: 22237 byte(s)
Log Message:
- Imported libpeak-0.1.2

File Contents

# Content
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3 <title>PEAK Library: Thread&apos;s synchronization</title>
4 <link href="doxygen.css" rel="stylesheet" type="text/css">
5 </head><body>
6 <!-- Generated by Doxygen 1.3.5 -->
7 <div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a></div>
8 <h1>Thread's synchronization<br>
9 <small>
10 [<a class="el" href="group__task.html">Task</a>]</small>
11 </h1><hr><a name="_details"></a><h2>Detailed Description</h2>
12 <dl compact><dt><b></b></dt><dd>A task, in the PEAK's context, might process events in parallel, with the help of kernel threads (pthread(3)).</dd></dl>
13 <dl compact><dt><b></b></dt><dd>The PEAK library provides a set of functions for kernel threads synchronization within a task. If the task has only one thread to process events, these functions do nothing. Otherwise, they are prefered to more low level primitives as some optimizations can be done within a task. Be careful if you need to synchronize with other threads which are not related to a PEAK's task (eg. another thread in your program created explicitely): in that case you need more general primitives.</dd></dl>
14 <dl compact><dt><b></b></dt><dd>When in doubt, for example if you are not very familiar with threads synchronization primitives like mutex, conditions or semaphores, you have always the choice to configure your PEAK's task to not use more than one thread (see <a class="el" href="group__task__common.html#ga17">peak_task_set_info()</a>) Then, all the problems are over because events aren't processed in parallel anymore and you have only one excecution stream. For most applications, that will do... several events libraries act this way and are already very efficient. But, although you don't block when processing events (and you must not!), if your event's processings are still consuming significative CPU time (eg. cache search for each event, huge I/O's, etc), PEAK task capabilities of processing multiple events in the same time has shown global improvement for the application.</dd></dl>
15 <dl compact><dt><b></b></dt><dd>Note: Synchronization between several PEAK's tasks are not yet available, as you can only have one task in the current version of the library. </dd></dl>
16
17 <p>
18 <table border=0 cellpadding=0 cellspacing=0>
19 <tr><td></td></tr>
20 <tr><td colspan=2><br><h2>Typedefs</h2></td></tr>
21 <tr><td class="memItemLeft" nowrap align=right valign=top><a class="anchor" name="ga0" doxytag="task_sync::peak_task_lock" ></a>
22 typedef __peak_task_lock *&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga0">peak_task_lock</a></td></tr>
23
24 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Opaque task lock type. <br><br></td></tr>
25 <tr><td class="memItemLeft" nowrap align=right valign=top><a class="anchor" name="ga1" doxytag="task_sync::peak_task_mutex" ></a>
26 typedef __peak_task_mutex *&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a></td></tr>
27
28 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Opaque task mutex type. <br><br></td></tr>
29 <tr><td colspan=2><br><h2>Functions</h2></td></tr>
30 <tr><td class="memItemLeft" nowrap align=right valign=top>void&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga2">peak_task_exclusivity</a> (void)</td></tr>
31
32 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Acquire task execution exclusivity. <a href="#ga2"></a><br><br></td></tr>
33 <tr><td class="memItemLeft" nowrap align=right valign=top><a class="el" href="group__task__sync.html#ga0">peak_task_lock</a>&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga3">peak_task_lock_create</a> (<a class="el" href="group__task__common.html#ga0">peak_task</a> task)</td></tr>
34
35 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Create a task's lock. <a href="#ga3"></a><br><br></td></tr>
36 <tr><td class="memItemLeft" nowrap align=right valign=top>void&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga4">peak_task_lock_acquire</a> (<a class="el" href="group__task__sync.html#ga0">peak_task_lock</a> lock)</td></tr>
37
38 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Acquire a task's lock. <a href="#ga4"></a><br><br></td></tr>
39 <tr><td class="memItemLeft" nowrap align=right valign=top>int&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga5">peak_task_lock_try</a> (<a class="el" href="group__task__sync.html#ga0">peak_task_lock</a> lock)</td></tr>
40
41 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Try to acquire a task's lock. <a href="#ga5"></a><br><br></td></tr>
42 <tr><td class="memItemLeft" nowrap align=right valign=top>void&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga6">peak_task_lock_release</a> (<a class="el" href="group__task__sync.html#ga0">peak_task_lock</a> lock)</td></tr>
43
44 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Release a task's lock. <a href="#ga6"></a><br><br></td></tr>
45 <tr><td class="memItemLeft" nowrap align=right valign=top>void&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga7">peak_task_lock_handoff</a> (<a class="el" href="group__task__sync.html#ga0">peak_task_lock</a> lock)</td></tr>
46
47 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Hand-off a task's lock. <a href="#ga7"></a><br><br></td></tr>
48 <tr><td class="memItemLeft" nowrap align=right valign=top><a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a>&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga8">peak_task_mutex_create</a> (<a class="el" href="group__task__common.html#ga0">peak_task</a> task)</td></tr>
49
50 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Create a task's mutex. <a href="#ga8"></a><br><br></td></tr>
51 <tr><td class="memItemLeft" nowrap align=right valign=top>void&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga9">peak_task_mutex_lock</a> (<a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a> mutex)</td></tr>
52
53 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Lock a task's mutex. <a href="#ga9"></a><br><br></td></tr>
54 <tr><td class="memItemLeft" nowrap align=right valign=top>void&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga10">peak_task_mutex_trylock</a> (<a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a> mutex)</td></tr>
55
56 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Try to lock a task's mutex. <a href="#ga10"></a><br><br></td></tr>
57 <tr><td class="memItemLeft" nowrap align=right valign=top>void&nbsp;</td><td class="memItemRight" valign=bottom><a class="el" href="group__task__sync.html#ga11">peak_task_mutex_unlock</a> (<a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a> mutex)</td></tr>
58
59 <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unlock a task's mutex. <a href="#ga11"></a><br><br></td></tr>
60 </table>
61 <hr><h2>Function Documentation</h2>
62 <a class="anchor" name="ga2" doxytag="task.h::peak_task_exclusivity" ></a><p>
63 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
64 <tr>
65 <td class="mdRow">
66 <table cellpadding="0" cellspacing="0" border="0">
67 <tr>
68 <td class="md" nowrap valign="top"> void peak_task_exclusivity </td>
69 <td class="md" valign="top">(&nbsp;</td>
70 <td class="md" nowrap valign="top">void&nbsp;</td>
71 <td class="mdname1" valign="top" nowrap> </td>
72 <td class="md" valign="top">&nbsp;)&nbsp;</td>
73 <td class="md" nowrap></td>
74 </tr>
75
76 </table>
77 </td>
78 </tr>
79 </table>
80 <table cellspacing=5 cellpadding=0 border=0>
81 <tr>
82 <td>
83 &nbsp;
84 </td>
85 <td>
86
87 <p>
88 Acquire task execution exclusivity.
89 <p>
90 This function acquires temporary exclusive task execution among all task's threads. It's usually called at the beginning of an event-callback to avoid conflicts with other events (as they might be processed in parallel), when you deal with a lot of shared data in the callback.<br>
91 This function does nothing if the task has only one running thread, and slow down event processing otherwise. Exclusive execution is garanteed in the whole callback, in fact, it's garanteed until the next event or timer on the current task.<br>
92 Note there is no parameter at all: you can only acquire exclusive execution on the current task. </td>
93 </tr>
94 </table>
95 <a class="anchor" name="ga4" doxytag="task.h::peak_task_lock_acquire" ></a><p>
96 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
97 <tr>
98 <td class="mdRow">
99 <table cellpadding="0" cellspacing="0" border="0">
100 <tr>
101 <td class="md" nowrap valign="top"> void peak_task_lock_acquire </td>
102 <td class="md" valign="top">(&nbsp;</td>
103 <td class="md" nowrap valign="top"><a class="el" href="group__task__sync.html#ga0">peak_task_lock</a>&nbsp;</td>
104 <td class="mdname1" valign="top" nowrap> <em>lock</em> </td>
105 <td class="md" valign="top">&nbsp;)&nbsp;</td>
106 <td class="md" nowrap></td>
107 </tr>
108
109 </table>
110 </td>
111 </tr>
112 </table>
113 <table cellspacing=5 cellpadding=0 border=0>
114 <tr>
115 <td>
116 &nbsp;
117 </td>
118 <td>
119
120 <p>
121 Acquire a task's lock.
122 <p>
123 This function acquires a task's lock. If the lock is already owned by another thread of the task, then the calling thread will block. However, this function does nothing if the task has only one thread. If a deadlock is detected, the program will abort, so be careful with recursions! Possibly, use <a class="el" href="group__task__sync.html#ga5">peak_task_lock_try()</a>.<br>
124 Note that you can only acquire a lock for the current task. </td>
125 </tr>
126 </table>
127 <a class="anchor" name="ga3" doxytag="task.h::peak_task_lock_create" ></a><p>
128 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
129 <tr>
130 <td class="mdRow">
131 <table cellpadding="0" cellspacing="0" border="0">
132 <tr>
133 <td class="md" nowrap valign="top"> <a class="el" href="group__task__sync.html#ga0">peak_task_lock</a> peak_task_lock_create </td>
134 <td class="md" valign="top">(&nbsp;</td>
135 <td class="md" nowrap valign="top"><a class="el" href="group__task__common.html#ga0">peak_task</a>&nbsp;</td>
136 <td class="mdname1" valign="top" nowrap> <em>task</em> </td>
137 <td class="md" valign="top">&nbsp;)&nbsp;</td>
138 <td class="md" nowrap></td>
139 </tr>
140
141 </table>
142 </td>
143 </tr>
144 </table>
145 <table cellspacing=5 cellpadding=0 border=0>
146 <tr>
147 <td>
148 &nbsp;
149 </td>
150 <td>
151
152 <p>
153 Create a task's lock.
154 <p>
155 Allow you to lock threads in order to create critical regions, for example, within a task, with <a class="el" href="group__task__sync.html#ga4">peak_task_lock_acquire()</a>, <a class="el" href="group__task__sync.html#ga6">peak_task_lock_release()</a>, etc. Like other PEAK's objets, you can destroy a lock with <a class="el" href="group__alloc.html#ga7">peak_release()</a>. THEY ARE ACTIVE LOCKS FOR SMALL DATA STRUCTURES PROTECTION ONLY. If you think you will have almost no collision for a critical region, they are for you.<p>
156 <dl compact><dt><b>Parameters:</b></dt><dd>
157 <table border="0" cellspacing="2" cellpadding="0">
158 <tr><td valign=top><em>task</em>&nbsp;</td><td>The task to associated with the lock (usually <a class="el" href="group__task__common.html#ga8">peak_task_self()</a>).</td></tr>
159 </table>
160 </dl>
161 <dl compact><dt><b>Returns:</b></dt><dd>A new <code>peak_task_lock</code> reference. </dd></dl>
162 </td>
163 </tr>
164 </table>
165 <a class="anchor" name="ga7" doxytag="task.h::peak_task_lock_handoff" ></a><p>
166 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
167 <tr>
168 <td class="mdRow">
169 <table cellpadding="0" cellspacing="0" border="0">
170 <tr>
171 <td class="md" nowrap valign="top"> void peak_task_lock_handoff </td>
172 <td class="md" valign="top">(&nbsp;</td>
173 <td class="md" nowrap valign="top"><a class="el" href="group__task__sync.html#ga0">peak_task_lock</a>&nbsp;</td>
174 <td class="mdname1" valign="top" nowrap> <em>lock</em> </td>
175 <td class="md" valign="top">&nbsp;)&nbsp;</td>
176 <td class="md" nowrap></td>
177 </tr>
178
179 </table>
180 </td>
181 </tr>
182 </table>
183 <table cellspacing=5 cellpadding=0 border=0>
184 <tr>
185 <td>
186 &nbsp;
187 </td>
188 <td>
189
190 <p>
191 Hand-off a task's lock.
192 <p>
193 To assume the lock's ownership, this function passes a task's lock from the calling thread to another thread of the task. The lock must be already owned by the calling thread. If no other thread is waiting for acquiring the lock, this call will block until it happens. If the task has only one running thread, this function will abort the program (because if you use this function, you want a special synchronization behaviour that can't happen with one thread only). See <a class="el" href="group__task__common.html#ga17">peak_task_set_info()</a> to properly configure your task.<br>
194 Note that you can only hand-off a lock for the current task. </td>
195 </tr>
196 </table>
197 <a class="anchor" name="ga6" doxytag="task.h::peak_task_lock_release" ></a><p>
198 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
199 <tr>
200 <td class="mdRow">
201 <table cellpadding="0" cellspacing="0" border="0">
202 <tr>
203 <td class="md" nowrap valign="top"> void peak_task_lock_release </td>
204 <td class="md" valign="top">(&nbsp;</td>
205 <td class="md" nowrap valign="top"><a class="el" href="group__task__sync.html#ga0">peak_task_lock</a>&nbsp;</td>
206 <td class="mdname1" valign="top" nowrap> <em>lock</em> </td>
207 <td class="md" valign="top">&nbsp;)&nbsp;</td>
208 <td class="md" nowrap></td>
209 </tr>
210
211 </table>
212 </td>
213 </tr>
214 </table>
215 <table cellspacing=5 cellpadding=0 border=0>
216 <tr>
217 <td>
218 &nbsp;
219 </td>
220 <td>
221
222 <p>
223 Release a task's lock.
224 <p>
225 This function releases a task's lock, so one another thread of the task can acquire it. However, this function does nothing if the task has only one thread.<br>
226 Note that you can only release a lock for the current task. </td>
227 </tr>
228 </table>
229 <a class="anchor" name="ga5" doxytag="task.h::peak_task_lock_try" ></a><p>
230 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
231 <tr>
232 <td class="mdRow">
233 <table cellpadding="0" cellspacing="0" border="0">
234 <tr>
235 <td class="md" nowrap valign="top"> int peak_task_lock_try </td>
236 <td class="md" valign="top">(&nbsp;</td>
237 <td class="md" nowrap valign="top"><a class="el" href="group__task__sync.html#ga0">peak_task_lock</a>&nbsp;</td>
238 <td class="mdname1" valign="top" nowrap> <em>lock</em> </td>
239 <td class="md" valign="top">&nbsp;)&nbsp;</td>
240 <td class="md" nowrap></td>
241 </tr>
242
243 </table>
244 </td>
245 </tr>
246 </table>
247 <table cellspacing=5 cellpadding=0 border=0>
248 <tr>
249 <td>
250 &nbsp;
251 </td>
252 <td>
253
254 <p>
255 Try to acquire a task's lock.
256 <p>
257 This function attempts to acquire a task's lock without blocking. The return value indicatees whether the lock was acquired. This function does nothing if the task has only one running thread and in that case always succeeds.<br>
258 Note that you can only try a lock for the current task.<p>
259 <dl compact><dt><b>Return values:</b></dt><dd>
260 <table border="0" cellspacing="2" cellpadding="0">
261 <tr><td valign=top><em>1</em>&nbsp;</td><td>if the lock was acquired </td></tr>
262 <tr><td valign=top><em>0</em>&nbsp;</td><td>if the lock is already owned (busy) </td></tr>
263 </table>
264 </dl>
265 </td>
266 </tr>
267 </table>
268 <a class="anchor" name="ga8" doxytag="task.h::peak_task_mutex_create" ></a><p>
269 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
270 <tr>
271 <td class="mdRow">
272 <table cellpadding="0" cellspacing="0" border="0">
273 <tr>
274 <td class="md" nowrap valign="top"> <a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a> peak_task_mutex_create </td>
275 <td class="md" valign="top">(&nbsp;</td>
276 <td class="md" nowrap valign="top"><a class="el" href="group__task__common.html#ga0">peak_task</a>&nbsp;</td>
277 <td class="mdname1" valign="top" nowrap> <em>task</em> </td>
278 <td class="md" valign="top">&nbsp;)&nbsp;</td>
279 <td class="md" nowrap></td>
280 </tr>
281
282 </table>
283 </td>
284 </tr>
285 </table>
286 <table cellspacing=5 cellpadding=0 border=0>
287 <tr>
288 <td>
289 &nbsp;
290 </td>
291 <td>
292
293 <p>
294 Create a task's mutex.
295 <p>
296 Allow you to create critical regions within a task, with <a class="el" href="group__task__sync.html#ga9">peak_task_mutex_lock()</a>, <a class="el" href="group__task__sync.html#ga11">peak_task_mutex_unlock()</a>, etc. Like other PEAK's objets, you can destroy a mutex with <a class="el" href="group__alloc.html#ga7">peak_release()</a>. Task's mutex are more suitable to create large mutual exclusion regions than task's locks are, as they shouldn't spinlock much. However, if you need to protect basic and small data structures, it might be lighter to use task's locks (eg. for a simple operation like "object-&gt;i++;" ).<p>
297 <dl compact><dt><b>Parameters:</b></dt><dd>
298 <table border="0" cellspacing="2" cellpadding="0">
299 <tr><td valign=top><em>task</em>&nbsp;</td><td>The task to associated with the mutex (usually <a class="el" href="group__task__common.html#ga8">peak_task_self()</a>).</td></tr>
300 </table>
301 </dl>
302 <dl compact><dt><b>Returns:</b></dt><dd>A new <code>peak_task_mutex</code> reference. </dd></dl>
303 </td>
304 </tr>
305 </table>
306 <a class="anchor" name="ga9" doxytag="task.h::peak_task_mutex_lock" ></a><p>
307 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
308 <tr>
309 <td class="mdRow">
310 <table cellpadding="0" cellspacing="0" border="0">
311 <tr>
312 <td class="md" nowrap valign="top"> void peak_task_mutex_lock </td>
313 <td class="md" valign="top">(&nbsp;</td>
314 <td class="md" nowrap valign="top"><a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a>&nbsp;</td>
315 <td class="mdname1" valign="top" nowrap> <em>mutex</em> </td>
316 <td class="md" valign="top">&nbsp;)&nbsp;</td>
317 <td class="md" nowrap></td>
318 </tr>
319
320 </table>
321 </td>
322 </tr>
323 </table>
324 <table cellspacing=5 cellpadding=0 border=0>
325 <tr>
326 <td>
327 &nbsp;
328 </td>
329 <td>
330
331 <p>
332 Lock a task's mutex.
333 <p>
334 This function locks a task's <em>mutex</em>. If the mutex is already locked then the calling thread will block until the mutex becomes available. However, this function does nothing if the task has only one thread. If a deadlock is detected, the program will abort. Possibly, use <a class="el" href="group__task__sync.html#ga10">peak_task_mutex_trylock()</a>.<br>
335 Note that you can only lock a mutex for the current task. </td>
336 </tr>
337 </table>
338 <a class="anchor" name="ga10" doxytag="task.h::peak_task_mutex_trylock" ></a><p>
339 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
340 <tr>
341 <td class="mdRow">
342 <table cellpadding="0" cellspacing="0" border="0">
343 <tr>
344 <td class="md" nowrap valign="top"> void peak_task_mutex_trylock </td>
345 <td class="md" valign="top">(&nbsp;</td>
346 <td class="md" nowrap valign="top"><a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a>&nbsp;</td>
347 <td class="mdname1" valign="top" nowrap> <em>mutex</em> </td>
348 <td class="md" valign="top">&nbsp;)&nbsp;</td>
349 <td class="md" nowrap></td>
350 </tr>
351
352 </table>
353 </td>
354 </tr>
355 </table>
356 <table cellspacing=5 cellpadding=0 border=0>
357 <tr>
358 <td>
359 &nbsp;
360 </td>
361 <td>
362
363 <p>
364 Try to lock a task's mutex.
365 <p>
366 This function locks a task's <em>mutex</em>. If the mutex is already locked then the calling thread will block until the mutex becomes available. However, this function does nothing if the task has only one thread.<br>
367 Note that you can only lock a mutex for the current task. </td>
368 </tr>
369 </table>
370 <a class="anchor" name="ga11" doxytag="task.h::peak_task_mutex_unlock" ></a><p>
371 <table class="mdTable" width="100%" cellpadding="2" cellspacing="0">
372 <tr>
373 <td class="mdRow">
374 <table cellpadding="0" cellspacing="0" border="0">
375 <tr>
376 <td class="md" nowrap valign="top"> void peak_task_mutex_unlock </td>
377 <td class="md" valign="top">(&nbsp;</td>
378 <td class="md" nowrap valign="top"><a class="el" href="group__task__sync.html#ga1">peak_task_mutex</a>&nbsp;</td>
379 <td class="mdname1" valign="top" nowrap> <em>mutex</em> </td>
380 <td class="md" valign="top">&nbsp;)&nbsp;</td>
381 <td class="md" nowrap></td>
382 </tr>
383
384 </table>
385 </td>
386 </tr>
387 </table>
388 <table cellspacing=5 cellpadding=0 border=0>
389 <tr>
390 <td>
391 &nbsp;
392 </td>
393 <td>
394
395 <p>
396 Unlock a task's mutex.
397 <p>
398 This function unlocks a task's <em>mutex</em>. However, this function does nothing if the task has only one thread.<br>
399 Note that you can only unlock a mutex for the current task. </td>
400 </tr>
401 </table>
402 <hr size="1"><address style="align: right;"><small>Generated on Sat Jan 17 21:41:54 2004 for the PEAK Library by
403 <a href="http://www.doxygen.org/index.html">
404 <img src="doxygen.png" alt="doxygen" align="middle" border="0" >
405 </a></small>&nbsp; &nbsp; <a href="http://sourceforge.net"><img src="http://sourceforge.net/sflogo.php?group_id=98146&amp;type=1" width="88" height="31" align="middle" border="0" alt="SourceForge.net Logo" /></a></address>
406 </body>
407 </html>
408