diff options
author | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-04-07 04:53:17 +0000 |
---|---|---|
committer | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-04-07 04:53:17 +0000 |
commit | 5071f15aee7e29a890322e03e0f388a37d0473bf (patch) | |
tree | af039c2aac061db7e18c3acbcfa95b1e87d3471c | |
parent | 0db9f1d0ffb0622ec3c84d1c8d086c659a2f5cd5 (diff) | |
download | ATCD-5071f15aee7e29a890322e03e0f388a37d0473bf.tar.gz |
*** empty log message ***
-rw-r--r-- | ace/Mem_Map.cpp | 5 | ||||
-rw-r--r-- | ace/OS.h | 2 | ||||
-rw-r--r-- | ace/OS.i | 68 |
3 files changed, 75 insertions, 0 deletions
diff --git a/ace/Mem_Map.cpp b/ace/Mem_Map.cpp index 257aba5a038..160da55bbcb 100644 --- a/ace/Mem_Map.cpp +++ b/ace/Mem_Map.cpp @@ -94,11 +94,16 @@ ACE_Mem_Map::map_it (ACE_HANDLE handle, this->length_ = len_request; // Extend the backing store. +#if defined (ACE_HAD_P_READ_WRITE) + if (ACE_OS::pwrite (this->handle_, "", 1, + len_request > 0 ? len_request - 1 : 0) == -1) +#else if (ACE_OS::lseek (this->handle_, len_request > 0 ? len_request - 1 : 0, SEEK_SET) == -1 || ACE_OS::write (this->handle_, "", 1) == -1 || ACE_OS::lseek (this->handle_, 0, SEEK_SET) == -1) +#endif /* ACE_HAD_P_READ_WRITE */ return -1; } @@ -2749,11 +2749,13 @@ public: struct strbuf *data, int band, int flags); static ssize_t read (ACE_HANDLE handle, void *buf, size_t len); static ssize_t read (ACE_HANDLE handle, void *buf, size_t len, ACE_OVERLAPPED *); + static ssize_t pread (ACE_HANDLE handle, void *buf, size_t nbyte, off_t offset); static ssize_t readv (ACE_HANDLE handle, struct iovec *iov, int iovlen); static int recvmsg (ACE_HANDLE handle, struct msghdr *msg, int flags); static int sendmsg (ACE_HANDLE handle, ACE_SENDMSG_TYPE *msg, int flags); static ssize_t write (ACE_HANDLE handle, const void *buf, size_t nbyte); static ssize_t write (ACE_HANDLE handle, const void *buf, size_t nbyte, ACE_OVERLAPPED *); + static ssize_t pwrite (ACE_HANDLE handle, const void *buf, size_t nbyte, off_t offset); static int writev (ACE_HANDLE handle, ACE_WRITEV_TYPE *iov, int iovcnt); // = A set of wrappers for event demultiplexing and IPC. @@ -5050,6 +5050,40 @@ ACE_OS::write (ACE_HANDLE handle, const void *buf, size_t nbyte, #endif /* ACE_WIN32 */ } +ssize_t +ACE_OS::pwrite (ACE_HANDLE handle, + const void *buf, + size_t nbyte, + off_t offset) +{ +#if defined (ACE_HAD_P_READ_WRITE) +#if defined (ACE_WIN32) + // This will work irrespective of whether the <handle> is in + // OVERLAPPED mode or not. + OVERLAPPED overlapped; + overlapped.Internal = 0; + overlapped.InternalHigh = 0; + overlapped.Offset = offset; + overlapped.OffsetHigh = 0; + overlapped.hEvent = 0; + + DWORD bytes_written; // This is set to 0 byte WriteFile. + + if (::WriteFile (handle, buf, nbyte, &bytes_written, &overlapped)) + return (ssize_t) bytes_written; + else if (::GetLastError () == ERROR_IO_PENDING) + if (::GetOverlappedResult (handle, &overlapped, &bytes_written, TRUE) == TRUE) + return (ssize_t) bytes_written; + + return -1; +#else + return ::pwrite (handle, buf, nbyte, offset); +#endif /* ACE_WIN32 */ +#else + ACE_NOTSUP_RETURN (-1); +#endif /* ACE_HAD_P_READ_WRITE */ +} + ACE_INLINE ssize_t ACE_OS::read (ACE_HANDLE handle, void *buf, size_t len) { @@ -5080,6 +5114,40 @@ ACE_OS::read (ACE_HANDLE handle, void *buf, size_t len, #endif /* ACE_WIN32 */ } +ssize_t +ACE_OS::pread (ACE_HANDLE handle, + void *buf, + size_t nbyte, + off_t offset) +{ +#if defined (ACE_HAD_P_READ_WRITE) +#if defined (ACE_WIN32) + // This will work irrespective of whether the <handle> is in + // OVERLAPPED mode or not. + OVERLAPPED overlapped; + overlapped.Internal = 0; + overlapped.InternalHigh = 0; + overlapped.Offset = offset; + overlapped.OffsetHigh = 0; + overlapped.hEvent = 0; + + DWORD bytes_written; // This is set to 0 byte WriteFile. + + if (::ReadFile (handle, buf, nbyte, &bytes_written, &overlapped)) + return (ssize_t) bytes_written; + else if (::GetLastError () == ERROR_IO_PENDING) + if (::GetOverlappedResult (handle, &overlapped, &bytes_written, TRUE) == TRUE) + return (ssize_t) bytes_written; + + return -1; +#else + return ::pread (handle, buf, nbyte, offset); +#endif /* ACE_WIN32 */ +#else + ACE_NOTSUP_RETURN (-1); +#endif /* ACE_HAD_P_READ_WRITE */ +} + ACE_INLINE int ACE_OS::getmsg (ACE_HANDLE handle, struct strbuf *ctl, |