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 tango.stdc.posix.sys.shm;
10 
11 private import tango.stdc.posix.config;
12 public import tango.stdc.posix.sys.types; // for pid_t, time_t, key_t, size_t
13 public import tango.stdc.posix.sys.ipc;
14 private import tango.core.Octal;
15 extern (C):
16 
17 //
18 // XOpen (XSI)
19 //
20 /*
21 SHM_RDONLY
22 SHM_RND
23 
24 SHMLBA
25 
26 shmatt_t
27 
28 struct shmid_ds
29 {
30     ipc_perm    shm_perm;
31     size_t      shm_segsz;
32     pid_t       shm_lpid;
33     pid_t       shm_cpid;
34     shmatt_t    shm_nattch;
35     time_t      shm_atime;
36     time_t      shm_dtime;
37     time_t      shm_ctime;
38 }
39 
40 void* shmat(int, in void*, int);
41 int   shmctl(int, int, shmid_ds*);
42 int   shmdt(in void*);
43 int   shmget(key_t, size_t, int);
44 */
45 
46 version( linux )
47 {
48     const SHM_RDONLY    = octal!10000;
49     const SHM_RND       = octal!20000;
50 
51     int   __getpagesize();
52     alias __getpagesize SHMLBA;
53 
54     alias c_ulong   shmatt_t;
55 
56     struct shmid_ds
57     {
58         ipc_perm    shm_perm;
59         size_t      shm_segsz;
60         time_t      shm_atime;
61         c_ulong     __unused1;
62         time_t      shm_dtime;
63         c_ulong     __unused2;
64         time_t      shm_ctime;
65         c_ulong     __unused3;
66         pid_t       shm_cpid;
67         pid_t       shm_lpid;
68         shmatt_t    shm_nattch;
69         c_ulong     __unused4;
70         c_ulong     __unused5;
71     }
72 
73     void* shmat(int, in void*, int);
74     int   shmctl(int, int, shmid_ds*);
75     int   shmdt(in void*);
76     int   shmget(key_t, size_t, int);
77 }
78 else version( FreeBSD )
79 {
80     const SHM_RDONLY    = octal!10000;
81     const SHM_RND       = octal!20000;
82 	const SHMLBA		= 1 << 12; // PAGE_SIZE = (1<<PAGE_SHIFT)
83 
84     alias c_ulong   shmatt_t;
85 
86     struct shmid_ds
87     {
88         ipc_perm    shm_perm;
89         size_t      shm_segsz;
90         time_t      shm_atime;
91         c_ulong     __unused1;
92         time_t      shm_dtime;
93         c_ulong     __unused2;
94         time_t      shm_ctime;
95         c_ulong     __unused3;
96         pid_t       shm_cpid;
97         pid_t       shm_lpid;
98         shmatt_t    shm_nattch;
99         c_ulong     __unused4;
100         c_ulong     __unused5;
101     }
102 
103     void* shmat(int, in void*, int);
104     int   shmctl(int, int, shmid_ds*);
105     int   shmdt(in void*);
106     int   shmget(key_t, size_t, int);
107 }
108 else version( darwin )
109 {
110 
111 }
112 else version( solaris )
113 {
114 	private const _SC_PAGESIZE = 11; // from <sys/unistd.h>
115 	private c_long _sysconf(int);
116 	
117     const SHM_RDONLY    = octal!10000;
118     const SHM_RND       = octal!20000;
119 	const SHM_SHARE_MMU = octal!40000;
120 	const SHM_PAGEABLE	= octal!100000; /* pageable ISM */
121 	extern(D) c_long SHMLBA(){ return _sysconf(_SC_PAGESIZE); };
122 	
123 	alias c_ulong   shmatt_t;
124 	
125 	struct shmid_ds
126 	{
127 		ipc_perm	shm_perm;	/* operation permission struct */
128 		size_t		shm_segsz;	/* size of segment in bytes */
129 		void*		shm_amp;	/* segment anon_map pointer */
130 		ushort		shm_lkcnt;	/* number of times it is being locked */
131 		pid_t		shm_lpid;	/* pid of last shmop */
132 		pid_t		shm_cpid;	/* pid of creator */
133 		shmatt_t	shm_nattch;	/* number of attaches */
134 		ulong		shm_cnattch;/* number of ISM attaches */
135 	  version(X86_64) {
136 		time_t		shm_atime;	/* last shmat time */
137 		time_t		shm_dtime;	/* last shmdt time */
138 		time_t		shm_ctime;	/* last change time */
139 		long[4]		shm_pad4;	/* reserve area */
140 	  } else {
141 		time_t		shm_atime;	/* last shmat time */
142 		int			shm_pad1;	/* reserved for time_t expansion */
143 		time_t		shm_dtime;	/* last shmdt time */
144 		int			shm_pad2;	/* reserved for time_t expansion */
145 		time_t		shm_ctime;	/* last change time */
146 		int			shm_pad3;	/* reserved for time_t expansion */
147 		int[4]		shm_pad4;	/* reserve area  */
148 	  }
149 	}
150 	
151     void* shmat(int, in void*, int);
152     int   shmctl(int, int, shmid_ds*);
153     int   shmdt(in void*);
154     int   shmget(key_t, size_t, int);
155 }