summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-04-07 04:53:17 +0000
committerirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-04-07 04:53:17 +0000
commit5071f15aee7e29a890322e03e0f388a37d0473bf (patch)
treeaf039c2aac061db7e18c3acbcfa95b1e87d3471c
parent0db9f1d0ffb0622ec3c84d1c8d086c659a2f5cd5 (diff)
downloadATCD-5071f15aee7e29a890322e03e0f388a37d0473bf.tar.gz
*** empty log message ***
-rw-r--r--ace/Mem_Map.cpp5
-rw-r--r--ace/OS.h2
-rw-r--r--ace/OS.i68
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;
}
diff --git a/ace/OS.h b/ace/OS.h
index 8cae357067b..74f111c791e 100644
--- a/ace/OS.h
+++ b/ace/OS.h
@@ -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.
diff --git a/ace/OS.i b/ace/OS.i
index 7a2e4fc6ef3..893d91127aa 100644
--- a/ace/OS.i
+++ b/ace/OS.i
@@ -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,