]> git.llucax.com Git - software/druntime.git/blob - import/stdc/posix/sys/select.d
First commit of the D Runtime Project. This includes a fully functional runtime...
[software/druntime.git] / import / stdc / posix / sys / select.d
1 /**
2  * D header file for POSIX.
3  *
4  * Copyright: Public Domain
5  * License:   Public Domain
6  * Authors:   Sean Kelly
7  * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8  */
9 module stdc.posix.sys.select;
10
11 private import stdc.posix.config;
12 public import stdc.time;            // for timespec
13 public import stdc.posix.sys.time;  // for timeval
14 public import stdc.posix.sys.types; // for time_t
15 public import stdc.posix.signal;    // for sigset_t
16
17 extern (C):
18
19 //
20 // Required
21 //
22 /*
23 NOTE: This module requires timeval from stdc.posix.sys.time, but timeval
24       is supposedly an XOpen extension.  As a result, this header will not
25       compile on platforms that are not XSI-compliant.  This must be resolved
26       on a per-platform basis.
27
28 fd_set
29
30 void FD_CLR(int fd, fd_set* fdset);
31 int FD_ISSET(int fd, fd_set* fdset);
32 void FD_SET(int fd, fd_set* fdset);
33 void FD_ZERO(fd_set* fdset);
34
35 FD_SETSIZE
36
37 int  pselect(int, fd_set*, fd_set*, fd_set*, in timespec*, in sigset_t*);
38 int  select(int, fd_set*, fd_set*, fd_set*, timeval*);
39 */
40
41 version( linux )
42 {
43     private
44     {
45         alias c_long __fd_mask;
46         const __NFDBITS = 8 * __fd_mask.sizeof;
47
48         extern (D) int __FDELT( int d )
49         {
50             return d / __NFDBITS;
51         }
52
53         extern (D) int __FDMASK( int d )
54         {
55             return cast(__fd_mask) 1 << ( d % __NFDBITS );
56         }
57     }
58
59     const FD_SETSIZE = 1024;
60
61     struct fd_set
62     {
63         __fd_mask[FD_SETSIZE / __NFDBITS] fds_bits;
64     }
65
66     extern (D) void FD_CLR( int fd, fd_set* fdset )
67     {
68         fdset.fds_bits[__FDELT( fd )] &= ~__FDMASK( fd );
69     }
70
71     extern (D) int  FD_ISSET( int fd, fd_set* fdset )
72     {
73         return fdset.fds_bits[__FDELT( fd )] & __FDMASK( fd );
74     }
75
76     extern (D) void FD_SET( int fd, fd_set* fdset )
77     {
78         fdset.fds_bits[__FDELT( fd )] |= __FDMASK( fd );
79     }
80
81     extern (D) void FD_ZERO( fd_set* fdset )
82     {
83         fdset.fds_bits[0 .. $] = 0;
84     }
85
86     /+
87      + GNU ASM Implementation
88      +
89     # define __FD_ZERO(fdsp) \
90       do {                                        \
91         int __d0, __d1;                               \
92         __asm__ __volatile__ ("cld; rep; stosl"                   \
93                   : "=c" (__d0), "=D" (__d1)                  \
94                   : "a" (0), "0" (sizeof (fd_set)             \
95                           / sizeof (__fd_mask)),          \
96                     "1" (&__FDS_BITS (fdsp)[0])               \
97                   : "memory");                        \
98       } while (0)
99
100     # define __FD_SET(fd, fdsp) \
101       __asm__ __volatile__ ("btsl %1,%0"                          \
102                 : "=m" (__FDS_BITS (fdsp)[__FDELT (fd)])          \
103                 : "r" (((int) (fd)) % __NFDBITS)              \
104                 : "cc","memory")
105     # define __FD_CLR(fd, fdsp) \
106       __asm__ __volatile__ ("btrl %1,%0"                          \
107                 : "=m" (__FDS_BITS (fdsp)[__FDELT (fd)])          \
108                 : "r" (((int) (fd)) % __NFDBITS)              \
109                 : "cc","memory")
110     # define __FD_ISSET(fd, fdsp) \
111       (__extension__                                  \
112        ({register char __result;                              \
113          __asm__ __volatile__ ("btl %1,%2 ; setcb %b0"                \
114                    : "=q" (__result)                      \
115                    : "r" (((int) (fd)) % __NFDBITS),              \
116                      "m" (__FDS_BITS (fdsp)[__FDELT (fd)])        \
117                    : "cc");                       \
118          __result; }))
119      +/
120
121     int pselect(int, fd_set*, fd_set*, fd_set*, in timespec*, in sigset_t*);
122     int select(int, fd_set*, fd_set*, fd_set*, timeval*);
123 }
124 else version( darwin )
125 {
126     private
127     {
128         const uint __DARWIN_NBBY = 8;                               /* bits in a byte */
129         const uint __DARWIN_NFDBITS = (int.sizeof * __DARWIN_NBBY); /* bits per mask */
130     }
131
132     const FD_SETSIZE = 1024;
133
134     struct fd_set
135     {
136         int fds_bits[(((FD_SETSIZE) + ((__DARWIN_NFDBITS) - 1)) / (__DARWIN_NFDBITS))];
137     }
138 }
139 else version( freebsd )
140 {
141     private
142     {
143         const uint FD_SETSIZE = 1024;
144         const uint _NFDBITS = c_ulong.sizeof * 8;
145     }
146     struct fd_set
147     {
148         c_ulong fds_bits[((FD_SETSIZE + (_NFDBITS - 1)) / _NFDBITS)];
149     }
150 }