00001
00002
00003
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
00015 typedef void *ACE_MMAP_TYPE;
00016 #else
00017 typedef char *ACE_MMAP_TYPE;
00018 #endif
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
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
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))
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)
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
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
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
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
00133
00134
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
00148 ACE_UNUSED_ARG (file_mapping);
00149 # if defined (ACE_OPENVMS)
00150
00151 ::fsync(file_handle);
00152
00153 # endif
00154
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
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
00174 }
00175
00176
00177
00178
00179
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;
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
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
00213 #else
00214 ACE_UNUSED_ARG (addr);
00215 ACE_UNUSED_ARG (len);
00216 ACE_UNUSED_ARG (sync);
00217 ACE_NOTSUP_RETURN (-1);
00218 #endif
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
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
00249
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
00266 ACE_OSCALL_RETURN (::open (filename, mode, perms, ACE_TEXT("shr=get,put,upd")), ACE_HANDLE, ACE_INVALID_HANDLE);
00267
00268 #else
00269
00270 return ACE_OS::open (filename, mode, perms, sa);
00271 #endif
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
00281
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
00297
00298 return ACE_OS::unlink (path);
00299 #endif
00300 }
00301
00302 ACE_END_VERSIONED_NAMESPACE_DECL