3 // $Id: OS_NS_sys_mman.inl 82171 2008-06-25 13:32:01Z jtc $
5 #include "ace/OS_NS_fcntl.h"
6 #include "ace/OS_NS_unistd.h"
7 #include "ace/OS_NS_stdio.h"
8 #include "ace/OS_NS_macros.h"
9 #include "ace/OS_NS_errno.h"
11 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
13 #if defined (ACE_HAS_VOIDPTR_MMAP)
14 // Needed for some odd OS's (e.g., SGI).
15 typedef void *ACE_MMAP_TYPE;
17 typedef char *ACE_MMAP_TYPE;
18 #endif /* ACE_HAS_VOIDPTR_MMAP */
21 ACE_OS::madvise (caddr_t addr, size_t len, int map_advice)
23 ACE_OS_TRACE ("ACE_OS::madvise");
24 #if !defined (ACE_LACKS_MADVISE)
25 ACE_OSCALL_RETURN (::madvise (addr, len, map_advice), int, -1);
27 ACE_UNUSED_ARG (addr);
29 ACE_UNUSED_ARG (map_advice);
30 ACE_NOTSUP_RETURN (-1);
31 #endif /* ACE_WIN32 */
35 ACE_OS::mmap (void *addr,
39 ACE_HANDLE file_handle,
41 ACE_HANDLE *file_mapping,
42 LPSECURITY_ATTRIBUTES sa,
43 const ACE_TCHAR *file_mapping_name)
45 ACE_OS_TRACE ("ACE_OS::mmap");
46 #if !defined (ACE_WIN32) || defined (ACE_HAS_PHARLAP)
47 ACE_UNUSED_ARG (file_mapping_name);
48 #endif /* !defined (ACE_WIN32) || defined (ACE_HAS_PHARLAP) */
50 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
52 # if defined(ACE_HAS_WINCE)
53 ACE_UNUSED_ARG (addr);
54 if (ACE_BIT_ENABLED (flags, MAP_FIXED)) // not supported
60 if (!ACE_BIT_ENABLED (flags, MAP_FIXED))
62 else if (addr == 0) // can not map to address 0
70 ACE_HANDLE local_handle = ACE_INVALID_HANDLE;
72 // Ensure that file_mapping is non-zero.
73 if (file_mapping == 0)
74 file_mapping = &local_handle;
76 if (ACE_BIT_ENABLED (flags, MAP_PRIVATE))
78 # if !defined(ACE_HAS_WINCE)
79 prot = PAGE_WRITECOPY;
80 # endif // ACE_HAS_WINCE
81 nt_flags = FILE_MAP_COPY;
83 else if (ACE_BIT_ENABLED (flags, MAP_SHARED))
85 if (ACE_BIT_ENABLED (prot, PAGE_READONLY))
86 nt_flags = FILE_MAP_READ;
87 if (ACE_BIT_ENABLED (prot, PAGE_READWRITE))
88 nt_flags = FILE_MAP_WRITE;
91 // Only create a new handle if we didn't have a valid one passed in.
92 if (*file_mapping == ACE_INVALID_HANDLE)
94 SECURITY_ATTRIBUTES sa_buffer;
95 SECURITY_DESCRIPTOR sd_buffer;
96 const LPSECURITY_ATTRIBUTES attr =
97 ACE_OS::default_win32_security_attributes_r (sa,
101 *file_mapping = ACE_TEXT_CreateFileMapping (file_handle,
109 if (*file_mapping == 0)
110 ACE_FAIL_RETURN (MAP_FAILED);
112 # if defined (ACE_OS_EXTRA_MMAP_FLAGS)
113 nt_flags |= ACE_OS_EXTRA_MMAP_FLAGS;
114 # endif /* ACE_OS_EXTRA_MMAP_FLAGS */
116 DWORD low_off = ACE_LOW_PART (off);
117 DWORD high_off = ACE_HIGH_PART (off);
119 # if !defined (ACE_HAS_WINCE)
120 void *addr_mapping = ::MapViewOfFileEx (*file_mapping,
127 void *addr_mapping = ::MapViewOfFile (*file_mapping,
132 # endif /* ! ACE_HAS_WINCE */
134 // Only close this down if we used the temporary.
135 if (file_mapping == &local_handle)
136 ::CloseHandle (*file_mapping);
138 if (addr_mapping == 0)
139 ACE_FAIL_RETURN (MAP_FAILED);
142 #elif !defined (ACE_LACKS_MMAP)
145 # if defined (ACE_OS_EXTRA_MMAP_FLAGS)
146 flags |= ACE_OS_EXTRA_MMAP_FLAGS;
147 # endif /* ACE_OS_EXTRA_MMAP_FLAGS */
148 ACE_UNUSED_ARG (file_mapping);
149 # if defined (ACE_OPENVMS)
150 //FUZZ: disable check_for_lack_ACE_OS
151 ::fsync(file_handle);
152 //FUZZ: enable check_for_lack_ACE_OS
154 //FUZZ: disable check_for_lack_ACE_OS
155 ACE_OSCALL_RETURN ((void *) ::mmap ((ACE_MMAP_TYPE) addr,
162 //FUZZ: enable check_for_lack_ACE_OS
164 ACE_UNUSED_ARG (addr);
165 ACE_UNUSED_ARG (len);
166 ACE_UNUSED_ARG (prot);
167 ACE_UNUSED_ARG (flags);
168 ACE_UNUSED_ARG (file_handle);
169 ACE_UNUSED_ARG (off);
170 ACE_UNUSED_ARG (file_mapping);
172 ACE_NOTSUP_RETURN (MAP_FAILED);
173 #endif /* ACE_WIN32 && !ACE_HAS_PHARLAP */
176 // Implements simple read/write control for pages. Affects a page if
177 // part of the page is referenced. Currently PROT_READ, PROT_WRITE,
178 // and PROT_RDWR has been mapped in OS.h. This needn't have anything
179 // to do with a mmap region.
182 ACE_OS::mprotect (void *addr, size_t len, int prot)
184 ACE_OS_TRACE ("ACE_OS::mprotect");
185 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
186 DWORD dummy; // Sigh!
187 return ::VirtualProtect(addr, len, prot, &dummy) ? 0 : -1;
188 #elif !defined (ACE_LACKS_MPROTECT)
189 ACE_OSCALL_RETURN (::mprotect ((ACE_MMAP_TYPE) addr, len, prot), int, -1);
191 ACE_UNUSED_ARG (addr);
192 ACE_UNUSED_ARG (len);
193 ACE_UNUSED_ARG (prot);
194 ACE_NOTSUP_RETURN (-1);
195 #endif /* ACE_WIN32 && !ACE_HAS_PHARLAP */
199 ACE_OS::msync (void *addr, size_t len, int sync)
201 ACE_OS_TRACE ("ACE_OS::msync");
202 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
203 ACE_UNUSED_ARG (sync);
205 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::FlushViewOfFile (addr, len), ace_result_), int, -1);
206 #elif !defined (ACE_LACKS_MSYNC)
207 ACE_OSCALL_RETURN (::msync ((ACE_MMAP_TYPE) addr, len, sync), int, -1);
209 ACE_UNUSED_ARG (addr);
210 ACE_UNUSED_ARG (len);
211 ACE_UNUSED_ARG (sync);
212 ACE_NOTSUP_RETURN (-1);
213 #endif /* ACE_WIN32 && !ACE_HAS_PHARLAP */
217 ACE_OS::munmap (void *addr, size_t len)
219 ACE_OS_TRACE ("ACE_OS::munmap");
220 #if defined (ACE_WIN32)
221 ACE_UNUSED_ARG (len);
223 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::UnmapViewOfFile (addr), ace_result_), int, -1);
224 #elif !defined (ACE_LACKS_MMAP)
225 ACE_OSCALL_RETURN (::munmap ((ACE_MMAP_TYPE) addr, len), int, -1);
227 ACE_UNUSED_ARG (addr);
228 ACE_UNUSED_ARG (len);
229 ACE_NOTSUP_RETURN (-1);
230 #endif /* ACE_WIN32 */
233 ACE_INLINE ACE_HANDLE
234 ACE_OS::shm_open (const ACE_TCHAR *filename,
237 LPSECURITY_ATTRIBUTES sa)
239 ACE_OS_TRACE ("ACE_OS::shm_open");
240 #if defined (ACE_HAS_SHM_OPEN)
242 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x650)
243 // With VxWorks the file should just start with / and no other
244 // slashes, so replace all other / by _
245 ACE_TCHAR buf [MAXPATHLEN + 1];
246 ACE_OS::sprintf (buf,
249 for (size_t i = 1; i < MAXPATHLEN + 1; i++)
258 ACE_OSCALL_RETURN (::shm_open (ACE_TEXT_ALWAYS_CHAR(filename), mode, perms), ACE_HANDLE, ACE_INVALID_HANDLE);
259 #elif defined (ACE_OPENVMS)
260 //FUZZ: disable check_for_lack_ACE_OS
261 ACE_OSCALL_RETURN (::open (filename, mode, perms, ACE_TEXT("shr=get,put,upd")), ACE_HANDLE, ACE_INVALID_HANDLE);
262 //FUZZ: enable check_for_lack_ACE_OS
263 #else /* ! ACE_HAS_SHM_OPEN */
265 return ACE_OS::open (filename, mode, perms, sa);
266 #endif /* ACE_HAS_SHM_OPEN */
270 ACE_OS::shm_unlink (const ACE_TCHAR *path)
272 ACE_OS_TRACE ("ACE_OS::shm_unlink");
273 #if defined (ACE_HAS_SHM_OPEN)
274 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x650)
275 // With VxWorks the file should just start with / and no other
276 // slashes, so replace all other / by _
277 ACE_TCHAR buf [MAXPATHLEN + 1];
278 ACE_OS::sprintf (buf,
281 for (size_t i = 1; i < MAXPATHLEN + 1; i++)
290 ACE_OSCALL_RETURN (::shm_unlink (ACE_TEXT_ALWAYS_CHAR(path)), int, -1);
291 #else /* ! ACE_HAS_SHM_OPEN */
292 // Just use ::unlink.
293 return ACE_OS::unlink (path);
294 #endif /* ACE_HAS_SHM_OPEN */
297 ACE_END_VERSIONED_NAMESPACE_DECL