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
00080
00081 nt_flags = FILE_MAP_ALL_ACCESS;
00082 # else
00083 prot = PAGE_WRITECOPY;
00084 nt_flags = FILE_MAP_COPY;
00085 # endif // ACE_HAS_WINCE
00086 }
00087 else if (ACE_BIT_ENABLED (flags, MAP_SHARED))
00088 {
00089 if (ACE_BIT_ENABLED (prot, PAGE_READONLY))
00090 nt_flags = FILE_MAP_READ;
00091 if (ACE_BIT_ENABLED (prot, PAGE_READWRITE))
00092 nt_flags = FILE_MAP_WRITE;
00093 }
00094
00095
00096 if (*file_mapping == ACE_INVALID_HANDLE)
00097 {
00098 SECURITY_ATTRIBUTES sa_buffer;
00099 SECURITY_DESCRIPTOR sd_buffer;
00100 LPSECURITY_ATTRIBUTES const attr =
00101 ACE_OS::default_win32_security_attributes_r (sa,
00102 &sa_buffer,
00103 &sd_buffer);
00104
00105 *file_mapping = ACE_TEXT_CreateFileMapping (file_handle,
00106 attr,
00107 prot,
00108 0,
00109 (file_handle == ACE_INVALID_HANDLE) ? len : 0,
00110 file_mapping_name);
00111 }
00112
00113 if (*file_mapping == 0)
00114 ACE_FAIL_RETURN (MAP_FAILED);
00115
00116 # if defined (ACE_OS_EXTRA_MMAP_FLAGS)
00117 nt_flags |= ACE_OS_EXTRA_MMAP_FLAGS;
00118 # endif
00119
00120 DWORD low_off = ACE_LOW_PART (off);
00121 DWORD high_off = ACE_HIGH_PART (off);
00122
00123 # if defined (ACE_HAS_WINCE)
00124 void *addr_mapping = ::MapViewOfFile (*file_mapping,
00125 nt_flags,
00126 high_off,
00127 low_off,
00128 len);
00129 # else
00130 void *addr_mapping = ::MapViewOfFileEx (*file_mapping,
00131 nt_flags,
00132 high_off,
00133 low_off,
00134 len,
00135 addr);
00136 # endif
00137
00138
00139 if (file_mapping == &local_handle)
00140 ::CloseHandle (*file_mapping);
00141
00142 if (addr_mapping == 0)
00143 ACE_FAIL_RETURN (MAP_FAILED);
00144 else
00145 return addr_mapping;
00146 #elif !defined (ACE_LACKS_MMAP)
00147 ACE_UNUSED_ARG (sa);
00148
00149 # if defined (ACE_OS_EXTRA_MMAP_FLAGS)
00150 flags |= ACE_OS_EXTRA_MMAP_FLAGS;
00151 # endif
00152 ACE_UNUSED_ARG (file_mapping);
00153 # if defined (ACE_OPENVMS)
00154
00155 ::fsync(file_handle);
00156
00157 # endif
00158
00159 ACE_OSCALL_RETURN ((void *) ::mmap ((ACE_MMAP_TYPE) addr,
00160 len,
00161 prot,
00162 flags,
00163 file_handle,
00164 off),
00165 void *, MAP_FAILED);
00166
00167 #else
00168 ACE_UNUSED_ARG (addr);
00169 ACE_UNUSED_ARG (len);
00170 ACE_UNUSED_ARG (prot);
00171 ACE_UNUSED_ARG (flags);
00172 ACE_UNUSED_ARG (file_handle);
00173 ACE_UNUSED_ARG (off);
00174 ACE_UNUSED_ARG (file_mapping);
00175 ACE_UNUSED_ARG (sa);
00176 ACE_NOTSUP_RETURN (MAP_FAILED);
00177 #endif
00178 }
00179
00180
00181
00182
00183
00184
00185 ACE_INLINE int
00186 ACE_OS::mprotect (void *addr, size_t len, int prot)
00187 {
00188 ACE_OS_TRACE ("ACE_OS::mprotect");
00189 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
00190 DWORD dummy;
00191 return ::VirtualProtect(addr, len, prot, &dummy) ? 0 : -1;
00192 #elif !defined (ACE_LACKS_MPROTECT)
00193 ACE_OSCALL_RETURN (::mprotect ((ACE_MMAP_TYPE) addr, len, prot), int, -1);
00194 #else
00195 ACE_UNUSED_ARG (addr);
00196 ACE_UNUSED_ARG (len);
00197 ACE_UNUSED_ARG (prot);
00198 ACE_NOTSUP_RETURN (-1);
00199 #endif
00200 }
00201
00202 ACE_INLINE int
00203 ACE_OS::msync (void *addr, size_t len, int sync)
00204 {
00205 ACE_OS_TRACE ("ACE_OS::msync");
00206 #if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
00207 ACE_UNUSED_ARG (sync);
00208
00209 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::FlushViewOfFile (addr, len), ace_result_), int, -1);
00210 #elif !defined (ACE_LACKS_MSYNC)
00211 ACE_OSCALL_RETURN (::msync ((ACE_MMAP_TYPE) addr, len, sync), int, -1);
00212 #else
00213 ACE_UNUSED_ARG (addr);
00214 ACE_UNUSED_ARG (len);
00215 ACE_UNUSED_ARG (sync);
00216 ACE_NOTSUP_RETURN (-1);
00217 #endif
00218 }
00219
00220 ACE_INLINE int
00221 ACE_OS::munmap (void *addr, size_t len)
00222 {
00223 ACE_OS_TRACE ("ACE_OS::munmap");
00224 #if defined (ACE_WIN32)
00225 ACE_UNUSED_ARG (len);
00226
00227 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::UnmapViewOfFile (addr), ace_result_), int, -1);
00228 #elif !defined (ACE_LACKS_MMAP)
00229 ACE_OSCALL_RETURN (::munmap ((ACE_MMAP_TYPE) addr, len), int, -1);
00230 #else
00231 ACE_UNUSED_ARG (addr);
00232 ACE_UNUSED_ARG (len);
00233 ACE_NOTSUP_RETURN (-1);
00234 #endif
00235 }
00236
00237 ACE_INLINE ACE_HANDLE
00238 ACE_OS::shm_open (const ACE_TCHAR *filename,
00239 int mode,
00240 mode_t perms,
00241 LPSECURITY_ATTRIBUTES sa)
00242 {
00243 ACE_OS_TRACE ("ACE_OS::shm_open");
00244 #if defined (ACE_HAS_SHM_OPEN)
00245 ACE_UNUSED_ARG (sa);
00246 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x670)
00247
00248
00249 ACE_TCHAR buf [MAXPATHLEN + 1];
00250 ACE_OS::sprintf (buf,
00251 ACE_TEXT ("%s"),
00252 filename);
00253 for (size_t i = 1; i < MAXPATHLEN + 1; i++)
00254 {
00255 if (buf[i] == '/')
00256 {
00257 buf[i] = '_';
00258 }
00259 }
00260 filename = buf;
00261 #endif
00262 ACE_OSCALL_RETURN (::shm_open (ACE_TEXT_ALWAYS_CHAR(filename), mode, perms), ACE_HANDLE, ACE_INVALID_HANDLE);
00263 #elif defined (ACE_OPENVMS)
00264
00265 ACE_OSCALL_RETURN (::open (filename, mode, perms, ACE_TEXT("shr=get,put,upd")), ACE_HANDLE, ACE_INVALID_HANDLE);
00266
00267 #else
00268
00269 return ACE_OS::open (filename, mode, perms, sa);
00270 #endif
00271 }
00272
00273 ACE_INLINE int
00274 ACE_OS::shm_unlink (const ACE_TCHAR *path)
00275 {
00276 ACE_OS_TRACE ("ACE_OS::shm_unlink");
00277 #if defined (ACE_HAS_SHM_OPEN)
00278 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x670)
00279
00280
00281 ACE_TCHAR buf [MAXPATHLEN + 1];
00282 ACE_OS::sprintf (buf,
00283 ACE_TEXT ("%s"),
00284 path);
00285 for (size_t i = 1; i < MAXPATHLEN + 1; i++)
00286 {
00287 if (buf[i] == '/')
00288 {
00289 buf[i] = '_';
00290 }
00291 }
00292 path = buf;
00293 #endif
00294 ACE_OSCALL_RETURN (::shm_unlink (ACE_TEXT_ALWAYS_CHAR(path)), int, -1);
00295 #else
00296
00297 return ACE_OS::unlink (path);
00298 #endif
00299 }
00300
00301 ACE_END_VERSIONED_NAMESPACE_DECL