diff options
Diffstat (limited to 'ace/ACE.cpp')
-rw-r--r-- | ace/ACE.cpp | 173 |
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; |