1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | /* This Source Code Form is subject to the terms of the Mozilla Public |
3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | |
6 | /* |
7 | ** prshm.h -- NSPR Shared Memory |
8 | ** |
9 | ** NSPR Named Shared Memory API provides a cross-platform named |
10 | ** shared-memory interface. NSPR Named Shared Memory is modeled on |
11 | ** similar constructs in Unix and Windows operating systems. Shared |
12 | ** memory allows multiple processes to access one or more common shared |
13 | ** memory regions, using it as an inter-process communication channel. |
14 | ** |
15 | ** Notes on Platform Independence: |
16 | ** NSPR Named Shared Memory is built on the native services offered |
17 | ** by most platforms. The NSPR Named Shared Memory API tries to |
18 | ** provide a least common denominator interface so that it works |
19 | ** across all supported platforms. To ensure that it works everywhere, |
20 | ** some platform considerations must be accomodated and the protocol |
21 | ** for using NSPR Shared Memory API must be observed. |
22 | ** |
23 | ** Protocol: |
24 | ** Multiple shared memories can be created using NSPR's Shared Memory |
25 | ** feature. For each named shared memory, as defined by the name |
26 | ** given in the PR_OpenSharedMemory() call, a protocol for using the |
27 | ** shared memory API is required to ensure desired behavior. Failing |
28 | ** to follow the protocol may yield unpredictable results. |
29 | ** |
30 | ** PR_OpenSharedMemory() will create the shared memory segment, if it |
31 | ** does not already exist, or open a connection that the existing |
32 | ** shared memory segment if it already exists. |
33 | ** |
34 | ** PR_AttachSharedMemory() should be called following |
35 | ** PR_OpenSharedMemory() to map the memory segment to an address in |
36 | ** the application's address space. |
37 | ** |
38 | ** PR_AttachSharedMemory() may be called to re-map a shared memory |
39 | ** segment after detaching the same PRSharedMemory object. Be |
40 | ** sure to detach it when done. |
41 | ** |
42 | ** PR_DetachSharedMemory() should be called to un-map the shared |
43 | ** memory segment from the application's address space. |
44 | ** |
45 | ** PR_CloseSharedMemory() should be called when no further use of the |
46 | ** PRSharedMemory object is required within a process. Following a |
47 | ** call to PR_CloseSharedMemory() the PRSharedMemory object is |
48 | ** invalid and cannot be reused. |
49 | ** |
50 | ** PR_DeleteSharedMemory() should be called before process |
51 | ** termination. After calling PR_DeleteSharedMemory() any further use |
52 | ** of the shared memory associated with the name may cause |
53 | ** unpredictable results. |
54 | ** |
55 | ** Files: |
56 | ** The name passed to PR_OpenSharedMemory() should be a valid filename |
57 | ** for a unix platform. PR_OpenSharedMemory() creates file using the |
58 | ** name passed in. Some platforms may mangle the name before creating |
59 | ** the file and the shared memory. |
60 | ** |
61 | ** The unix implementation may use SysV IPC shared memory, Posix |
62 | ** shared memory, or memory mapped files; the filename may used to |
63 | ** define the namespace. On Windows, the name is significant, but |
64 | ** there is no file associated with name. |
65 | ** |
66 | ** No assumptions about the persistence of data in the named file |
67 | ** should be made. Depending on platform, the shared memory may be |
68 | ** mapped onto system paging space and be discarded at process |
69 | ** termination. |
70 | ** |
71 | ** All names provided to PR_OpenSharedMemory() should be valid |
72 | ** filename syntax or name syntax for shared memory for the target |
73 | ** platform. Referenced directories should have permissions |
74 | ** appropriate for writing. |
75 | ** |
76 | ** Limits: |
77 | ** Different platforms have limits on both the number and size of |
78 | ** shared memory resources. The default system limits on some |
79 | ** platforms may be smaller than your requirements. These limits may |
80 | ** be adjusted on some platforms either via boot-time options or by |
81 | ** setting the size of the system paging space to accomodate more |
82 | ** and/or larger shared memory segment(s). |
83 | ** |
84 | ** Security: |
85 | ** On unix platforms, depending on implementation, contents of the |
86 | ** backing store for the shared memory can be exposed via the file |
87 | ** system. Set permissions and or access controls at create and attach |
88 | ** time to ensure you get the desired security. |
89 | ** |
90 | ** On windows platforms, no special security measures are provided. |
91 | ** |
92 | ** Example: |
93 | ** The test case pr/tests/nameshm1.c provides an example of use as |
94 | ** well as testing the operation of NSPR's Named Shared Memory. |
95 | ** |
96 | ** lth. 18-Aug-1999. |
97 | */ |
98 | |
99 | #ifndef prshm_h___ |
100 | #define prshm_h___ |
101 | |
102 | #include "prtypes.h" |
103 | #include "prio.h" |
104 | |
105 | PR_BEGIN_EXTERN_C |
106 | |
107 | /* |
108 | ** Declare opaque type PRSharedMemory. |
109 | */ |
110 | typedef struct PRSharedMemory PRSharedMemory; |
111 | |
112 | /* |
113 | ** FUNCTION: PR_OpenSharedMemory() |
114 | ** |
115 | ** DESCRIPTION: |
116 | ** PR_OpenSharedMemory() creates a new shared-memory segment or |
117 | ** associates a previously created memory segment with name. |
118 | ** |
119 | ** When parameter create is (PR_SHM_EXCL | PR_SHM_CREATE) and the |
120 | ** shared memory already exists, the function returns NULL with the |
121 | ** error set to PR_FILE_EXISTS_ERROR. |
122 | ** |
123 | ** When parameter create is PR_SHM_CREATE and the shared memory |
124 | ** already exists, a handle to that memory segment is returned. If |
125 | ** the segment does not exist, it is created and a pointer to the |
126 | ** related PRSharedMemory structure is returned. |
127 | ** |
128 | ** When parameter create is 0, and the shared memory exists, a |
129 | ** pointer to a PRSharedMemory is returned. If the shared memory does |
130 | ** not exist, NULL is returned with the error set to |
131 | ** PR_FILE_NOT_FOUND_ERROR. |
132 | ** |
133 | ** INPUTS: |
134 | ** name -- the name the shared-memory segment is known as. |
135 | ** size -- the size of the shared memory segment. |
136 | ** flags -- Options for creating the shared memory |
137 | ** mode -- Same as is passed to PR_Open() |
138 | ** |
139 | ** OUTPUTS: |
140 | ** The shared memory is allocated. |
141 | ** |
142 | ** RETURNS: Pointer to opaque structure PRSharedMemory or NULL. |
143 | ** NULL is returned on error. The reason for the error can be |
144 | ** retrieved via PR_GetError() and PR_GetOSError(); |
145 | ** |
146 | */ |
147 | NSPR_API( PRSharedMemory * ) |
148 | PR_OpenSharedMemory( |
149 | const char *name, |
150 | PRSize size, |
151 | PRIntn flags, |
152 | PRIntn mode |
153 | ); |
154 | /* Define values for PR_OpenShareMemory(...,create) */ |
155 | #define PR_SHM_CREATE 0x1 /* create if not exist */ |
156 | #define PR_SHM_EXCL 0x2 /* fail if already exists */ |
157 | |
158 | /* |
159 | ** FUNCTION: PR_AttachSharedMemory() |
160 | ** |
161 | ** DESCRIPTION: |
162 | ** PR_AttachSharedMemory() maps the shared-memory described by |
163 | ** shm to the current process. |
164 | ** |
165 | ** INPUTS: |
166 | ** shm -- The handle returned from PR_OpenSharedMemory(). |
167 | ** flags -- options for mapping the shared memory. |
168 | ** PR_SHM_READONLY causes the memory to be attached |
169 | ** read-only. |
170 | ** |
171 | ** OUTPUTS: |
172 | ** On success, the shared memory segment represented by shm is mapped |
173 | ** into the process' address space. |
174 | ** |
175 | ** RETURNS: Address where shared memory is mapped, or NULL. |
176 | ** NULL is returned on error. The reason for the error can be |
177 | ** retrieved via PR_GetError() and PR_GetOSError(); |
178 | ** |
179 | ** |
180 | */ |
181 | NSPR_API( void * ) |
182 | PR_AttachSharedMemory( |
183 | PRSharedMemory *shm, |
184 | PRIntn flags |
185 | ); |
186 | /* Define values for PR_AttachSharedMemory(...,flags) */ |
187 | #define PR_SHM_READONLY 0x01 |
188 | |
189 | /* |
190 | ** FUNCTION: PR_DetachSharedMemory() |
191 | ** |
192 | ** DESCRIPTION: |
193 | ** PR_DetachSharedMemory() detaches the shared-memory described |
194 | ** by shm. |
195 | ** |
196 | ** INPUTS: |
197 | ** shm -- The handle returned from PR_OpenSharedMemory(). |
198 | ** addr -- The address at which the memory was attached. |
199 | ** |
200 | ** OUTPUTS: |
201 | ** The shared memory mapped to an address via a previous call to |
202 | ** PR_AttachSharedMemory() is unmapped. |
203 | ** |
204 | ** RETURNS: PRStatus |
205 | ** |
206 | */ |
207 | NSPR_API( PRStatus ) |
208 | PR_DetachSharedMemory( |
209 | PRSharedMemory *shm, |
210 | void *addr |
211 | ); |
212 | |
213 | /* |
214 | ** FUNCTION: PR_CloseSharedMemory() |
215 | ** |
216 | ** DESCRIPTION: |
217 | ** PR_CloseSharedMemory() closes the shared-memory described by |
218 | ** shm. |
219 | ** |
220 | ** INPUTS: |
221 | ** shm -- The handle returned from PR_OpenSharedMemory(). |
222 | ** |
223 | ** OUTPUTS: |
224 | ** the shared memory represented by shm is closed |
225 | ** |
226 | ** RETURNS: PRStatus |
227 | ** |
228 | */ |
229 | NSPR_API( PRStatus ) |
230 | PR_CloseSharedMemory( |
231 | PRSharedMemory *shm |
232 | ); |
233 | |
234 | /* |
235 | ** FUNCTION: PR_DeleteSharedMemory() |
236 | ** |
237 | ** DESCRIPTION: |
238 | ** The shared memory resource represented by name is released. |
239 | ** |
240 | ** INPUTS: |
241 | ** name -- the name the shared-memory segment |
242 | ** |
243 | ** OUTPUTS: |
244 | ** depending on platform, resources may be returned to the underlying |
245 | ** operating system. |
246 | ** |
247 | ** RETURNS: PRStatus |
248 | ** |
249 | */ |
250 | NSPR_API( PRStatus ) |
251 | PR_DeleteSharedMemory( |
252 | const char *name |
253 | ); |
254 | |
255 | PR_END_EXTERN_C |
256 | |
257 | #endif /* prshm_h___ */ |
258 | |