File: rtdm__driver_8h-source.html

package info (click to toggle)
xenomai 2.5.4-3squeeze1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 36,140 kB
  • ctags: 35,509
  • sloc: ansic: 109,084; sh: 11,745; makefile: 2,205; xml: 1,356; asm: 613; php: 316; perl: 155
file content (771 lines) | stat: -rw-r--r-- 105,733 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
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
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
<!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/rtdm/rtdm_driver.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&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/rtdm/rtdm_driver.h</h1><a href="rtdm__driver_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
<a name="l00026"></a>00026 <span class="preprocessor">#ifndef _RTDM_DRIVER_H</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#define _RTDM_DRIVER_H</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span>
<a name="l00029"></a>00029 <span class="preprocessor">#ifndef __KERNEL__</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#error This header is for kernel space usage only. \</span>
<a name="l00031"></a>00031 <span class="preprocessor">       You are likely looking for rtdm/rtdm.h...</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__KERNEL__ */</span>
<a name="l00033"></a>00033 
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;asm/atomic.h&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;linux/list.h&gt;</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="preprocessor">#include &lt;nucleus/xenomai.h&gt;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;nucleus/heap.h&gt;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;<a class="code" href="pod_8h.html" title="Real-time pod interface header.">nucleus/pod.h</a>&gt;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;nucleus/synch.h&gt;</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &lt;<a class="code" href="select_8h.html" title="file descriptors events multiplexing header.">nucleus/select.h</a>&gt;</span>
<a name="l00042"></a>00042 <span class="preprocessor">#include &lt;<a class="code" href="rtdm_8h.html" title="Real-Time Driver Model for Xenomai, user API header.">rtdm/rtdm.h</a>&gt;</span>
<a name="l00043"></a>00043 
<a name="l00044"></a>00044 <span class="comment">/* debug support */</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include &lt;nucleus/assert.h&gt;</span>
<a name="l00046"></a>00046 <span class="preprocessor">#ifdef CONFIG_PCI</span>
<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#include &lt;asm-generic/xenomai/pci_ids.h&gt;</span>
<a name="l00048"></a>00048 <span class="preprocessor">#endif </span><span class="comment">/* CONFIG_PCI */</span>
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 <span class="preprocessor">#ifndef CONFIG_XENO_OPT_DEBUG_RTDM</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#define CONFIG_XENO_OPT_DEBUG_RTDM      0</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span>
<a name="l00054"></a>00054 <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a>;
<a name="l00055"></a>00055 <span class="keyword">typedef</span> <span class="keyword">struct </span>xnselector rtdm_selector_t;
<a name="l00056"></a>00056 <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a>;
<a name="l00057"></a>00057 
<a name="l00070"></a><a class="code" href="group__devregister.html#g7c66ec8f269c701237437177af0704e8">00070</a> <span class="preprocessor">#define RTDM_EXCLUSIVE                  0x0001</span>
<a name="l00071"></a>00071 <span class="preprocessor"></span>
<a name="l00073"></a><a class="code" href="group__devregister.html#g7651188ca1c05f7e68b36517874138b7">00073</a> <span class="preprocessor">#define RTDM_NAMED_DEVICE               0x0010</span>
<a name="l00074"></a>00074 <span class="preprocessor"></span>
<a name="l00077"></a><a class="code" href="group__devregister.html#g43ced044106ae9c1f5500d0041307d8f">00077</a> <span class="preprocessor">#define RTDM_PROTOCOL_DEVICE            0x0020</span>
<a name="l00078"></a>00078 <span class="preprocessor"></span>
<a name="l00080"></a><a class="code" href="group__devregister.html#gfdb542eb46679916b0100969e1033bfc">00080</a> <span class="preprocessor">#define RTDM_DEVICE_TYPE_MASK           0x00F0</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span>
<a name="l00090"></a><a class="code" href="group__devregister.html#ga6f17915089145982b04c51f202d950c">00090</a> <span class="preprocessor">#define RTDM_CREATED_IN_NRT             0</span>
<a name="l00091"></a>00091 <span class="preprocessor"></span>
<a name="l00093"></a><a class="code" href="group__devregister.html#g24b993fed8dae26b6597ba37f3f92eac">00093</a> <span class="preprocessor">#define RTDM_CLOSING                    1</span>
<a name="l00094"></a>00094 <span class="preprocessor"></span>
<a name="l00096"></a><a class="code" href="group__devregister.html#g187778f8d7b6e5f0b459a526e6323471">00096</a> <span class="preprocessor">#define RTDM_USER_CONTEXT_FLAG          8  </span><span class="comment">/* first user-definable flag */</span>
<a name="l00097"></a>00097 
<a name="l00106"></a><a class="code" href="group__devregister.html#gb0f99b00be17869d5c9cd844825766f4">00106</a> <span class="preprocessor">#define RTDM_DEVICE_STRUCT_VER          5</span>
<a name="l00107"></a>00107 <span class="preprocessor"></span>
<a name="l00109"></a><a class="code" href="group__devregister.html#gb127a755cab544c5b318d4f4a3578e9f">00109</a> <span class="preprocessor">#define RTDM_CONTEXT_STRUCT_VER         3</span>
<a name="l00110"></a>00110 <span class="preprocessor"></span>
<a name="l00112"></a><a class="code" href="group__devregister.html#gdea320d3993937f37edc6fa39a29d379">00112</a> <span class="preprocessor">#define RTDM_SECURE_DEVICE              0x80000000</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span>
<a name="l00115"></a><a class="code" href="group__devregister.html#geddd03e63cdce1692edcc497a44756c2">00115</a> <span class="preprocessor">#define RTDM_DRIVER_VER(major, minor, patch) \</span>
<a name="l00116"></a>00116 <span class="preprocessor">        (((major &amp; 0xFF) &lt;&lt; 16) | ((minor &amp; 0xFF) &lt;&lt; 8) | (patch &amp; 0xFF))</span>
<a name="l00117"></a>00117 <span class="preprocessor"></span>
<a name="l00119"></a><a class="code" href="group__devregister.html#g4df977587f67fefde551a437848b9514">00119</a> <span class="preprocessor">#define RTDM_DRIVER_MAJOR_VER(ver)      (((ver) &gt;&gt; 16) &amp; 0xFF)</span>
<a name="l00120"></a>00120 <span class="preprocessor"></span>
<a name="l00122"></a><a class="code" href="group__devregister.html#g1c2cb29427406f0febbb1c143f76497f">00122</a> <span class="preprocessor">#define RTDM_DRIVER_MINOR_VER(ver)      (((ver) &gt;&gt; 8) &amp; 0xFF)</span>
<a name="l00123"></a>00123 <span class="preprocessor"></span>
<a name="l00125"></a><a class="code" href="group__devregister.html#g606a1554fc17b5b8d6c0fa8d6dbb8f9b">00125</a> <span class="preprocessor">#define RTDM_DRIVER_PATCH_VER(ver)      ((ver) &amp; 0xFF)</span>
<a name="l00126"></a>00126 <span class="preprocessor"></span>
<a name="l00138"></a><a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">00138</a> <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> {
<a name="l00140"></a><a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925013ddb0fbad9f52ad3646be2e5a6ba8b2b">00140</a>         <a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925013ddb0fbad9f52ad3646be2e5a6ba8b2b" title="Select input data availability events.">RTDM_SELECTTYPE_READ</a> = XNSELECT_READ,
<a name="l00141"></a>00141 
<a name="l00143"></a><a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e9250137819f609dee2b20852001e9b7ecd462">00143</a>         <a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e9250137819f609dee2b20852001e9b7ecd462" title="Select ouput buffer availability events.">RTDM_SELECTTYPE_WRITE</a> = XNSELECT_WRITE,
<a name="l00144"></a>00144 
<a name="l00146"></a><a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925012dd10c612a9e3c7e5134ee122ee3de74">00146</a>         <a class="code" href="group__rtdmsync.html#gge18228df8c70c9da1f90f61b01e925012dd10c612a9e3c7e5134ee122ee3de74" title="Select exceptional events.">RTDM_SELECTTYPE_EXCEPT</a> = XNSELECT_EXCEPT
<a name="l00147"></a>00147 };
<a name="l00171"></a><a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6">00171</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6" title="Named device open handler.">rtdm_open_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00172"></a>00172                                    rtdm_user_info_t *user_info, <span class="keywordtype">int</span> oflag);
<a name="l00173"></a>00173 
<a name="l00188"></a><a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5">00188</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5" title="Socket creation handler for protocol devices.">rtdm_socket_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00189"></a>00189                                      rtdm_user_info_t *user_info, <span class="keywordtype">int</span> protocol);
<a name="l00190"></a>00190 
<a name="l00211"></a><a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440">00211</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440" title="Close handler.">rtdm_close_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00212"></a>00212                                     rtdm_user_info_t *user_info);
<a name="l00213"></a>00213 
<a name="l00229"></a><a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804">00229</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804" title="IOCTL handler.">rtdm_ioctl_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00230"></a>00230                                     rtdm_user_info_t *user_info,
<a name="l00231"></a>00231                                     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> request, <span class="keywordtype">void</span> __user *arg);
<a name="l00232"></a>00232 
<a name="l00246"></a><a class="code" href="group__devregister.html#g462c61f19f6bc6a0ef93a57ab6b218bf">00246</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__devregister.html#g462c61f19f6bc6a0ef93a57ab6b218bf" title="Select binding handler.">rtdm_select_bind_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00247"></a>00247                                           rtdm_selector_t *selector,
<a name="l00248"></a>00248                                           <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type,
<a name="l00249"></a>00249                                           <span class="keywordtype">unsigned</span> fd_index);
<a name="l00250"></a>00250 
<a name="l00266"></a><a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c">00266</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c" title="Read handler.">rtdm_read_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00267"></a>00267                                        rtdm_user_info_t *user_info,
<a name="l00268"></a>00268                                        <span class="keywordtype">void</span> *buf, <span class="keywordtype">size_t</span> nbyte);
<a name="l00269"></a>00269 
<a name="l00285"></a><a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee">00285</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee" title="Write handler.">rtdm_write_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00286"></a>00286                                         rtdm_user_info_t *user_info,
<a name="l00287"></a>00287                                         <span class="keyword">const</span> <span class="keywordtype">void</span> *buf, <span class="keywordtype">size_t</span> nbyte);
<a name="l00288"></a>00288 
<a name="l00305"></a><a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66">00305</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66" title="Receive message handler.">rtdm_recvmsg_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00306"></a>00306                                           rtdm_user_info_t *user_info,
<a name="l00307"></a>00307                                           <span class="keyword">struct </span>msghdr *msg, <span class="keywordtype">int</span> flags);
<a name="l00308"></a>00308 
<a name="l00325"></a><a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1">00325</a> <span class="keyword">typedef</span> ssize_t (*<a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1" title="Transmit message handler.">rtdm_sendmsg_handler_t</a>)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00326"></a>00326                                           rtdm_user_info_t *user_info,
<a name="l00327"></a>00327                                           <span class="keyword">const</span> <span class="keyword">struct </span>msghdr *msg, <span class="keywordtype">int</span> flags);
<a name="l00330"></a>00330 <span class="keyword">typedef</span> int (*rtdm_rt_handler_t)(<span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l00331"></a>00331                                  rtdm_user_info_t *user_info, <span class="keywordtype">void</span> *arg);
<a name="l00335"></a><a class="code" href="structrtdm__operations.html">00335</a> <span class="keyword">struct </span><a class="code" href="structrtdm__operations.html" title="Device operations.">rtdm_operations</a> {
<a name="l00340"></a><a class="code" href="structrtdm__operations.html#23a81aa4c48d55c937c2763c27c8372c">00340</a>         <a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440" title="Close handler.">rtdm_close_handler_t</a> <a class="code" href="structrtdm__operations.html#23a81aa4c48d55c937c2763c27c8372c" title="Close handler for real-time contexts (optional, deprecated).">close_rt</a>;
<a name="l00342"></a><a class="code" href="structrtdm__operations.html#218dceb0ad1125f2c1c3e3e95a8d4894">00342</a>         <a class="code" href="group__devregister.html#g6bd6c0761590d59f67b2c1e87fdd8440" title="Close handler.">rtdm_close_handler_t</a> <a class="code" href="structrtdm__operations.html#218dceb0ad1125f2c1c3e3e95a8d4894" title="Close handler for non-real-time contexts (required).">close_nrt</a>;
<a name="l00343"></a>00343 
<a name="l00345"></a><a class="code" href="structrtdm__operations.html#b49e368d71fd6647b0e74a6105d63528">00345</a>         <a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804" title="IOCTL handler.">rtdm_ioctl_handler_t</a> <a class="code" href="structrtdm__operations.html#b49e368d71fd6647b0e74a6105d63528" title="IOCTL from real-time context (optional).">ioctl_rt</a>;
<a name="l00347"></a><a class="code" href="structrtdm__operations.html#1b34c77998c6795f3d26047f323ca470">00347</a>         <a class="code" href="group__devregister.html#g3adab7928c65ee8ffd06c82c705d4804" title="IOCTL handler.">rtdm_ioctl_handler_t</a> <a class="code" href="structrtdm__operations.html#1b34c77998c6795f3d26047f323ca470" title="IOCTL from non-real-time context (optional).">ioctl_nrt</a>;
<a name="l00348"></a>00348 
<a name="l00350"></a><a class="code" href="structrtdm__operations.html#a052e237d48e04bfb777fde1b6eb83e7">00350</a>         <a class="code" href="group__devregister.html#g462c61f19f6bc6a0ef93a57ab6b218bf" title="Select binding handler.">rtdm_select_bind_handler_t</a> <a class="code" href="structrtdm__operations.html#a052e237d48e04bfb777fde1b6eb83e7" title="Select binding handler for any context (optional).">select_bind</a>;
<a name="l00356"></a><a class="code" href="structrtdm__operations.html#d3c519ed6779656dbd926f3c92cd9cfe">00356</a>         <a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c" title="Read handler.">rtdm_read_handler_t</a> <a class="code" href="structrtdm__operations.html#d3c519ed6779656dbd926f3c92cd9cfe" title="Read handler for real-time context (optional).">read_rt</a>;
<a name="l00358"></a><a class="code" href="structrtdm__operations.html#cd37d3ca267df2944400fedeca9de653">00358</a>         <a class="code" href="group__devregister.html#g1a2f92a5ebe9f4d46fb6722ed5da047c" title="Read handler.">rtdm_read_handler_t</a> <a class="code" href="structrtdm__operations.html#cd37d3ca267df2944400fedeca9de653" title="Read handler for non-real-time context (optional).">read_nrt</a>;
<a name="l00359"></a>00359 
<a name="l00361"></a><a class="code" href="structrtdm__operations.html#6497c11edeab09f8f1b09cc0cb30de24">00361</a>         <a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee" title="Write handler.">rtdm_write_handler_t</a> <a class="code" href="structrtdm__operations.html#6497c11edeab09f8f1b09cc0cb30de24" title="Write handler for real-time context (optional).">write_rt</a>;
<a name="l00363"></a><a class="code" href="structrtdm__operations.html#6554db3606e4fbe4b3cfbd4ee6c8f4d3">00363</a>         <a class="code" href="group__devregister.html#ga2b3421e29ae63cf49622765a5bc9cee" title="Write handler.">rtdm_write_handler_t</a> <a class="code" href="structrtdm__operations.html#6554db3606e4fbe4b3cfbd4ee6c8f4d3" title="Write handler for non-real-time context (optional).">write_nrt</a>;
<a name="l00369"></a><a class="code" href="structrtdm__operations.html#0c4eecce6bd0ca7e42c31ab832d0c040">00369</a>         <a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66" title="Receive message handler.">rtdm_recvmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#0c4eecce6bd0ca7e42c31ab832d0c040" title="Receive message handler for real-time context (optional).">recvmsg_rt</a>;
<a name="l00371"></a><a class="code" href="structrtdm__operations.html#a8bf96cf72a3606f395aede8124bedbb">00371</a>         <a class="code" href="group__devregister.html#g8e592853e1072c8b32e2263557990a66" title="Receive message handler.">rtdm_recvmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#a8bf96cf72a3606f395aede8124bedbb" title="Receive message handler for non-real-time context (optional).">recvmsg_nrt</a>;
<a name="l00372"></a>00372 
<a name="l00374"></a><a class="code" href="structrtdm__operations.html#59b5f137bf6cabb076c39e375f053ed3">00374</a>         <a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1" title="Transmit message handler.">rtdm_sendmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#59b5f137bf6cabb076c39e375f053ed3" title="Transmit message handler for real-time context (optional).">sendmsg_rt</a>;
<a name="l00376"></a><a class="code" href="structrtdm__operations.html#cba25b7a9180b7891e118b3f8568bdf7">00376</a>         <a class="code" href="group__devregister.html#g2f142d15145b97e837f5e26775a4b0f1" title="Transmit message handler.">rtdm_sendmsg_handler_t</a> <a class="code" href="structrtdm__operations.html#cba25b7a9180b7891e118b3f8568bdf7" title="Transmit message handler for non-real-time context (optional).">sendmsg_nrt</a>;
<a name="l00378"></a>00378 };
<a name="l00379"></a>00379 
<a name="l00380"></a>00380 <span class="keyword">struct </span>rtdm_devctx_reserved {
<a name="l00381"></a>00381         <span class="keywordtype">void</span> *owner;
<a name="l00382"></a>00382         <span class="keyword">struct </span>list_head cleanup;
<a name="l00383"></a>00383 };
<a name="l00384"></a>00384 
<a name="l00396"></a><a class="code" href="structrtdm__dev__context.html">00396</a> <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> {
<a name="l00398"></a><a class="code" href="structrtdm__dev__context.html#ed55a77fa767c4915ee1a317130b8d09">00398</a>         <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structrtdm__dev__context.html#ed55a77fa767c4915ee1a317130b8d09" title="Context flags, see Context Flags for details.">context_flags</a>;
<a name="l00399"></a>00399 
<a name="l00401"></a><a class="code" href="structrtdm__dev__context.html#3347d4133672fb9dc161736105fcf251">00401</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__dev__context.html#3347d4133672fb9dc161736105fcf251" title="Associated file descriptor.">fd</a>;
<a name="l00402"></a>00402 
<a name="l00405"></a><a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a">00405</a>         atomic_t <a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a" title="Lock counter of context, held while structure is referenced by an operation handler...">close_lock_count</a>;
<a name="l00406"></a>00406 
<a name="l00408"></a><a class="code" href="structrtdm__dev__context.html#91420e832bc08338b0d84b12edff9e88">00408</a>         <span class="keyword">struct </span><a class="code" href="structrtdm__operations.html" title="Device operations.">rtdm_operations</a> *<a class="code" href="structrtdm__dev__context.html#91420e832bc08338b0d84b12edff9e88" title="Set of active device operation handlers.">ops</a>;
<a name="l00409"></a>00409 
<a name="l00411"></a><a class="code" href="structrtdm__dev__context.html#8fea6f19169a166aa183d2e9da09df51">00411</a>         <span class="keyword">struct </span><a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> *<a class="code" href="structrtdm__dev__context.html#8fea6f19169a166aa183d2e9da09df51" title="Reference to owning device.">device</a>;
<a name="l00412"></a>00412 
<a name="l00414"></a><a class="code" href="structrtdm__dev__context.html#35602d44d821195ba42acb1e280a4851">00414</a>         <span class="keyword">struct </span>rtdm_devctx_reserved <a class="code" href="structrtdm__dev__context.html#35602d44d821195ba42acb1e280a4851" title="Data stored by RTDM inside a device context (internal use only).">reserved</a>;
<a name="l00415"></a>00415 
<a name="l00417"></a><a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25">00417</a>         <span class="keywordtype">char</span> <a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25" title="Begin of driver defined context data structure.">dev_private</a>[0];
<a name="l00418"></a>00418 };
<a name="l00419"></a>00419 
<a name="l00428"></a>00428 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> *
<a name="l00429"></a><a class="code" href="group__devregister.html#g765ab311ea9024a7ff210e963acd7a14">00429</a> <a class="code" href="group__devregister.html#g765ab311ea9024a7ff210e963acd7a14" title="Locate the driver private area associated to a device context structure.">rtdm_context_to_private</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00430"></a>00430 {
<a name="l00431"></a>00431         <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)context-&gt;<a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25" title="Begin of driver defined context data structure.">dev_private</a>;
<a name="l00432"></a>00432 }
<a name="l00433"></a>00433 
<a name="l00442"></a>00442 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *
<a name="l00443"></a><a class="code" href="group__devregister.html#gcc982b978fc3967b0e9d6d308f79c6ee">00443</a> <a class="code" href="group__devregister.html#gcc982b978fc3967b0e9d6d308f79c6ee" title="Locate a device context structure from its driver private area.">rtdm_private_to_context</a>(<span class="keywordtype">void</span> *<a class="code" href="structrtdm__dev__context.html#720bc9395d80f0dea40c7ac3e449ea25" title="Begin of driver defined context data structure.">dev_private</a>)
<a name="l00444"></a>00444 {
<a name="l00445"></a>00445         <span class="keywordflow">return</span> container_of(dev_private, <span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a>, dev_private);
<a name="l00446"></a>00446 }
<a name="l00447"></a>00447 
<a name="l00448"></a>00448 <span class="keyword">struct </span>rtdm_dev_reserved {
<a name="l00449"></a>00449         <span class="keyword">struct </span>list_head entry;
<a name="l00450"></a>00450         atomic_t refcount;
<a name="l00451"></a>00451         <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *exclusive_context;
<a name="l00452"></a>00452 };
<a name="l00453"></a>00453 
<a name="l00461"></a><a class="code" href="structrtdm__device.html">00461</a> <span class="keyword">struct </span><a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> {
<a name="l00464"></a><a class="code" href="structrtdm__device.html#aa2844f98d874f16d802b4e0b693e4e2">00464</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#aa2844f98d874f16d802b4e0b693e4e2" title="Revision number of this structure, see Driver Versioning defines.">struct_version</a>;
<a name="l00465"></a>00465 
<a name="l00467"></a><a class="code" href="structrtdm__device.html#f459bf86f0d037c99bb669f627d78764">00467</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#f459bf86f0d037c99bb669f627d78764" title="Device flags, see Device Flags for details.">device_flags</a>;
<a name="l00469"></a><a class="code" href="structrtdm__device.html#48d67f835c341c5d27bc5886920a11da">00469</a>         <span class="keywordtype">size_t</span> <a class="code" href="structrtdm__device.html#48d67f835c341c5d27bc5886920a11da" title="Size of driver defined appendix to struct rtdm_dev_context.">context_size</a>;
<a name="l00470"></a>00470 
<a name="l00472"></a><a class="code" href="structrtdm__device.html#376a833e95ff75eb9c8033895bc5e102">00472</a>         <span class="keywordtype">char</span> <a class="code" href="structrtdm__device.html#376a833e95ff75eb9c8033895bc5e102" title="Named device identification (orthogonal to Linux device name space).">device_name</a>[RTDM_MAX_DEVNAME_LEN + 1];
<a name="l00473"></a>00473 
<a name="l00475"></a><a class="code" href="structrtdm__device.html#e58c050e09a79b277f718d796eda2072">00475</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#e58c050e09a79b277f718d796eda2072" title="Protocol device identification: protocol family (PF_xxx).">protocol_family</a>;
<a name="l00477"></a><a class="code" href="structrtdm__device.html#02552f2d91052bd801576b3a132ba3f9">00477</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#02552f2d91052bd801576b3a132ba3f9" title="Protocol device identification: socket type (SOCK_xxx).">socket_type</a>;
<a name="l00478"></a>00478 
<a name="l00483"></a><a class="code" href="structrtdm__device.html#f05d59487bedf7d79dc6b1858c0353c9">00483</a>         <a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6" title="Named device open handler.">rtdm_open_handler_t</a> <a class="code" href="structrtdm__device.html#f05d59487bedf7d79dc6b1858c0353c9" title="Named device instance creation for real-time contexts, optional (but deprecated)...">open_rt</a>;
<a name="l00486"></a><a class="code" href="structrtdm__device.html#948b25a417f5ca6f3737402b60df05d2">00486</a>         <a class="code" href="group__devregister.html#gf987b1139579bdb16b4541ea76121fa6" title="Named device open handler.">rtdm_open_handler_t</a> <a class="code" href="structrtdm__device.html#948b25a417f5ca6f3737402b60df05d2" title="Named device instance creation for non-real-time contexts, optional if open_rt is...">open_nrt</a>;
<a name="l00487"></a>00487 
<a name="l00493"></a><a class="code" href="structrtdm__device.html#d83a8dff6e8705e442f9a7d352556267">00493</a>         <a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5" title="Socket creation handler for protocol devices.">rtdm_socket_handler_t</a> <a class="code" href="structrtdm__device.html#d83a8dff6e8705e442f9a7d352556267" title="Protocol socket creation for real-time contexts, optional (but deprecated) if socket_nrt...">socket_rt</a>;
<a name="l00496"></a><a class="code" href="structrtdm__device.html#dbba71fe2c5bbc2e3abb8cd505e088a0">00496</a>         <a class="code" href="group__devregister.html#g07b8dc34cfc42f6203c510d1e982edc5" title="Socket creation handler for protocol devices.">rtdm_socket_handler_t</a> <a class="code" href="structrtdm__device.html#dbba71fe2c5bbc2e3abb8cd505e088a0" title="Protocol socket creation for non-real-time contexts, optional if socket_rt is non-NULL...">socket_nrt</a>;
<a name="l00497"></a>00497 
<a name="l00499"></a><a class="code" href="structrtdm__device.html#5f92064ba1e7eb351b00277b17d513ef">00499</a>         <span class="keyword">struct </span><a class="code" href="structrtdm__operations.html" title="Device operations.">rtdm_operations</a> <a class="code" href="structrtdm__device.html#5f92064ba1e7eb351b00277b17d513ef" title="Default operations on newly opened device instance.">ops</a>;
<a name="l00500"></a>00500 
<a name="l00502"></a><a class="code" href="structrtdm__device.html#94aa3100258b43c812c5240b55777f07">00502</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#94aa3100258b43c812c5240b55777f07" title="Device class ID, see RTDM_CLASS_xxx.">device_class</a>;
<a name="l00505"></a><a class="code" href="structrtdm__device.html#ece6c5135a6256dbb3636f66eb97cb40">00505</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#ece6c5135a6256dbb3636f66eb97cb40" title="Device sub-class, see RTDM_SUBCLASS_xxx definition in the Device Profiles.">device_sub_class</a>;
<a name="l00507"></a><a class="code" href="structrtdm__device.html#157db58bb0025b832ca409bc40735ae9">00507</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#157db58bb0025b832ca409bc40735ae9" title="Supported device profile version.">profile_version</a>;
<a name="l00509"></a><a class="code" href="structrtdm__device.html#55d676531831124ae7e8051addde3cdc">00509</a>         <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#55d676531831124ae7e8051addde3cdc" title="Informational driver name (reported via /proc).">driver_name</a>;
<a name="l00511"></a><a class="code" href="structrtdm__device.html#ebcb235c789d0698fd821124817e2330">00511</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#ebcb235c789d0698fd821124817e2330" title="Driver version, see Driver Versioning defines.">driver_version</a>;
<a name="l00514"></a><a class="code" href="structrtdm__device.html#ed46d0d1567069de23a7400ff987610b">00514</a>         <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#ed46d0d1567069de23a7400ff987610b" title="Informational peripheral name the device is attached to (reported via /proc).">peripheral_name</a>;
<a name="l00516"></a><a class="code" href="structrtdm__device.html#aacffe6b5bcea62396bf09d6ae2650ba">00516</a>         <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#aacffe6b5bcea62396bf09d6ae2650ba" title="Informational driver provider name (reported via /proc).">provider_name</a>;
<a name="l00517"></a>00517 
<a name="l00519"></a><a class="code" href="structrtdm__device.html#0df5612d6bfcf6421509345384467392">00519</a>         <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structrtdm__device.html#0df5612d6bfcf6421509345384467392" title="Name of /proc entry for the device, must not be NULL.">proc_name</a>;
<a name="l00521"></a><a class="code" href="structrtdm__device.html#67894906d84ed03318277eddc36e35e3">00521</a>         <span class="keyword">struct </span>proc_dir_entry *<a class="code" href="structrtdm__device.html#67894906d84ed03318277eddc36e35e3" title="Set to device&amp;#39;s /proc root entry after registration, do not modify.">proc_entry</a>;
<a name="l00522"></a>00522 
<a name="l00524"></a><a class="code" href="structrtdm__device.html#13d065b957258e702b0c0526c64b729b">00524</a>         <span class="keywordtype">int</span> <a class="code" href="structrtdm__device.html#13d065b957258e702b0c0526c64b729b" title="Driver definable device ID.">device_id</a>;
<a name="l00526"></a><a class="code" href="structrtdm__device.html#23bedbebe7a0d2e392ca6dce1585edcc">00526</a>         <span class="keywordtype">void</span> *<a class="code" href="structrtdm__device.html#23bedbebe7a0d2e392ca6dce1585edcc" title="Driver definable device data.">device_data</a>;
<a name="l00527"></a>00527 
<a name="l00529"></a><a class="code" href="structrtdm__device.html#548f89224ffc7146fd46c53a0eb48040">00529</a>         <span class="keyword">struct </span>rtdm_dev_reserved <a class="code" href="structrtdm__device.html#548f89224ffc7146fd46c53a0eb48040" title="Data stored by RTDM inside a registered device (internal use only).">reserved</a>;
<a name="l00530"></a>00530 };
<a name="l00533"></a>00533 <span class="comment">/* --- device registration --- */</span>
<a name="l00534"></a>00534 
<a name="l00535"></a>00535 <span class="keywordtype">int</span> <a class="code" href="group__devregister.html#g6a191b3d206680c48cad2047adb9fc98" title="Register a RTDM device.">rtdm_dev_register</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> *device);
<a name="l00536"></a>00536 <span class="keywordtype">int</span> <a class="code" href="group__devregister.html#g9cc04a9b6e1710d9ad3860de8d81bf14" title="Unregisters a RTDM device.">rtdm_dev_unregister</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__device.html" title="RTDM device.">rtdm_device</a> *device, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> poll_delay);
<a name="l00537"></a>00537 
<a name="l00538"></a>00538 <span class="comment">/* --- inter-driver API --- */</span>
<a name="l00539"></a>00539 
<a name="l00540"></a>00540 <span class="preprocessor">#define rtdm_open               rt_dev_open</span>
<a name="l00541"></a>00541 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_socket             rt_dev_socket</span>
<a name="l00542"></a>00542 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_close              rt_dev_close</span>
<a name="l00543"></a>00543 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_ioctl              rt_dev_ioctl</span>
<a name="l00544"></a>00544 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_read               rt_dev_read</span>
<a name="l00545"></a>00545 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_write              rt_dev_write</span>
<a name="l00546"></a>00546 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_recvmsg            rt_dev_recvmsg</span>
<a name="l00547"></a>00547 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_recv               rt_dev_recv</span>
<a name="l00548"></a>00548 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_recvfrom           rt_dev_recvfrom</span>
<a name="l00549"></a>00549 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_sendmsg            rt_dev_sendmsg</span>
<a name="l00550"></a>00550 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_send               rt_dev_send</span>
<a name="l00551"></a>00551 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_sendto             rt_dev_sendto</span>
<a name="l00552"></a>00552 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_bind               rt_dev_bind</span>
<a name="l00553"></a>00553 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_listen             rt_dev_listen</span>
<a name="l00554"></a>00554 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_accept             rt_dev_accept</span>
<a name="l00555"></a>00555 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_getsockopt         rt_dev_getsockopt</span>
<a name="l00556"></a>00556 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_setsockopt         rt_dev_setsockopt</span>
<a name="l00557"></a>00557 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_getsockname        rt_dev_getsockname</span>
<a name="l00558"></a>00558 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_getpeername        rt_dev_getpeername</span>
<a name="l00559"></a>00559 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_shutdown           rt_dev_shutdown</span>
<a name="l00560"></a>00560 <span class="preprocessor"></span>
<a name="l00561"></a>00561 <span class="keyword">struct </span><a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *<a class="code" href="group__interdrv.html#g99e8509f4c8b404f0d5795b575d4c9cb" title="Retrieve and lock a device context.">rtdm_context_get</a>(<span class="keywordtype">int</span> <a class="code" href="structrtdm__dev__context.html#3347d4133672fb9dc161736105fcf251" title="Associated file descriptor.">fd</a>);
<a name="l00562"></a>00562 
<a name="l00563"></a>00563 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l00564"></a>00564 
<a name="l00565"></a>00565 <span class="preprocessor">#define CONTEXT_IS_LOCKED(context) \</span>
<a name="l00566"></a>00566 <span class="preprocessor">        (atomic_read(&amp;(context)-&gt;close_lock_count) &gt; 1 || \</span>
<a name="l00567"></a>00567 <span class="preprocessor">         (test_bit(RTDM_CLOSING, &amp;(context)-&gt;context_flags) &amp;&amp; \</span>
<a name="l00568"></a>00568 <span class="preprocessor">          atomic_read(&amp;(context)-&gt;close_lock_count) &gt; 0))</span>
<a name="l00569"></a>00569 <span class="preprocessor"></span>
<a name="l00570"></a>00570 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__interdrv.html#g2a37e9e938db6e8d2f50f66939de7016" title="Increment context reference counter.">rtdm_context_lock</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00571"></a>00571 {
<a name="l00572"></a>00572         XENO_ASSERT(RTDM, CONTEXT_IS_LOCKED(context),
<a name="l00573"></a>00573                     <span class="comment">/* just warn if context was a dangling pointer */</span>);
<a name="l00574"></a>00574         atomic_inc(&amp;context-&gt;<a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a" title="Lock counter of context, held while structure is referenced by an operation handler...">close_lock_count</a>);
<a name="l00575"></a>00575 }
<a name="l00576"></a>00576 
<a name="l00577"></a>00577 <span class="keyword">extern</span> <span class="keywordtype">int</span> rtdm_apc;
<a name="l00578"></a>00578 
<a name="l00579"></a>00579 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__interdrv.html#ga48a3e04fd74cec81691d5d2187d7ef2" title="Decrement context reference counter.">rtdm_context_unlock</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00580"></a>00580 {
<a name="l00581"></a>00581         XENO_ASSERT(RTDM, CONTEXT_IS_LOCKED(context),
<a name="l00582"></a>00582                     <span class="comment">/* just warn if context was a dangling pointer */</span>);
<a name="l00583"></a>00583         smp_mb__before_atomic_dec();
<a name="l00584"></a>00584         <span class="keywordflow">if</span> (unlikely(atomic_dec_and_test(&amp;context-&gt;<a class="code" href="structrtdm__dev__context.html#dca0cb98487cc1a5947e5ff76f62109a" title="Lock counter of context, held while structure is referenced by an operation handler...">close_lock_count</a>)))
<a name="l00585"></a>00585                 <a class="code" href="group__hal.html#ga0e99241b9b16e6a43a4eb0ec144448e" title="Schedule an APC invocation.">rthal_apc_schedule</a>(rtdm_apc);
<a name="l00586"></a>00586 }
<a name="l00587"></a>00587 
<a name="l00588"></a>00588 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__interdrv.html#g05772193e3398e0bc3c9a6e3ed8f90f9" title="Release a device context obtained via rtdm_context_get().">rtdm_context_put</a>(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context)
<a name="l00589"></a>00589 {
<a name="l00590"></a>00590         <a class="code" href="group__interdrv.html#ga48a3e04fd74cec81691d5d2187d7ef2" title="Decrement context reference counter.">rtdm_context_unlock</a>(context);
<a name="l00591"></a>00591 }
<a name="l00592"></a>00592 
<a name="l00593"></a>00593 <span class="comment">/* --- clock services --- */</span>
<a name="l00594"></a>00594 <span class="keyword">struct </span>xntbase;
<a name="l00595"></a>00595 <span class="keyword">extern</span> <span class="keyword">struct </span>xntbase *rtdm_tbase;
<a name="l00596"></a>00596 
<a name="l00597"></a>00597 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> <a class="code" href="group__clock.html#g6cca1db0fd4c207ad92cdc9e9442afa5" title="Get system time.">rtdm_clock_read</a>(<span class="keywordtype">void</span>)
<a name="l00598"></a>00598 {
<a name="l00599"></a>00599         <span class="keywordflow">return</span> xntbase_ticks2ns(rtdm_tbase, <a class="code" href="group__timebase.html#g5246b53b5b2d1b11d4fab4312fd16fda" title="Get the clock time for a given time base.">xntbase_get_time</a>(rtdm_tbase));
<a name="l00600"></a>00600 }
<a name="l00601"></a>00601 
<a name="l00602"></a>00602 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> <a class="code" href="group__clock.html#g861a79090031b981c627107248cf2d14" title="Get monotonic time.">rtdm_clock_read_monotonic</a>(<span class="keywordtype">void</span>)
<a name="l00603"></a>00603 {
<a name="l00604"></a>00604         <span class="keywordflow">return</span> xntbase_ticks2ns(rtdm_tbase, xntbase_get_jiffies(rtdm_tbase));
<a name="l00605"></a>00605 }
<a name="l00606"></a>00606 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l00607"></a>00607 
<a name="l00613"></a>00613 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g0f7da4cec7713ed732ffd99040e219e2" title="Bind a selector to specified event types of a given file descriptor.">rtdm_select_bind</a>(<span class="keywordtype">int</span> fd, rtdm_selector_t *selector,
<a name="l00614"></a>00614                      <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type, <span class="keywordtype">unsigned</span> fd_index);
<a name="l00615"></a>00615 
<a name="l00616"></a>00616 <span class="comment">/* --- spin lock services --- */</span>
<a name="l00654"></a>00654 <span class="preprocessor">#ifdef DOXYGEN_CPP </span><span class="comment">/* Beautify doxygen output */</span>
<a name="l00655"></a><a class="code" href="group__rtdmsync.html#gbbaf52632d5dde7fa66e0b70d887493b">00655</a> <span class="preprocessor">#define RTDM_EXECUTE_ATOMICALLY(code_block)     \</span>
<a name="l00656"></a>00656 <span class="preprocessor">{                                               \</span>
<a name="l00657"></a>00657 <span class="preprocessor">        &lt;ENTER_ATOMIC_SECTION&gt;                  \</span>
<a name="l00658"></a>00658 <span class="preprocessor">        code_block;                             \</span>
<a name="l00659"></a>00659 <span class="preprocessor">        &lt;LEAVE_ATOMIC_SECTION&gt;                  \</span>
<a name="l00660"></a>00660 <span class="preprocessor">}</span>
<a name="l00661"></a>00661 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* This is how it really works */</span>
<a name="l00662"></a>00662 <span class="preprocessor">#define RTDM_EXECUTE_ATOMICALLY(code_block)             \</span>
<a name="l00663"></a>00663 <span class="preprocessor">{                                                       \</span>
<a name="l00664"></a>00664 <span class="preprocessor">        spl_t __rtdm_s;                                 \</span>
<a name="l00665"></a>00665 <span class="preprocessor">                                                        \</span>
<a name="l00666"></a>00666 <span class="preprocessor">        xnlock_get_irqsave(&amp;nklock, __rtdm_s);          \</span>
<a name="l00667"></a>00667 <span class="preprocessor">        code_block;                                     \</span>
<a name="l00668"></a>00668 <span class="preprocessor">        xnlock_put_irqrestore(&amp;nklock, __rtdm_s);       \</span>
<a name="l00669"></a>00669 <span class="preprocessor">}</span>
<a name="l00670"></a>00670 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00671"></a>00671 <span class="preprocessor"></span>
<a name="l00681"></a><a class="code" href="group__rtdmsync.html#g1dd901a6311b10ef7961b5fce7fa9d41">00681</a> <span class="preprocessor">#define RTDM_LOCK_UNLOCKED      RTHAL_SPIN_LOCK_UNLOCKED</span>
<a name="l00682"></a>00682 <span class="preprocessor"></span>
<a name="l00684"></a><a class="code" href="group__rtdmsync.html#gb6398c5dab6f8614bc8310b2248ae0b6">00684</a> <span class="keyword">typedef</span> rthal_spinlock_t <a class="code" href="group__rtdmsync.html#gb6398c5dab6f8614bc8310b2248ae0b6" title="Lock variable.">rtdm_lock_t</a>;
<a name="l00685"></a>00685 
<a name="l00687"></a><a class="code" href="group__rtdmsync.html#g7584217487c323356414e21200a57e63">00687</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="group__rtdmsync.html#g7584217487c323356414e21200a57e63" title="Variable to save the context while holding a lock.">rtdm_lockctx_t</a>;
<a name="l00688"></a>00688 
<a name="l00704"></a><a class="code" href="group__rtdmsync.html#g6abf985ea7a0b13ec564cf0107fd8cba">00704</a> <span class="preprocessor">#define rtdm_lock_init(lock)    rthal_spin_lock_init(lock)</span>
<a name="l00705"></a>00705 <span class="preprocessor"></span>
<a name="l00722"></a>00722 <span class="preprocessor">#ifdef DOXYGEN_CPP </span><span class="comment">/* Beautify doxygen output */</span>
<a name="l00723"></a><a class="code" href="group__rtdmsync.html#g65a4897268e15bda462b871976cb3909">00723</a> <span class="preprocessor">#define rtdm_lock_get(lock)     rthal_spin_lock(lock)</span>
<a name="l00724"></a>00724 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* This is how it really works */</span>
<a name="l00725"></a>00725 <span class="preprocessor">#define rtdm_lock_get(lock)                                     \</span>
<a name="l00726"></a>00726 <span class="preprocessor">        do {                                                    \</span>
<a name="l00727"></a>00727 <span class="preprocessor">                XENO_BUGON(RTDM, !rthal_local_irq_disabled());  \</span>
<a name="l00728"></a>00728 <span class="preprocessor">                rthal_spin_lock(lock);                          \</span>
<a name="l00729"></a>00729 <span class="preprocessor">        } while (0)</span>
<a name="l00730"></a>00730 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00731"></a>00731 <span class="preprocessor"></span>
<a name="l00748"></a><a class="code" href="group__rtdmsync.html#g963bdb01102d0076cd64f6bc72a347da">00748</a> <span class="preprocessor">#define rtdm_lock_put(lock)     rthal_spin_unlock(lock)</span>
<a name="l00749"></a>00749 <span class="preprocessor"></span>
<a name="l00767"></a><a class="code" href="group__rtdmsync.html#g985473873f9e32af688fe8a23634693d">00767</a> <span class="preprocessor">#define rtdm_lock_get_irqsave(lock, context)    \</span>
<a name="l00768"></a>00768 <span class="preprocessor">        rthal_spin_lock_irqsave(lock, context)</span>
<a name="l00769"></a>00769 <span class="preprocessor"></span>
<a name="l00787"></a><a class="code" href="group__rtdmsync.html#g4f1f8e33baf33b162636f63dec61aebd">00787</a> <span class="preprocessor">#define rtdm_lock_put_irqrestore(lock, context) \</span>
<a name="l00788"></a>00788 <span class="preprocessor">        rthal_spin_unlock_irqrestore(lock, context)</span>
<a name="l00789"></a>00789 <span class="preprocessor"></span>
<a name="l00806"></a><a class="code" href="group__rtdmsync.html#g3d563fc5def018f743c55c452e061758">00806</a> <span class="preprocessor">#define rtdm_lock_irqsave(context)      \</span>
<a name="l00807"></a>00807 <span class="preprocessor">        rthal_local_irq_save(context)</span>
<a name="l00808"></a>00808 <span class="preprocessor"></span>
<a name="l00825"></a><a class="code" href="group__rtdmsync.html#ge03c387fcae8a55105dd31d7c008bbb4">00825</a> <span class="preprocessor">#define rtdm_lock_irqrestore(context)   \</span>
<a name="l00826"></a>00826 <span class="preprocessor">        rthal_local_irq_restore(context)</span>
<a name="l00827"></a>00827 <span class="preprocessor"></span>
<a name="l00831"></a>00831 <span class="comment">/* --- Interrupt management services --- */</span>
<a name="l00837"></a>00837 <span class="keyword">typedef</span> xnintr_t rtdm_irq_t;
<a name="l00838"></a>00838 
<a name="l00845"></a><a class="code" href="group__rtdmirq.html#gb26458b2383dd59b4977cd77c948cdfc">00845</a> <span class="preprocessor">#define RTDM_IRQTYPE_SHARED             XN_ISR_SHARED</span>
<a name="l00846"></a>00846 <span class="preprocessor"></span>
<a name="l00848"></a><a class="code" href="group__rtdmirq.html#gf4e76db13d7f7aac4be2cae59e0097bc">00848</a> <span class="preprocessor">#define RTDM_IRQTYPE_EDGE               XN_ISR_EDGE</span>
<a name="l00849"></a>00849 <span class="preprocessor"></span>
<a name="l00858"></a><a class="code" href="group__rtdmirq.html#gdabd8f3473098ae9128ef449a83fe3c2">00858</a> <span class="keyword">typedef</span> int (*<a class="code" href="group__rtdmirq.html#gdabd8f3473098ae9128ef449a83fe3c2" title="Interrupt handler.">rtdm_irq_handler_t</a>)(rtdm_irq_t *irq_handle);
<a name="l00859"></a>00859 
<a name="l00866"></a><a class="code" href="group__rtdmirq.html#gd7b7593bdac7e1595635f2b372110d22">00866</a> <span class="preprocessor">#define RTDM_IRQ_NONE                   XN_ISR_NONE</span>
<a name="l00867"></a>00867 <span class="preprocessor"></span>
<a name="l00868"></a><a class="code" href="group__rtdmirq.html#g56a2e243364bc9ff0e38c031c4c8ad57">00868</a> <span class="preprocessor">#define RTDM_IRQ_HANDLED                XN_ISR_HANDLED</span>
<a name="l00869"></a>00869 <span class="preprocessor"></span>
<a name="l00888"></a><a class="code" href="group__rtdmirq.html#gc99789fe8b6b48e032ee6c22544968e4">00888</a> <span class="preprocessor">#define rtdm_irq_get_arg(irq_handle, type)      ((type *)irq_handle-&gt;cookie)</span>
<a name="l00889"></a>00889 <span class="preprocessor"></span>
<a name="l00891"></a>00891 <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#g9bb3d95218ac5261e4033fb0bf695073" title="Register an interrupt handler.">rtdm_irq_request</a>(rtdm_irq_t *irq_handle, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> irq_no,
<a name="l00892"></a>00892                      <a class="code" href="group__rtdmirq.html#gdabd8f3473098ae9128ef449a83fe3c2" title="Interrupt handler.">rtdm_irq_handler_t</a> handler, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> flags,
<a name="l00893"></a>00893                      <span class="keyword">const</span> <span class="keywordtype">char</span> *device_name, <span class="keywordtype">void</span> *arg);
<a name="l00894"></a>00894 
<a name="l00895"></a>00895 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l00896"></a>00896 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#gf246c0d9fa42a18afbeabd3e3c087c8e" title="Release an interrupt handler.">rtdm_irq_free</a>(rtdm_irq_t *irq_handle)
<a name="l00897"></a>00897 {
<a name="l00898"></a>00898         <span class="keywordflow">return</span> <a class="code" href="group__intr.html#g83769b98f398774590e57ad8664925aa" title="Detach an interrupt object.">xnintr_detach</a>(irq_handle);
<a name="l00899"></a>00899 }
<a name="l00900"></a>00900 
<a name="l00901"></a>00901 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#g231362e861125cfdcbe5b4137fc70680" title="Enable interrupt line.">rtdm_irq_enable</a>(rtdm_irq_t *irq_handle)
<a name="l00902"></a>00902 {
<a name="l00903"></a>00903         <span class="keywordflow">return</span> <a class="code" href="group__intr.html#g083e000abd434e4d0fca8f6b6bbd49de" title="Enable an interrupt object.">xnintr_enable</a>(irq_handle);
<a name="l00904"></a>00904 }
<a name="l00905"></a>00905 
<a name="l00906"></a>00906 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmirq.html#gb34c102e3e8af1f27786b2996247913d" title="Disable interrupt line.">rtdm_irq_disable</a>(rtdm_irq_t *irq_handle)
<a name="l00907"></a>00907 {
<a name="l00908"></a>00908         <span class="keywordflow">return</span> <a class="code" href="group__intr.html#g05570451a808b44216140e00b0eae713" title="Disable an interrupt object.">xnintr_disable</a>(irq_handle);
<a name="l00909"></a>00909 }
<a name="l00910"></a>00910 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l00911"></a>00911 
<a name="l00912"></a>00912 <span class="comment">/* --- non-real-time signalling services --- */</span>
<a name="l00913"></a>00913 
<a name="l00919"></a>00919 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> rtdm_nrtsig_t;
<a name="l00920"></a>00920 
<a name="l00931"></a><a class="code" href="group__nrtsignal.html#g3c72df92865ad7decadab7c94fa75d0a">00931</a> <span class="keyword">typedef</span> void (*<a class="code" href="group__nrtsignal.html#g3c72df92865ad7decadab7c94fa75d0a" title="Non-real-time signal handler.">rtdm_nrtsig_handler_t</a>)(rtdm_nrtsig_t nrt_sig, <span class="keywordtype">void</span> *arg);
<a name="l00934"></a>00934 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l00935"></a>00935 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__nrtsignal.html#g38bd867e104f7e300a03200b1ccc1aae" title="Register a non-real-time signal handler.">rtdm_nrtsig_init</a>(rtdm_nrtsig_t *nrt_sig,
<a name="l00936"></a>00936                                    <a class="code" href="group__nrtsignal.html#g3c72df92865ad7decadab7c94fa75d0a" title="Non-real-time signal handler.">rtdm_nrtsig_handler_t</a> handler, <span class="keywordtype">void</span> *arg)
<a name="l00937"></a>00937 {
<a name="l00938"></a>00938         *nrt_sig = rthal_alloc_virq();
<a name="l00939"></a>00939 
<a name="l00940"></a>00940         <span class="keywordflow">if</span> (*nrt_sig == 0)
<a name="l00941"></a>00941                 <span class="keywordflow">return</span> -EAGAIN;
<a name="l00942"></a>00942 
<a name="l00943"></a>00943         rthal_virtualize_irq(rthal_root_domain, *nrt_sig, handler, arg, NULL,
<a name="l00944"></a>00944                              IPIPE_HANDLE_MASK);
<a name="l00945"></a>00945         <span class="keywordflow">return</span> 0;
<a name="l00946"></a>00946 }
<a name="l00947"></a>00947 
<a name="l00948"></a>00948 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__nrtsignal.html#g4417c31c4990c3655f8ab4e7de6afa49" title="Release a non-realtime signal handler.">rtdm_nrtsig_destroy</a>(rtdm_nrtsig_t *nrt_sig)
<a name="l00949"></a>00949 {
<a name="l00950"></a>00950         rthal_free_virq(*nrt_sig);
<a name="l00951"></a>00951 }
<a name="l00952"></a>00952 
<a name="l00953"></a>00953 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__nrtsignal.html#g80f0f176bdef54a4f3f3e202b156e450" title="Trigger non-real-time signal.">rtdm_nrtsig_pend</a>(rtdm_nrtsig_t *nrt_sig)
<a name="l00954"></a>00954 {
<a name="l00955"></a>00955         rthal_trigger_irq(*nrt_sig);
<a name="l00956"></a>00956 }
<a name="l00957"></a>00957 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l00958"></a>00958 
<a name="l00959"></a>00959 <span class="comment">/* --- timer services --- */</span>
<a name="l00960"></a>00960 
<a name="l00966"></a>00966 <span class="keyword">typedef</span> xntimer_t rtdm_timer_t;
<a name="l00967"></a>00967 
<a name="l00973"></a><a class="code" href="group__rtdmtimer.html#g31b7b9a042260702a110bfe2c9bcac61">00973</a> <span class="keyword">typedef</span> void (*<a class="code" href="group__rtdmtimer.html#g31b7b9a042260702a110bfe2c9bcac61" title="Timer handler.">rtdm_timer_handler_t</a>)(rtdm_timer_t *timer);
<a name="l00974"></a>00974 
<a name="l00980"></a><a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">00980</a> <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> {
<a name="l00982"></a><a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd0ddd5d0b543bebdb1187330b7f52a94f8">00982</a>         <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd0ddd5d0b543bebdb1187330b7f52a94f8" title="Monotonic timer with relative timeout.">RTDM_TIMERMODE_RELATIVE</a> = XN_RELATIVE,
<a name="l00983"></a>00983 
<a name="l00985"></a><a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd077b27da267c09a5a586aab86c9cd22e2">00985</a>         <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd077b27da267c09a5a586aab86c9cd22e2" title="Monotonic timer with absolute timeout.">RTDM_TIMERMODE_ABSOLUTE</a> = XN_ABSOLUTE,
<a name="l00986"></a>00986 
<a name="l00988"></a><a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd08c206cf25cb340fd7ccee4489df6a220">00988</a>         <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd08c206cf25cb340fd7ccee4489df6a220" title="Adjustable timer with absolute timeout.">RTDM_TIMERMODE_REALTIME</a> = XN_REALTIME
<a name="l00989"></a>00989 };
<a name="l00994"></a>00994 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid broken doxygen output */</span>
<a name="l00995"></a>00995 <span class="preprocessor">#define rtdm_timer_init(timer, handler, name)           \</span>
<a name="l00996"></a>00996 <span class="preprocessor">({                                                      \</span>
<a name="l00997"></a>00997 <span class="preprocessor">        xntimer_init((timer), rtdm_tbase, handler);     \</span>
<a name="l00998"></a>00998 <span class="preprocessor">        xntimer_set_name((timer), (name));              \</span>
<a name="l00999"></a>00999 <span class="preprocessor">        0;                                              \</span>
<a name="l01000"></a>01000 <span class="preprocessor">})</span>
<a name="l01001"></a>01001 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01002"></a>01002 
<a name="l01003"></a>01003 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtimer.html#gc75c6e2f7c838b11d8e261be3a7a0326" title="Destroy a timer.">rtdm_timer_destroy</a>(rtdm_timer_t *timer);
<a name="l01004"></a>01004 
<a name="l01005"></a>01005 <span class="keywordtype">int</span> <a class="code" href="group__rtdmtimer.html#g429ca4935762583edb6e1ebc955fe958" title="Start a timer.">rtdm_timer_start</a>(rtdm_timer_t *timer, <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> expiry,
<a name="l01006"></a>01006                      <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> interval, <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> mode);
<a name="l01007"></a>01007 
<a name="l01008"></a>01008 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtimer.html#g7f2accf693db9ed5a537b86a58bccd94" title="Stop a timer.">rtdm_timer_stop</a>(rtdm_timer_t *timer);
<a name="l01009"></a>01009 
<a name="l01010"></a>01010 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01011"></a>01011 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtimer.html#gf585049063aa6ffb2f79511c0a091119" title="Start a timer from inside a timer handler.">rtdm_timer_start_in_handler</a>(rtdm_timer_t *timer,
<a name="l01012"></a>01012                                               <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> expiry,
<a name="l01013"></a>01013                                               <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> interval,
<a name="l01014"></a>01014                                               <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> mode)
<a name="l01015"></a>01015 {
<a name="l01016"></a>01016         <span class="keywordflow">return</span> <a class="code" href="group__timer.html#g0ad3c70bed7fe1a45b45ee0875f031ab" title="Arm a timer.">xntimer_start</a>(timer, xntbase_ns2ticks_ceil(rtdm_tbase, expiry),
<a name="l01017"></a>01017                              xntbase_ns2ticks_ceil(rtdm_tbase, interval),
<a name="l01018"></a>01018                              (xntmode_t)mode);
<a name="l01019"></a>01019 }
<a name="l01020"></a>01020 
<a name="l01021"></a>01021 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmtimer.html#gf76e21cc3429370612b76493fdb6d23e" title="Stop a timer from inside a timer handler.">rtdm_timer_stop_in_handler</a>(rtdm_timer_t *timer)
<a name="l01022"></a>01022 {
<a name="l01023"></a>01023         <a class="code" href="group__timer.html#g1244411df9784d63d3e2f99016d62643" title="Disarm a timer.">xntimer_stop</a>(timer);
<a name="l01024"></a>01024 }
<a name="l01025"></a>01025 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01026"></a>01026 
<a name="l01027"></a>01027 <span class="comment">/* --- task services --- */</span>
<a name="l01033"></a>01033 <span class="keyword">typedef</span> xnthread_t rtdm_task_t;
<a name="l01034"></a>01034 
<a name="l01040"></a><a class="code" href="group__rtdmtask.html#ga3cb481ab12462f5e54ff6fee12813e5">01040</a> <span class="keyword">typedef</span> void (*<a class="code" href="group__rtdmtask.html#ga3cb481ab12462f5e54ff6fee12813e5" title="Real-time task procedure.">rtdm_task_proc_t</a>)(<span class="keywordtype">void</span> *arg);
<a name="l01041"></a>01041 
<a name="l01046"></a>01046 <span class="preprocessor">#define RTDM_TASK_LOWEST_PRIORITY       XNSCHED_LOW_PRIO</span>
<a name="l01047"></a>01047 <span class="preprocessor"></span><span class="preprocessor">#define RTDM_TASK_HIGHEST_PRIORITY      XNSCHED_HIGH_PRIO</span>
<a name="l01048"></a>01048 <span class="preprocessor"></span>
<a name="l01054"></a>01054 <span class="preprocessor">#define RTDM_TASK_RAISE_PRIORITY        (+1)</span>
<a name="l01055"></a>01055 <span class="preprocessor"></span><span class="preprocessor">#define RTDM_TASK_LOWER_PRIORITY        (-1)</span>
<a name="l01056"></a>01056 <span class="preprocessor"></span>
<a name="l01060"></a>01060 <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#g44b0701b6c28fa8035711f800fdcd371" title="Intialise and start a real-time task.">rtdm_task_init</a>(rtdm_task_t *task, <span class="keyword">const</span> <span class="keywordtype">char</span> *name,
<a name="l01061"></a>01061                    <a class="code" href="group__rtdmtask.html#ga3cb481ab12462f5e54ff6fee12813e5" title="Real-time task procedure.">rtdm_task_proc_t</a> task_proc, <span class="keywordtype">void</span> *arg,
<a name="l01062"></a>01062                    <span class="keywordtype">int</span> priority, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> period);
<a name="l01063"></a>01063 <span class="keywordtype">int</span> __rtdm_task_sleep(xnticks_t timeout, xntmode_t mode);
<a name="l01064"></a>01064 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#ga3940cfff7cc72d7bc064a3e279d74ac" title="Busy-wait a specified amount of time.">rtdm_task_busy_sleep</a>(<a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> delay);
<a name="l01065"></a>01065 
<a name="l01066"></a>01066 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01067"></a>01067 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#g7b5581febb2732127736817ca44e86e3" title="Destroy a real-time task.">rtdm_task_destroy</a>(rtdm_task_t *task)
<a name="l01068"></a>01068 {
<a name="l01069"></a>01069         <a class="code" href="group__pod.html#gd2b761fb70cad30339f092edb4a89587" title="Delete a thread.">xnpod_delete_thread</a>(task);
<a name="l01070"></a>01070 }
<a name="l01071"></a>01071 
<a name="l01072"></a>01072 <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#g8a60a2a7ba5fec7dac5336b3e8f256cc" title="Wait on a real-time task to terminate.">rtdm_task_join_nrt</a>(rtdm_task_t *task, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> poll_delay);
<a name="l01073"></a>01073 
<a name="l01074"></a>01074 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmtask.html#g286f2d3ff73b3e9c5f24d5a1122a57d2" title="Adjust real-time task priority.">rtdm_task_set_priority</a>(rtdm_task_t *task, <span class="keywordtype">int</span> priority)
<a name="l01075"></a>01075 {
<a name="l01076"></a>01076         <span class="keyword">union </span>xnsched_policy_param param = { .rt = { .prio = priority } };
<a name="l01077"></a>01077         <a class="code" href="group__pod.html#g6d535ef9821e98fd7f257b50a3c8d595" title="Change the base scheduling parameters of a thread.">xnpod_set_thread_schedparam</a>(task, &amp;xnsched_class_rt, &amp;param);
<a name="l01078"></a>01078         <a class="code" href="group__pod.html#gcf5b53f0405351327b89b0cc4976b962" title="Rescheduling procedure entry point.">xnpod_schedule</a>();
<a name="l01079"></a>01079 }
<a name="l01080"></a>01080 
<a name="l01081"></a>01081 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#ga5b32e7ff35bda7c6d929f8a894149b3" title="Adjust real-time task period.">rtdm_task_set_period</a>(rtdm_task_t *task,
<a name="l01082"></a>01082                                        <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> period)
<a name="l01083"></a>01083 {
<a name="l01084"></a>01084         <span class="keywordflow">if</span> (period &lt; 0)
<a name="l01085"></a>01085                 period = 0;
<a name="l01086"></a>01086         <span class="keywordflow">return</span> <a class="code" href="group__pod.html#ged5776a428e7c59b52b1da76f0d765fa" title="Make a thread periodic.">xnpod_set_thread_periodic</a>(task, XN_INFINITE,
<a name="l01087"></a>01087                                          xntbase_ns2ticks_ceil
<a name="l01088"></a>01088                                          (xnthread_time_base(task), period));
<a name="l01089"></a>01089 }
<a name="l01090"></a>01090 
<a name="l01091"></a>01091 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#ge52cca97ebaf78eec2e31553a4dacd5e" title="Activate a blocked real-time task.">rtdm_task_unblock</a>(rtdm_task_t *task)
<a name="l01092"></a>01092 {
<a name="l01093"></a>01093         <span class="keywordtype">int</span> res = <a class="code" href="group__pod.html#ge5f0d19e7a499b9b262f68a43ab545dd" title="Unblock a thread.">xnpod_unblock_thread</a>(task);
<a name="l01094"></a>01094 
<a name="l01095"></a>01095         <a class="code" href="group__pod.html#gcf5b53f0405351327b89b0cc4976b962" title="Rescheduling procedure entry point.">xnpod_schedule</a>();
<a name="l01096"></a>01096         <span class="keywordflow">return</span> res;
<a name="l01097"></a>01097 }
<a name="l01098"></a>01098 
<a name="l01099"></a>01099 <span class="keyword">static</span> <span class="keyword">inline</span> rtdm_task_t *<a class="code" href="group__rtdmtask.html#gfd58b762de7269549d1e54699ceebc0d" title="Get current real-time task.">rtdm_task_current</a>(<span class="keywordtype">void</span>)
<a name="l01100"></a>01100 {
<a name="l01101"></a>01101         <span class="keywordflow">return</span> xnpod_current_thread();
<a name="l01102"></a>01102 }
<a name="l01103"></a>01103 
<a name="l01104"></a>01104 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#g577886a7588cdceac10f1b7b6ffcd1c7" title="Wait on next real-time task period.">rtdm_task_wait_period</a>(<span class="keywordtype">void</span>)
<a name="l01105"></a>01105 {
<a name="l01106"></a>01106         XENO_ASSERT(RTDM, !xnpod_unblockable_p(), <span class="keywordflow">return</span> -EPERM;);
<a name="l01107"></a>01107         <span class="keywordflow">return</span> <a class="code" href="group__pod.html#gf836996e4a3378928f2a9f93a4915cfa" title="Wait for the next periodic release point.">xnpod_wait_thread_period</a>(NULL);
<a name="l01108"></a>01108 }
<a name="l01109"></a>01109 
<a name="l01110"></a>01110 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__rtdmtask.html#gbfae53746165a83a75965b7b0f6710a0" title="Sleep a specified amount of time.">rtdm_task_sleep</a>(<a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> delay)
<a name="l01111"></a>01111 {
<a name="l01112"></a>01112         <span class="keywordflow">return</span> __rtdm_task_sleep(delay, XN_RELATIVE);
<a name="l01113"></a>01113 }
<a name="l01114"></a>01114 
<a name="l01115"></a>01115 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span>
<a name="l01116"></a>01116 <a class="code" href="group__rtdmtask.html#g1763346568d041f9c66d68224816d15b" title="Sleep until a specified absolute time.">rtdm_task_sleep_abs</a>(<a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> wakeup_date, <span class="keyword">enum</span> <a class="code" href="group__rtdmtimer.html#gd0bffecd0182d68967ebb5b47df0bcd0">rtdm_timer_mode</a> mode)
<a name="l01117"></a>01117 {
<a name="l01118"></a>01118         <span class="comment">/* For the sake of a consistent API usage... */</span>
<a name="l01119"></a>01119         <span class="keywordflow">if</span> (mode != <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd077b27da267c09a5a586aab86c9cd22e2" title="Monotonic timer with absolute timeout.">RTDM_TIMERMODE_ABSOLUTE</a> &amp;&amp; mode != <a class="code" href="group__rtdmtimer.html#ggd0bffecd0182d68967ebb5b47df0bcd08c206cf25cb340fd7ccee4489df6a220" title="Adjustable timer with absolute timeout.">RTDM_TIMERMODE_REALTIME</a>)
<a name="l01120"></a>01120                 <span class="keywordflow">return</span> -EINVAL;
<a name="l01121"></a>01121         <span class="keywordflow">return</span> __rtdm_task_sleep(wakeup_date, (xntmode_t)mode);
<a name="l01122"></a>01122 }
<a name="l01123"></a>01123 
<a name="l01124"></a>01124 <span class="comment">/* rtdm_task_sleep_abs shall be used instead */</span>
<a name="l01125"></a>01125 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> __deprecated <a class="code" href="group__rtdmtask.html#g741998821c05483db33f17d77c733d99" title="Sleep until a specified absolute time.">rtdm_task_sleep_until</a>(<a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> wakeup_time)
<a name="l01126"></a>01126 {
<a name="l01127"></a>01127         <span class="keywordflow">return</span> __rtdm_task_sleep(wakeup_time, XN_REALTIME);
<a name="l01128"></a>01128 }
<a name="l01129"></a>01129 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01130"></a>01130 
<a name="l01131"></a>01131 <span class="comment">/* --- timeout sequences */</span>
<a name="l01132"></a>01132 
<a name="l01133"></a>01133 <span class="keyword">typedef</span> <a class="code" href="group__rtdm.html#gd3b24c25feabadba465f8797d8c7fe27" title="RTDM type for representing absolute dates.">nanosecs_abs_t</a> rtdm_toseq_t;
<a name="l01134"></a>01134 
<a name="l01135"></a>01135 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g531ddf80690059302409f760bd7f14d4" title="Initialise a timeout sequence.">rtdm_toseq_init</a>(rtdm_toseq_t *timeout_seq, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout);
<a name="l01136"></a>01136 
<a name="l01137"></a>01137 <span class="comment">/* --- event services --- */</span>
<a name="l01138"></a>01138 
<a name="l01139"></a>01139 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l01140"></a>01140         xnsynch_t synch_base;
<a name="l01141"></a>01141         DECLARE_XNSELECT(select_block);
<a name="l01142"></a>01142 } rtdm_event_t;
<a name="l01143"></a>01143 
<a name="l01144"></a>01144 <span class="preprocessor">#define RTDM_EVENT_PENDING              XNSYNCH_SPARE1</span>
<a name="l01145"></a>01145 <span class="preprocessor"></span>
<a name="l01146"></a>01146 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gddf08d8ba5a44668bb360070a114fb19" title="Initialise an event.">rtdm_event_init</a>(rtdm_event_t *event, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> pending);
<a name="l01147"></a>01147 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_RTDM_SELECT</span>
<a name="l01148"></a>01148 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g839656c781d87069dd1bf1c84c38e9d9" title="Bind a selector to an event.">rtdm_event_select_bind</a>(rtdm_event_t *event, rtdm_selector_t *selector,
<a name="l01149"></a>01149                            <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type, <span class="keywordtype">unsigned</span> fd_index);
<a name="l01150"></a>01150 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01151"></a>01151 <span class="preprocessor">#define rtdm_event_select_bind(e, s, t, i) ({ (void)(e); -EBADF; })</span>
<a name="l01152"></a>01152 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01153"></a>01153 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g1c433b50c53d49d164b084751861e855" title="Wait on event occurrence.">rtdm_event_wait</a>(rtdm_event_t *event);
<a name="l01154"></a>01154 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#gf76f858a3951ca2e20d3b1e00afa17e0" title="Wait on event occurrence with timeout.">rtdm_event_timedwait</a>(rtdm_event_t *event, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout,
<a name="l01155"></a>01155                          rtdm_toseq_t *timeout_seq);
<a name="l01156"></a>01156 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g1217402b82034b26fe25c26f1e5b32c9" title="Signal an event occurrence.">rtdm_event_signal</a>(rtdm_event_t *event);
<a name="l01157"></a>01157 
<a name="l01158"></a>01158 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g732fe3cf3370df0f296f06fc4ac7f925" title="Clear event state.">rtdm_event_clear</a>(rtdm_event_t *event);
<a name="l01159"></a>01159 
<a name="l01160"></a>01160 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01161"></a>01161 <span class="keywordtype">void</span> __rtdm_synch_flush(xnsynch_t *synch, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> reason);
<a name="l01162"></a>01162 
<a name="l01163"></a>01163 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g7c9745d1db8e6de244a6c2690cbb8b22" title="Signal an event occurrence to currently listening waiters.">rtdm_event_pulse</a>(rtdm_event_t *event)
<a name="l01164"></a>01164 {
<a name="l01165"></a>01165         trace_mark(xn_rtdm, event_pulse, <span class="stringliteral">"event %p"</span>, event);
<a name="l01166"></a>01166         __rtdm_synch_flush(&amp;event-&gt;synch_base, 0);
<a name="l01167"></a>01167 }
<a name="l01168"></a>01168 
<a name="l01169"></a>01169 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g7b27d0206027a07958d4a09017e8a3fe" title="Destroy an event.">rtdm_event_destroy</a>(rtdm_event_t *event)
<a name="l01170"></a>01170 {
<a name="l01171"></a>01171         trace_mark(xn_rtdm, event_destroy, <span class="stringliteral">"event %p"</span>, event);
<a name="l01172"></a>01172         __rtdm_synch_flush(&amp;event-&gt;synch_base, <a class="code" href="group__nucleus__info__flags.html#gb07d9dea73645dbba353dc2452c15b40" title="Pending on a removed resource.">XNRMID</a>);
<a name="l01173"></a>01173         <a class="code" href="group__select.html#g56e4b5bf3e35dd80c23e95cad8fa1614" title="Destroy the xnselect structure associated with a file descriptor.">xnselect_destroy</a>(&amp;event-&gt;select_block);
<a name="l01174"></a>01174 }
<a name="l01175"></a>01175 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01176"></a>01176 
<a name="l01177"></a>01177 <span class="comment">/* --- semaphore services --- */</span>
<a name="l01178"></a>01178 
<a name="l01179"></a>01179 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l01180"></a>01180         <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value;
<a name="l01181"></a>01181         xnsynch_t synch_base;
<a name="l01182"></a>01182         DECLARE_XNSELECT(select_block);
<a name="l01183"></a>01183 } rtdm_sem_t;
<a name="l01184"></a>01184 
<a name="l01185"></a>01185 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#ge1172824e463d7705ed3033e8aea133d" title="Initialise a semaphore.">rtdm_sem_init</a>(rtdm_sem_t *sem, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value);
<a name="l01186"></a>01186 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_RTDM_SELECT</span>
<a name="l01187"></a>01187 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#gf61f576b0ff06f99399b27725aef0ae1" title="Bind a selector to a semaphore.">rtdm_sem_select_bind</a>(rtdm_sem_t *sem, rtdm_selector_t *selector,
<a name="l01188"></a>01188                          <span class="keyword">enum</span> <a class="code" href="group__rtdmsync.html#ge18228df8c70c9da1f90f61b01e92501">rtdm_selecttype</a> type, <span class="keywordtype">unsigned</span> fd_index);
<a name="l01189"></a>01189 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01190"></a>01190 <span class="preprocessor">#define rtdm_sem_select_bind(s, se, t, i) ({ (void)(s); -EBADF; })</span>
<a name="l01191"></a>01191 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !CONFIG_XENO_OPT_RTDM_SELECT */</span>
<a name="l01192"></a>01192 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g59da1b60b7279c1fc4355e2e0b2cc77c" title="Decrement a semaphore.">rtdm_sem_down</a>(rtdm_sem_t *sem);
<a name="l01193"></a>01193 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g8aadb120a93df5dfd717c5bac6d4c1a9" title="Decrement a semaphore with timeout.">rtdm_sem_timeddown</a>(rtdm_sem_t *sem, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout,
<a name="l01194"></a>01194                        rtdm_toseq_t *timeout_seq);
<a name="l01195"></a>01195 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g829dbd8c5709d798ed06947b27001fed" title="Increment a semaphore.">rtdm_sem_up</a>(rtdm_sem_t *sem);
<a name="l01196"></a>01196 
<a name="l01197"></a>01197 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01198"></a>01198 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gf16f45217e54201ff3f24753982c41f8" title="Destroy a semaphore.">rtdm_sem_destroy</a>(rtdm_sem_t *sem)
<a name="l01199"></a>01199 {
<a name="l01200"></a>01200         trace_mark(xn_rtdm, <a class="code" href="group__posix__sem.html#g6dbe34606b393161567a658a32be87af" title="Destroy an unnamed semaphore.">sem_destroy</a>, <span class="stringliteral">"sem %p"</span>, sem);
<a name="l01201"></a>01201         __rtdm_synch_flush(&amp;sem-&gt;synch_base, <a class="code" href="group__nucleus__info__flags.html#gb07d9dea73645dbba353dc2452c15b40" title="Pending on a removed resource.">XNRMID</a>);
<a name="l01202"></a>01202         <a class="code" href="group__select.html#g56e4b5bf3e35dd80c23e95cad8fa1614" title="Destroy the xnselect structure associated with a file descriptor.">xnselect_destroy</a>(&amp;sem-&gt;select_block);
<a name="l01203"></a>01203 }
<a name="l01204"></a>01204 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01205"></a>01205 
<a name="l01206"></a>01206 <span class="comment">/* --- mutex services --- */</span>
<a name="l01207"></a>01207 
<a name="l01208"></a>01208 <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l01209"></a>01209         xnsynch_t synch_base;
<a name="l01210"></a>01210 } rtdm_mutex_t;
<a name="l01211"></a>01211 
<a name="l01212"></a>01212 <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#g8d58a144bf71df7b38bb887d036cbbb5" title="Initialise a mutex.">rtdm_mutex_init</a>(rtdm_mutex_t *mutex);
<a name="l01213"></a>01213 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g67c8f85c844df1aeed806e343a1b6437" title="Request a mutex.">rtdm_mutex_lock</a>(rtdm_mutex_t *mutex);
<a name="l01214"></a>01214 <span class="keywordtype">int</span> <a class="code" href="group__rtdmsync.html#g0789968300701ba2a940f5fe8b1fd4d8" title="Request a mutex with timeout.">rtdm_mutex_timedlock</a>(rtdm_mutex_t *mutex, <a class="code" href="group__rtdm.html#gededf91e760e3268235351dcc9d9dcda" title="RTDM type for representing relative intervals.">nanosecs_rel_t</a> timeout,
<a name="l01215"></a>01215                          rtdm_toseq_t *timeout_seq);
<a name="l01216"></a>01216 
<a name="l01217"></a>01217 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01218"></a>01218 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gb40ed579324d8cc76387a0e06dd0f82a" title="Release a mutex.">rtdm_mutex_unlock</a>(rtdm_mutex_t *mutex)
<a name="l01219"></a>01219 {
<a name="l01220"></a>01220         XENO_ASSERT(RTDM, !xnpod_asynch_p(), <span class="keywordflow">return</span>;);
<a name="l01221"></a>01221 
<a name="l01222"></a>01222         trace_mark(xn_rtdm, mutex_unlock, <span class="stringliteral">"mutex %p"</span>, mutex);
<a name="l01223"></a>01223 
<a name="l01224"></a>01224         <span class="keywordflow">if</span> (unlikely(<a class="code" href="group__synch.html#g1208abb6b3d0017a4e0c43b9baff8cfb" title="Give the resource ownership to the next waiting thread.">xnsynch_release</a>(&amp;mutex-&gt;synch_base) != NULL))
<a name="l01225"></a>01225                 <a class="code" href="group__pod.html#gcf5b53f0405351327b89b0cc4976b962" title="Rescheduling procedure entry point.">xnpod_schedule</a>();
<a name="l01226"></a>01226 }
<a name="l01227"></a>01227 
<a name="l01228"></a>01228 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__rtdmsync.html#gd13170b569d0a4cdb46072e1e3a45527" title="Destroy a mutex.">rtdm_mutex_destroy</a>(rtdm_mutex_t *mutex)
<a name="l01229"></a>01229 {
<a name="l01230"></a>01230         trace_mark(xn_rtdm, mutex_destroy, <span class="stringliteral">"mutex %p"</span>, mutex);
<a name="l01231"></a>01231 
<a name="l01232"></a>01232         __rtdm_synch_flush(&amp;mutex-&gt;synch_base, <a class="code" href="group__nucleus__info__flags.html#gb07d9dea73645dbba353dc2452c15b40" title="Pending on a removed resource.">XNRMID</a>);
<a name="l01233"></a>01233 }
<a name="l01234"></a>01234 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01235"></a>01235 
<a name="l01236"></a>01236 <span class="comment">/* --- utility functions --- */</span>
<a name="l01237"></a>01237 
<a name="l01238"></a>01238 <span class="preprocessor">#define rtdm_printk(format, ...)        printk(format, ##__VA_ARGS__)</span>
<a name="l01239"></a>01239 <span class="preprocessor"></span>
<a name="l01240"></a>01240 <span class="preprocessor">#ifndef DOXYGEN_CPP </span><span class="comment">/* Avoid static inline tags for RTDM in doxygen */</span>
<a name="l01241"></a>01241 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> *<a class="code" href="group__util.html#g34dfd5c060c67acc684eb4b4256cd4ba" title="Allocate memory block in real-time context.">rtdm_malloc</a>(<span class="keywordtype">size_t</span> size)
<a name="l01242"></a>01242 {
<a name="l01243"></a>01243         <span class="keywordflow">return</span> xnmalloc(size);
<a name="l01244"></a>01244 }
<a name="l01245"></a>01245 
<a name="l01246"></a>01246 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="group__util.html#g8d15b2cbb2fbf35b88362491af4e6a36" title="Release real-time memory block.">rtdm_free</a>(<span class="keywordtype">void</span> *ptr)
<a name="l01247"></a>01247 {
<a name="l01248"></a>01248         xnfree(ptr);
<a name="l01249"></a>01249 }
<a name="l01250"></a>01250 
<a name="l01251"></a>01251 <span class="preprocessor">#ifdef CONFIG_XENO_OPT_PERVASIVE</span>
<a name="l01252"></a>01252 <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__util.html#gdf5ddcdee106f1eaf4b93b2d633da441" title="Map a kernel memory range into the address space of the user.">rtdm_mmap_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01253"></a>01253                       <span class="keywordtype">void</span> *src_addr, <span class="keywordtype">size_t</span> len,
<a name="l01254"></a>01254                       <span class="keywordtype">int</span> prot, <span class="keywordtype">void</span> **pptr,
<a name="l01255"></a>01255                       <span class="keyword">struct</span> vm_operations_struct *vm_ops,
<a name="l01256"></a>01256                       <span class="keywordtype">void</span> *vm_private_data);
<a name="l01257"></a>01257 <span class="keywordtype">int</span> <a class="code" href="group__util.html#ga49b4fbd57a98a9ccda1f243b40bc519" title="Map an I/O memory range into the address space of the user.">rtdm_iomap_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01258"></a>01258                        phys_addr_t src_addr, <span class="keywordtype">size_t</span> len,
<a name="l01259"></a>01259                        <span class="keywordtype">int</span> prot, <span class="keywordtype">void</span> **pptr,
<a name="l01260"></a>01260                        <span class="keyword">struct</span> vm_operations_struct *vm_ops,
<a name="l01261"></a>01261                        <span class="keywordtype">void</span> *vm_private_data);
<a name="l01262"></a>01262 <span class="keywordtype">int</span> <a class="code" href="group__util.html#ga6a363aa6e2e017d3493a9c175755fa5" title="Unmap a user memory range.">rtdm_munmap</a>(rtdm_user_info_t *user_info, <span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> len);
<a name="l01263"></a>01263 
<a name="l01264"></a>01264 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g341dedfbeeb511848ba5f5a9535cc0a7" title="Check if read access to user-space memory block is safe.">rtdm_read_user_ok</a>(rtdm_user_info_t *user_info,
<a name="l01265"></a>01265                                     <span class="keyword">const</span> <span class="keywordtype">void</span> __user *ptr, <span class="keywordtype">size_t</span> size)
<a name="l01266"></a>01266 {
<a name="l01267"></a>01267         <span class="keywordflow">return</span> access_rok(ptr, size);
<a name="l01268"></a>01268 }
<a name="l01269"></a>01269 
<a name="l01270"></a>01270 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g6cecee5411773e81c83d04824864a62d" title="Check if read/write access to user-space memory block is safe.">rtdm_rw_user_ok</a>(rtdm_user_info_t *user_info,
<a name="l01271"></a>01271                                   <span class="keyword">const</span> <span class="keywordtype">void</span> __user *ptr, <span class="keywordtype">size_t</span> size)
<a name="l01272"></a>01272 {
<a name="l01273"></a>01273         <span class="keywordflow">return</span> access_wok(ptr, size);
<a name="l01274"></a>01274 }
<a name="l01275"></a>01275 
<a name="l01276"></a>01276 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g99abc944640745604b4a77204d2d0777" title="Copy user-space memory block to specified buffer.">rtdm_copy_from_user</a>(rtdm_user_info_t *user_info,
<a name="l01277"></a>01277                                       <span class="keywordtype">void</span> *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> __user *src,
<a name="l01278"></a>01278                                       <span class="keywordtype">size_t</span> size)
<a name="l01279"></a>01279 {
<a name="l01280"></a>01280         <span class="keywordflow">return</span> __xn_copy_from_user(dst, src, size) ? -EFAULT : 0;
<a name="l01281"></a>01281 }
<a name="l01282"></a>01282 
<a name="l01283"></a>01283 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g8e2ada3a5665c1366cd2c91f304bfa34" title="Check if read access to user-space memory block and copy it to specified buffer.">rtdm_safe_copy_from_user</a>(rtdm_user_info_t *user_info,
<a name="l01284"></a>01284                                            <span class="keywordtype">void</span> *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> __user *src,
<a name="l01285"></a>01285                                            <span class="keywordtype">size_t</span> size)
<a name="l01286"></a>01286 {
<a name="l01287"></a>01287         <span class="keywordflow">return</span> (!access_rok(src, size) ||
<a name="l01288"></a>01288                 __xn_copy_from_user(dst, src, size)) ? -EFAULT : 0;
<a name="l01289"></a>01289 }
<a name="l01290"></a>01290 
<a name="l01291"></a>01291 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#gb19ad9751ca1c56a53aafeb7ce8a6faf" title="Copy specified buffer to user-space memory block.">rtdm_copy_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01292"></a>01292                                     <span class="keywordtype">void</span> __user *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> *src,
<a name="l01293"></a>01293                                     <span class="keywordtype">size_t</span> size)
<a name="l01294"></a>01294 {
<a name="l01295"></a>01295         <span class="keywordflow">return</span> __xn_copy_to_user(dst, src, size) ? -EFAULT : 0;
<a name="l01296"></a>01296 }
<a name="l01297"></a>01297 
<a name="l01298"></a>01298 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g53f7bacd08774bfd26e13798cbfb21b8" title="Check if read/write access to user-space memory block is safe and copy specified...">rtdm_safe_copy_to_user</a>(rtdm_user_info_t *user_info,
<a name="l01299"></a>01299                                          <span class="keywordtype">void</span> __user *dst, <span class="keyword">const</span> <span class="keywordtype">void</span> *src,
<a name="l01300"></a>01300                                          <span class="keywordtype">size_t</span> size)
<a name="l01301"></a>01301 {
<a name="l01302"></a>01302         <span class="keywordflow">return</span> (!access_wok(dst, size) ||
<a name="l01303"></a>01303                 __xn_copy_to_user(dst, src, size)) ? -EFAULT : 0;
<a name="l01304"></a>01304 }
<a name="l01305"></a>01305 
<a name="l01306"></a>01306 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g9512ab3a85bea45a47bd033bad8b4828" title="Copy user-space string to specified buffer.">rtdm_strncpy_from_user</a>(rtdm_user_info_t *user_info,
<a name="l01307"></a>01307                                          <span class="keywordtype">char</span> *dst,
<a name="l01308"></a>01308                                          <span class="keyword">const</span> <span class="keywordtype">char</span> __user *src, <span class="keywordtype">size_t</span> count)
<a name="l01309"></a>01309 {
<a name="l01310"></a>01310         <span class="keywordflow">if</span> (unlikely(!access_rok(src, 1)))
<a name="l01311"></a>01311                 <span class="keywordflow">return</span> -EFAULT;
<a name="l01312"></a>01312         <span class="keywordflow">return</span> __xn_strncpy_from_user(dst, src, count);
<a name="l01313"></a>01313 }
<a name="l01314"></a>01314 <span class="preprocessor">#else </span><span class="comment">/* !CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l01315"></a>01315 <span class="comment">/* Define void user&lt;-&gt;kernel services that simply fail */</span>
<a name="l01316"></a>01316 <span class="preprocessor">#define rtdm_mmap_to_user(...)          ({ -ENOSYS; })</span>
<a name="l01317"></a>01317 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_munmap(...)                ({ -ENOSYS; })</span>
<a name="l01318"></a>01318 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_read_user_ok(...)          ({ 0; })</span>
<a name="l01319"></a>01319 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_rw_user_ok(...)            ({ 0; })</span>
<a name="l01320"></a>01320 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_copy_from_user(...)        ({ -ENOSYS; })</span>
<a name="l01321"></a>01321 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_safe_copy_from_user(...)   ({ -ENOSYS; })</span>
<a name="l01322"></a>01322 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_copy_to_user(...)          ({ -ENOSYS; })</span>
<a name="l01323"></a>01323 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_safe_copy_to_user(...)     ({ -ENOSYS; })</span>
<a name="l01324"></a>01324 <span class="preprocessor"></span><span class="preprocessor">#define rtdm_strncpy_from_user(...)     ({ -ENOSYS; })</span>
<a name="l01325"></a>01325 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* CONFIG_XENO_OPT_PERVASIVE */</span>
<a name="l01326"></a>01326 
<a name="l01327"></a>01327 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g8f9fcd0e274324096628dfede6fb10f2" title="Test if running in a real-time task.">rtdm_in_rt_context</a>(<span class="keywordtype">void</span>)
<a name="l01328"></a>01328 {
<a name="l01329"></a>01329         <span class="keywordflow">return</span> (rthal_current_domain != rthal_root_domain);
<a name="l01330"></a>01330 }
<a name="l01331"></a>01331 
<a name="l01332"></a>01332 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="group__util.html#g321a8c48467a6268fa201c16833524db" title="Test if the caller is capable of running in real-time context.">rtdm_rt_capable</a>(rtdm_user_info_t *user_info)
<a name="l01333"></a>01333 {
<a name="l01334"></a>01334         XENO_ASSERT(RTDM, !xnpod_asynch_p(), <span class="keywordflow">return</span> 0;);
<a name="l01335"></a>01335 
<a name="l01336"></a>01336         <span class="keywordflow">return</span> (user_info ? xnshadow_thread(user_info) != NULL
<a name="l01337"></a>01337                           : !xnpod_root_p());
<a name="l01338"></a>01338 }
<a name="l01339"></a>01339 
<a name="l01340"></a>01340 <span class="preprocessor">#endif </span><span class="comment">/* !DOXYGEN_CPP */</span>
<a name="l01341"></a>01341 
<a name="l01342"></a>01342 <span class="keywordtype">int</span> rtdm_exec_in_rt(<span class="keyword">struct</span> <a class="code" href="structrtdm__dev__context.html" title="Device context.">rtdm_dev_context</a> *context,
<a name="l01343"></a>01343                     rtdm_user_info_t *user_info, <span class="keywordtype">void</span> *arg,
<a name="l01344"></a>01344                     rtdm_rt_handler_t handler);
<a name="l01345"></a>01345 
<a name="l01346"></a>01346 <span class="preprocessor">#endif </span><span class="comment">/* _RTDM_DRIVER_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&nbsp;
<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>