summaryrefslogtreecommitdiff
path: root/ace/ACE.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ace/ACE.cpp')
-rw-r--r--ace/ACE.cpp173
1 files changed, 120 insertions, 53 deletions
diff --git a/ace/ACE.cpp b/ace/ACE.cpp
index f3f88f79ef2..5445829bc32 100644
--- a/ace/ACE.cpp
+++ b/ace/ACE.cpp
@@ -226,27 +226,76 @@ ACE::send_n (ACE_HANDLE handle, const void *buf, size_t len)
{
ACE_TRACE ("ACE::send_n");
size_t bytes_written;
- int n;
+ ssize_t n;
for (bytes_written = 0; bytes_written < len; bytes_written += n)
- if ((n = ACE::send (handle, (const char *) buf + bytes_written,
- len - bytes_written)) == -1)
- return -1;
+ {
+ n = ACE::send (handle, (const char *) buf + bytes_written,
+ len - bytes_written);
+ if (n == -1)
+ {
+ if (errno != EWOULDBLOCK)
+ return -1;
+ else
+ n = 0; // Keep trying to send.
+ }
+ }
return bytes_written;
}
ssize_t
-ACE::send_n (ACE_HANDLE handle, const void *buf, size_t len, int flags)
+ACE::send_n (ACE_HANDLE handle,
+ const void *buf,
+ size_t len,
+ int flags)
{
ACE_TRACE ("ACE::send_n");
size_t bytes_written;
- int n;
+ ssize_t n;
for (bytes_written = 0; bytes_written < len; bytes_written += n)
- if ((n = ACE_OS::send (handle, (const char *) buf + bytes_written,
- len - bytes_written, flags)) == -1)
- return -1;
+ {
+ n = ACE_OS::send (handle, (const char *) buf + bytes_written,
+ len - bytes_written, flags);
+
+ if (n == -1)
+ {
+ if (errno != EWOULDBLOCK)
+ return -1;
+ else
+ n = 0; // Keep trying to send.
+ }
+ }
+
+ return bytes_written;
+}
+
+// Receive <len> bytes into <buf> from <handle> (uses the <write>
+// system call on UNIX and the <WriteFile> call on Win32).
+
+ssize_t
+ACE::write_n (ACE_HANDLE handle,
+ const void *buf,
+ size_t len)
+{
+ ACE_TRACE ("ACE::write_n");
+
+ size_t bytes_written;
+ ssize_t n;
+
+ for (bytes_written = 0; bytes_written < len; bytes_written += n)
+ {
+ n = ACE_OS::write (handle, (const char *) buf + bytes_written,
+ len - bytes_written);
+ if (n == -1)
+ {
+ if (errno != EWOULDBLOCK)
+ return -1;
+ else
+ n = 0; // Keep trying to send.
+ }
+ }
return bytes_written;
}
@@ -256,15 +305,22 @@ ACE::recv_n (ACE_HANDLE handle, void *buf, size_t len)
{
ACE_TRACE ("ACE::recv_n");
size_t bytes_read;
- int n;
+ ssize_t n;
for (bytes_read = 0; bytes_read < len; bytes_read += n)
- if ((n = ACE::recv (handle, (char *) buf + bytes_read,
- len - bytes_read)) == -1)
- return -1;
- else if (n == 0)
- break;
+ {
+ n = ACE::recv (handle, (char *) buf + bytes_read, len - bytes_read);
+ if (n == -1)
+ {
+ if (errno != EWOULDBLOCK)
+ return -1;
+ else
+ n = 0; // Keep trying to read.
+ }
+ else if (n == 0)
+ break;
+ }
return bytes_read;
}
@@ -273,20 +329,29 @@ ACE::recv_n (ACE_HANDLE handle, void *buf, size_t len, int flags)
{
ACE_TRACE ("ACE::recv_n");
size_t bytes_read;
- int n;
+ ssize_t n;
for (bytes_read = 0; bytes_read < len; bytes_read += n)
- if ((n = ACE_OS::recv (handle, (char *) buf + bytes_read,
- len - bytes_read, flags)) == -1)
- return -1;
- else if (n == 0)
- break;
+ {
+ n = ACE::recv (handle, (char *) buf + bytes_read, len - bytes_read, flags);
+
+ if (n == -1)
+ {
+ if (errno != EWOULDBLOCK)
+ return -1;
+ else
+ n = 0; // Keep trying to read.
+ }
+ else if (n == 0)
+ break;
+ }
return bytes_read;
}
- // Receive <len> bytes into <buf> from <handle> (uses the <read>
- // system call on UNIX and the <ReadFile> call on Win32).
+// Receive <len> bytes into <buf> from <handle> (uses the <read>
+// system call on UNIX and the <ReadFile> call on Win32).
+
ssize_t
ACE::read_n (ACE_HANDLE handle,
void *buf,
@@ -295,37 +360,24 @@ ACE::read_n (ACE_HANDLE handle,
ACE_TRACE ("ACE::read_n");
size_t bytes_read;
- int n;
+ ssize_t n;
for (bytes_read = 0; bytes_read < len; bytes_read += n)
- if ((n = ACE_OS::read (handle, (char *) buf + bytes_read,
- len - bytes_read)) == -1)
- return -1;
- else if (n == 0)
- break;
-
- return bytes_read;
-}
-
-// Receive <len> bytes into <buf> from <handle> (uses the <write>
-// system call on UNIX and the <WriteFile> call on Win32).
-
-ssize_t
-ACE::write_n (ACE_HANDLE handle,
- const void *buf,
- size_t len)
-{
- ACE_TRACE ("ACE::write_n");
-
- size_t bytes_written;
- int n;
+ {
+ n = ACE_OS::read (handle, (char *) buf + bytes_read, len - bytes_read);
- for (bytes_written = 0; bytes_written < len; bytes_written += n)
- if ((n = ACE_OS::write (handle, (const char *) buf + bytes_written,
- len - bytes_written)) == -1)
- return -1;
+ if (n == -1)
+ {
+ if (errno != EWOULDBLOCK)
+ return -1;
+ else
+ n = 0; // Keep trying to read.
+ }
+ else if (n == 0)
+ break;
+ }
- return bytes_written;
+ return bytes_read;
}
// Format buffer into printable format. This is useful for debugging.
@@ -460,13 +512,26 @@ ACE::handle_timed_complete (ACE_HANDLE h,
ACE_Handle_Set rd_handles;
ACE_Handle_Set wr_handles;
+#if defined (ACE_WIN32)
+ ACE_Handle_Set ex_handles;
+ ex_handles.set_bit (h);
+#endif /* ACE_WIN32 */
rd_handles.set_bit (h);
wr_handles.set_bit (h);
+#if defined (ACE_WIN32)
+ int n = ACE_OS::select (int (h) + 1,
+ rd_handles,
+ wr_handles,
+ ex_handles,
+ timeout);
+#else
int n = ACE_OS::select (int (h) + 1,
rd_handles,
wr_handles,
0, timeout);
+#endif /* ACE_WIN32 */
+
// If we failed to connect within the time period allocated by the
// caller, then we fail (e.g., the remote host might have been too
// busy to accept our call).
@@ -479,11 +544,13 @@ ACE::handle_timed_complete (ACE_HANDLE h,
// Check if the handle is ready for reading and the handle is *not*
// ready for writing, which may indicate a problem. But we need to
// make sure...
-#if defined (ACE_HAS_TLI)
+#if defined (ACE_WIN32)
+ else if (rd_handles.is_set (h) || ex_handles.is_set (h))
+#elif defined (ACE_HAS_TLI)
else if (rd_handles.is_set (h) && !wr_handles.is_set (h))
#else
else if (rd_handles.is_set (h))
-#endif /* ACE_HAS_TLI */
+#endif /* ACE_WIN32 */
{
char dummy;
// The following recv() won't block provided that the
@@ -597,7 +664,7 @@ ACE::bind_port (ACE_HANDLE handle)
ACE_OS::memset ((void *) &sin, 0, sizeof sin);
sin.sin_family = AF_INET;
#if defined (ACE_HAS_SIN_LEN)
- sin.sin_family = sizeof sin;
+ sin.sin_len = sizeof sin;
#endif /* ACE_HAS_SIN_LEN */
sin.sin_addr.s_addr = INADDR_ANY;