OS_NS_sys_mman.inl

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // $Id: OS_NS_sys_mman.inl 80826 2008-03-04 14:51:23Z wotte $
00004 
00005 #include "ace/OS_NS_fcntl.h"
00006 #include "ace/OS_NS_unistd.h"
00007 #include "ace/OS_NS_stdio.h"
00008 #include "ace/OS_NS_macros.h"
00009 #include "ace/OS_NS_errno.h"
00010 
00011 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00012 
00013 #if defined (ACE_HAS_VOIDPTR_MMAP)
00014 // Needed for some odd OS's (e.g., SGI).
00015 typedef void *ACE_MMAP_TYPE;
00016 #else
00017 typedef char *ACE_MMAP_TYPE;
00018 #endif /* ACE_HAS_VOIDPTR_MMAP */
00019 
00020 ACE_INLINE int
00021 ACE_OS::madvise (caddr_t addr, size_t len, int map_advice)
00022 {
00023   ACE_OS_TRACE ("ACE_OS::madvise");
00024 #if !defined (ACE_LACKS_MADVISE)
00025   ACE_OSCALL_RETURN (::madvise (addr, len, map_advice), int, -1);
00026 #else
00027   ACE_UNUSED_ARG (addr);
00028   ACE_UNUSED_ARG (len);
00029   ACE_UNUSED_ARG (map_advice);
00030   ACE_NOTSUP_RETURN (-1);
00031 #endif /* ACE_WIN32 */
00032 }
00033 
00034 ACE_INLINE void *
00035 ACE_OS::mmap (void *addr,
00036               size_t len,
00037               int prot,
00038               int flags,
00039               ACE_HANDLE file_handle,
00040               ACE_OFF_T off,
00041               ACE_HANDLE *file_mapping,
00042               LPSECURITY_ATTRIBUTES sa,
00043               const ACE_TCHAR *file_mapping_name)
00044 {
00045   ACE_OS_TRACE ("ACE_OS::mmap");
00046 #if !defined (ACE_WIN32) || defined (ACE_HAS_PHARLAP)
00047   ACE_UNUSED_ARG (file_mapping_name);
00048 #endif /* !defined (ACE_WIN32) || defined (ACE_HAS_PHARLAP) */
00049 
00050 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
00051 
00052 #  if defined(ACE_HAS_WINCE)
00053   ACE_UNUSED_ARG (addr);
00054   if (ACE_BIT_ENABLED (flags, MAP_FIXED))     // not supported
00055   {
00056     errno = EINVAL;
00057     return MAP_FAILED;
00058   }
00059 #  else
00060   if (!ACE_BIT_ENABLED (flags, MAP_FIXED))
00061     addr = 0;
00062   else if (addr == 0)   // can not map to address 0
00063   {
00064     errno = EINVAL;
00065     return MAP_FAILED;
00066   }
00067 #  endif
00068 
00069   int nt_flags = 0;
00070   ACE_HANDLE local_handle = ACE_INVALID_HANDLE;
00071 
00072   // Ensure that file_mapping is non-zero.
00073   if (file_mapping == 0)
00074     file_mapping = &local_handle;
00075 
00076   if (ACE_BIT_ENABLED (flags, MAP_PRIVATE))
00077     {
00078 #  if !defined(ACE_HAS_WINCE)
00079       prot = PAGE_WRITECOPY;
00080 #  endif  // ACE_HAS_WINCE
00081       nt_flags = FILE_MAP_COPY;
00082     }
00083   else if (ACE_BIT_ENABLED (flags, MAP_SHARED))
00084     {
00085       if (ACE_BIT_ENABLED (prot, PAGE_READONLY))
00086         nt_flags = FILE_MAP_READ;
00087       if (ACE_BIT_ENABLED (prot, PAGE_READWRITE))
00088         nt_flags = FILE_MAP_WRITE;
00089     }
00090 
00091   // Only create a new handle if we didn't have a valid one passed in.
00092   if (*file_mapping == ACE_INVALID_HANDLE)
00093     {
00094       SECURITY_ATTRIBUTES sa_buffer;
00095       SECURITY_DESCRIPTOR sd_buffer;
00096       const LPSECURITY_ATTRIBUTES attr =
00097         ACE_OS::default_win32_security_attributes_r (sa,
00098                                                      &sa_buffer,
00099                                                      &sd_buffer);
00100 
00101       *file_mapping = ACE_TEXT_CreateFileMapping (file_handle,
00102                                                   attr,
00103                                                   prot,
00104                                                   0,
00105                                                   0,
00106                                                   file_mapping_name);
00107     }
00108 
00109   if (*file_mapping == 0)
00110     ACE_FAIL_RETURN (MAP_FAILED);
00111 
00112 #  if defined (ACE_OS_EXTRA_MMAP_FLAGS)
00113   nt_flags |= ACE_OS_EXTRA_MMAP_FLAGS;
00114 #  endif /* ACE_OS_EXTRA_MMAP_FLAGS */
00115 
00116   DWORD low_off  = ACE_LOW_PART (off);
00117   DWORD high_off = ACE_HIGH_PART (off);
00118 
00119 #  if !defined (ACE_HAS_WINCE)
00120   void *addr_mapping = ::MapViewOfFileEx (*file_mapping,
00121                                           nt_flags,
00122                                           high_off,
00123                                           low_off,
00124                                           len,
00125                                           addr);
00126 #  else
00127   void *addr_mapping = ::MapViewOfFile (*file_mapping,
00128                                         nt_flags,
00129                                         high_off,
00130                                         low_off,
00131                                         len);
00132 #  endif /* ! ACE_HAS_WINCE */
00133 
00134   // Only close this down if we used the temporary.
00135   if (file_mapping == &local_handle)
00136     ::CloseHandle (*file_mapping);
00137 
00138   if (addr_mapping == 0)
00139     ACE_FAIL_RETURN (MAP_FAILED);
00140   else
00141     return addr_mapping;
00142 #elif !defined (ACE_LACKS_MMAP)
00143   ACE_UNUSED_ARG (sa);
00144 
00145 #  if defined (ACE_OS_EXTRA_MMAP_FLAGS)
00146   flags |= ACE_OS_EXTRA_MMAP_FLAGS;
00147 #  endif /* ACE_OS_EXTRA_MMAP_FLAGS */
00148   ACE_UNUSED_ARG (file_mapping);
00149 #  if defined (ACE_OPENVMS)
00150   //FUZZ: disable check_for_lack_ACE_OS
00151   ::fsync(file_handle);
00152   //FUZZ: enable check_for_lack_ACE_OS
00153 #  endif
00154   //FUZZ: disable check_for_lack_ACE_OS
00155   ACE_OSCALL_RETURN ((void *) ::mmap ((ACE_MMAP_TYPE) addr,
00156                                       len,
00157                                       prot,
00158                                       flags,
00159                                       file_handle,
00160                                       off),
00161                      void *, MAP_FAILED);
00162   //FUZZ: enable check_for_lack_ACE_OS
00163 #else
00164   ACE_UNUSED_ARG (addr);
00165   ACE_UNUSED_ARG (len);
00166   ACE_UNUSED_ARG (prot);
00167   ACE_UNUSED_ARG (flags);
00168   ACE_UNUSED_ARG (file_handle);
00169   ACE_UNUSED_ARG (off);
00170   ACE_UNUSED_ARG (file_mapping);
00171   ACE_UNUSED_ARG (sa);
00172   ACE_NOTSUP_RETURN (MAP_FAILED);
00173 #endif /* ACE_WIN32 && !ACE_HAS_PHARLAP */
00174 }
00175 
00176 // Implements simple read/write control for pages.  Affects a page if
00177 // part of the page is referenced.  Currently PROT_READ, PROT_WRITE,
00178 // and PROT_RDWR has been mapped in OS.h.  This needn't have anything
00179 // to do with a mmap region.
00180 
00181 ACE_INLINE int
00182 ACE_OS::mprotect (void *addr, size_t len, int prot)
00183 {
00184   ACE_OS_TRACE ("ACE_OS::mprotect");
00185 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
00186   DWORD dummy; // Sigh!
00187   return ::VirtualProtect(addr, len, prot, &dummy) ? 0 : -1;
00188 #elif !defined (ACE_LACKS_MPROTECT)
00189   ACE_OSCALL_RETURN (::mprotect ((ACE_MMAP_TYPE) addr, len, prot), int, -1);
00190 #else
00191   ACE_UNUSED_ARG (addr);
00192   ACE_UNUSED_ARG (len);
00193   ACE_UNUSED_ARG (prot);
00194   ACE_NOTSUP_RETURN (-1);
00195 #endif /* ACE_WIN32 && !ACE_HAS_PHARLAP */
00196 }
00197 
00198 ACE_INLINE int
00199 ACE_OS::msync (void *addr, size_t len, int sync)
00200 {
00201   ACE_OS_TRACE ("ACE_OS::msync");
00202 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
00203   ACE_UNUSED_ARG (sync);
00204 
00205   ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::FlushViewOfFile (addr, len), ace_result_), int, -1);
00206 #elif !defined (ACE_LACKS_MSYNC)
00207 # if !defined (ACE_HAS_BROKEN_NETBSD_MSYNC)
00208   ACE_OSCALL_RETURN (::msync ((ACE_MMAP_TYPE) addr, len, sync), int, -1);
00209 # else
00210   ACE_OSCALL_RETURN (::msync ((ACE_MMAP_TYPE) addr, len), int, -1);
00211   ACE_UNUSED_ARG (sync);
00212 # endif /* ACE_HAS_BROKEN_NETBSD_MSYNC */
00213 #else
00214   ACE_UNUSED_ARG (addr);
00215   ACE_UNUSED_ARG (len);
00216   ACE_UNUSED_ARG (sync);
00217   ACE_NOTSUP_RETURN (-1);
00218 #endif /* ACE_WIN32 && !ACE_HAS_PHARLAP */
00219 }
00220 
00221 ACE_INLINE int
00222 ACE_OS::munmap (void *addr, size_t len)
00223 {
00224   ACE_OS_TRACE ("ACE_OS::munmap");
00225 #if defined (ACE_WIN32)
00226   ACE_UNUSED_ARG (len);
00227 
00228   ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::UnmapViewOfFile (addr), ace_result_), int, -1);
00229 #elif !defined (ACE_LACKS_MMAP)
00230   ACE_OSCALL_RETURN (::munmap ((ACE_MMAP_TYPE) addr, len), int, -1);
00231 #else
00232   ACE_UNUSED_ARG (addr);
00233   ACE_UNUSED_ARG (len);
00234   ACE_NOTSUP_RETURN (-1);
00235 #endif /* ACE_WIN32 */
00236 }
00237 
00238 ACE_INLINE ACE_HANDLE
00239 ACE_OS::shm_open (const ACE_TCHAR *filename,
00240                   int mode,
00241                   mode_t perms,
00242                   LPSECURITY_ATTRIBUTES sa)
00243 {
00244   ACE_OS_TRACE ("ACE_OS::shm_open");
00245 #if defined (ACE_HAS_SHM_OPEN)
00246   ACE_UNUSED_ARG (sa);
00247 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x650)
00248   // With VxWorks the file should just start with / and no other
00249   // slashes, so replace all other / by _
00250   ACE_TCHAR buf [MAXPATHLEN + 1];
00251   ACE_OS::sprintf (buf,
00252                    ACE_TEXT ("%s"),
00253                    filename);
00254   for (size_t i = 1; i < MAXPATHLEN + 1; i++)
00255     {
00256       if (buf[i] == '/')
00257         {
00258           buf[i] = '_';
00259         }
00260     }
00261   filename = buf;
00262 #endif
00263   ACE_OSCALL_RETURN (::shm_open (ACE_TEXT_ALWAYS_CHAR(filename), mode, perms), ACE_HANDLE, ACE_INVALID_HANDLE);
00264 #elif defined (ACE_OPENVMS)
00265   //FUZZ: disable check_for_lack_ACE_OS
00266   ACE_OSCALL_RETURN (::open (filename, mode, perms, ACE_TEXT("shr=get,put,upd")), ACE_HANDLE, ACE_INVALID_HANDLE);
00267   //FUZZ: enable check_for_lack_ACE_OS
00268 #else  /* ! ACE_HAS_SHM_OPEN */
00269   // Just use ::open.
00270   return ACE_OS::open (filename, mode, perms, sa);
00271 #endif /* ACE_HAS_SHM_OPEN */
00272 }
00273 
00274 ACE_INLINE int
00275 ACE_OS::shm_unlink (const ACE_TCHAR *path)
00276 {
00277   ACE_OS_TRACE ("ACE_OS::shm_unlink");
00278 #if defined (ACE_HAS_SHM_OPEN)
00279 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x650)
00280   // With VxWorks the file should just start with / and no other
00281   // slashes, so replace all other / by _
00282   ACE_TCHAR buf [MAXPATHLEN + 1];
00283   ACE_OS::sprintf (buf,
00284                    ACE_TEXT ("%s"),
00285                    path);
00286   for (size_t i = 1; i < MAXPATHLEN + 1; i++)
00287     {
00288       if (buf[i] == '/')
00289         {
00290           buf[i] = '_';
00291         }
00292     }
00293   path = buf;
00294 #endif
00295   ACE_OSCALL_RETURN (::shm_unlink (ACE_TEXT_ALWAYS_CHAR(path)), int, -1);
00296 #else  /* ! ACE_HAS_SHM_OPEN */
00297   // Just use ::unlink.
00298   return ACE_OS::unlink (path);
00299 #endif /* ACE_HAS_SHM_OPEN */
00300 }
00301 
00302 ACE_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:18:41 2010 for ACE by  doxygen 1.4.7