summaryrefslogtreecommitdiff
path: root/ace/ACE.cpp
diff options
context:
space:
mode:
authorirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-05-11 07:31:37 +0000
committerirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-05-11 07:31:37 +0000
commit7b032c19362e1811c854839238a91611c272a3e0 (patch)
tree70efa5e952ac18c73e7c471641b422f7a1b650d3 /ace/ACE.cpp
parent52215332e899bce8c16ed5bd60f899c11964879a (diff)
downloadATCD-7b032c19362e1811c854839238a91611c272a3e0.tar.gz
ChangeLogTag: Thu May 11 02:04:58 2000 Irfan Pyarali <irfan@cs.wustl.edu>
Diffstat (limited to 'ace/ACE.cpp')
-rw-r--r--ace/ACE.cpp675
1 files changed, 307 insertions, 368 deletions
diff --git a/ace/ACE.cpp b/ace/ACE.cpp
index 7bf68fc4332..9a5e7e41c8f 100644
--- a/ace/ACE.cpp
+++ b/ace/ACE.cpp
@@ -783,7 +783,7 @@ ACE::ldfind (const ACE_TCHAR filename[],
ACE_TCHAR *ld_path_temp = 0;
if (ld_path != 0)
{
- ld_path_temp = (ACE_TCHAR *) ACE_OS::malloc ((ACE_OS::strlen (ld_path) + 2)
+ ld_path_temp = (ACE_TCHAR *) ACE_OS::malloc ((ACE_OS::strlen (ld_path) + 2)
* sizeof (ACE_TCHAR));
if (ld_path_temp != 0)
{
@@ -1193,9 +1193,10 @@ ACE::recv_n_i (ACE_HANDLE handle,
void *buf,
size_t len,
int flags,
- int error_on_eof)
+ size_t *bt)
{
- size_t bytes_transferred;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n;
for (bytes_transferred = 0;
@@ -1206,11 +1207,22 @@ ACE::recv_n_i (ACE_HANDLE handle,
(char *) buf + bytes_transferred,
len - bytes_transferred,
flags);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_read_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
continue;
}
@@ -1220,13 +1232,6 @@ ACE::recv_n_i (ACE_HANDLE handle,
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
}
return bytes_transferred;
@@ -1238,30 +1243,28 @@ ACE::recv_n_i (ACE_HANDLE handle,
size_t len,
int flags,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ ssize_t n;
+ ssize_t result = 0;
+ int error = 0;
+
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- size_t bytes_transferred;
- ssize_t n;
- ssize_t error = 0;
-
for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
- int result = ACE::handle_read_ready (handle,
- timeout);
+ int rtn = ACE::handle_read_ready (handle,
+ timeout);
- if (result == -1)
+ if (rtn == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -1272,15 +1275,10 @@ ACE::recv_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data is available to read).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
}
@@ -1288,7 +1286,7 @@ ACE::recv_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -1300,9 +1298,10 @@ ACE::t_rcv_n_i (ACE_HANDLE handle,
void *buf,
size_t len,
int *flags,
- int error_on_eof)
+ size_t *bt)
{
- size_t bytes_transferred;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n;
for (bytes_transferred = 0;
@@ -1313,11 +1312,22 @@ ACE::t_rcv_n_i (ACE_HANDLE handle,
(char *) buf + bytes_transferred,
len - bytes_transferred,
flags);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_read_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
continue;
}
@@ -1327,13 +1337,6 @@ ACE::t_rcv_n_i (ACE_HANDLE handle,
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
}
return bytes_transferred;
@@ -1345,30 +1348,28 @@ ACE::t_rcv_n_i (ACE_HANDLE handle,
size_t len,
int *flags,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ ssize_t n;
+ ssize_t result = 0;
+ int error = 0;
+
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- size_t bytes_transferred;
- ssize_t n;
- ssize_t error = 0;
-
for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
- int result = ACE::handle_read_ready (handle,
- timeout);
+ int rtn = ACE::handle_read_ready (handle,
+ timeout);
- if (result == -1)
+ if (rtn == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -1379,15 +1380,10 @@ ACE::t_rcv_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data is available to read).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
}
@@ -1395,7 +1391,7 @@ ACE::t_rcv_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -1406,9 +1402,10 @@ ssize_t
ACE::recv_n_i (ACE_HANDLE handle,
void *buf,
size_t len,
- int error_on_eof)
+ size_t *bt)
{
- size_t bytes_transferred;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n;
for (bytes_transferred = 0;
@@ -1418,11 +1415,22 @@ ACE::recv_n_i (ACE_HANDLE handle,
n = ACE::recv_i (handle,
(char *) buf + bytes_transferred,
len - bytes_transferred);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_read_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
continue;
}
@@ -1432,13 +1440,6 @@ ACE::recv_n_i (ACE_HANDLE handle,
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
}
return bytes_transferred;
@@ -1449,30 +1450,28 @@ ACE::recv_n_i (ACE_HANDLE handle,
void *buf,
size_t len,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ ssize_t n;
+ ssize_t result = 0;
+ int error = 0;
+
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- size_t bytes_transferred;
- ssize_t n;
- ssize_t error = 0;
-
for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
- int result = ACE::handle_read_ready (handle,
+ int rtn = ACE::handle_read_ready (handle,
timeout);
- if (result == -1)
+ if (rtn == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -1482,15 +1481,10 @@ ACE::recv_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data is available to read).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
}
@@ -1498,7 +1492,7 @@ ACE::recv_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -1572,9 +1566,11 @@ ssize_t
ACE::recvv_n_i (ACE_HANDLE handle,
iovec *iov,
int iovcnt,
- int error_on_eof)
+ size_t *bt)
{
- ssize_t bytes_transferred = 0;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
for (int s = 0;
s < iovcnt;
@@ -1583,11 +1579,22 @@ ACE::recvv_n_i (ACE_HANDLE handle,
ssize_t n = ACE_OS::recvv (handle,
iov + s,
iovcnt - s);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_read_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
continue;
}
@@ -1597,13 +1604,6 @@ ACE::recvv_n_i (ACE_HANDLE handle,
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
for (bytes_transferred += n;
s < iovcnt
@@ -1629,29 +1629,28 @@ ACE::recvv_n_i (ACE_HANDLE handle,
iovec *iov,
int iovcnt,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
+ ssize_t result = 0;
+ int error = 0;
+
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- ssize_t bytes_transferred = 0;
- ssize_t error = 0;
-
for (int s = 0;
s < iovcnt;
)
{
- int result = ACE::handle_read_ready (handle,
- timeout);
+ int rtn = ACE::handle_read_ready (handle,
+ timeout);
- if (result == -1)
+ if (rtn == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -1661,15 +1660,10 @@ ACE::recvv_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data is available to read).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
@@ -1692,7 +1686,7 @@ ACE::recvv_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -1701,13 +1695,14 @@ ssize_t
ACE::recv_n (ACE_HANDLE handle,
ACE_Message_Block *message_block,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
+
iovec iov[IOV_MAX];
int iovcnt = 0;
- ssize_t n = 0;
- ssize_t nbytes = 0;
- ssize_t recv_size = 0;
while (message_block != 0)
{
@@ -1729,42 +1724,29 @@ ACE::recv_n (ACE_HANDLE handle,
// Increment iovec counter.
iovcnt++;
- // Keep track of the number of bytes for this recv.
- recv_size += current_message_block_length;
-
// The buffer is full make a OS call. @@ TODO find a way to
// find IOV_MAX for platforms that do not define it rather
// than simply setting IOV_MAX to some arbitrary value such
// as 16.
if (iovcnt == IOV_MAX)
{
- n = ACE::recvv_n (handle,
- iov,
- iovcnt,
- timeout,
- error_on_eof);
-
- // Errors. Make sure that we don't treat a timeout
- // as an error.
- if (n == -1 ||
- (n == 0 &&
- errno != ETIME))
- return n;
-
- // Success. Add to total bytes transferred.
- nbytes += n;
+ size_t current_transfer = 0;
+
+ ssize_t result = ACE::recvv_n (handle,
+ iov,
+ iovcnt,
+ timeout,
+ &current_transfer);
+
+ // Add to total bytes transferred.
+ bytes_transferred += current_transfer;
+
+ // Errors.
+ if (result == -1 || result == 0)
+ return result;
// Reset iovec counter.
iovcnt = 0;
-
- // If we sent everything we had accumulated in the
- // last call, then keep going. If it was a partial
- // recv, we won't continue.
- if (recv_size == n)
- recv_size = 0;
- else
- // Return total bytes transferred.
- return nbytes;
}
}
@@ -1780,25 +1762,24 @@ ACE::recv_n (ACE_HANDLE handle,
// IOV_MAX is not a multiple of the number of message blocks.
if (iovcnt != 0)
{
- n = ACE::recvv_n (handle,
- iov,
- iovcnt,
- timeout,
- error_on_eof);
-
- // Errors. Make sure that we don't treat a timeout
- // as an error.
- if (n == -1 ||
- (n == 0 &&
- errno != ETIME))
- return n;
+ size_t current_transfer = 0;
+
+ ssize_t result = ACE::recvv_n (handle,
+ iov,
+ iovcnt,
+ timeout,
+ &current_transfer);
+
+ // Add to total bytes transferred.
+ bytes_transferred += current_transfer;
- // Success. Add to total bytes transferred.
- nbytes += n;
+ // Errors.
+ if (result == -1 || result == 0)
+ return result;
}
// Return total bytes transferred.
- return nbytes;
+ return bytes_transferred;
}
ssize_t
@@ -1953,9 +1934,10 @@ ACE::send_n_i (ACE_HANDLE handle,
const void *buf,
size_t len,
int flags,
- int error_on_eof)
+ size_t *bt)
{
- size_t bytes_transferred;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n;
for (bytes_transferred = 0;
@@ -1966,30 +1948,31 @@ ACE::send_n_i (ACE_HANDLE handle,
(char *) buf + bytes_transferred,
len - bytes_transferred,
flags);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
- //
- // No timeouts in this version; just wait for sendable socket.
- //
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_write_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
- ACE::handle_write_ready (handle, 0);
- errno = 0;
continue;
}
+ // No timeouts in this version.
+
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
}
return bytes_transferred;
@@ -2001,30 +1984,28 @@ ACE::send_n_i (ACE_HANDLE handle,
size_t len,
int flags,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ ssize_t n;
+ ssize_t result = 0;
+ int error = 0;
+
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- size_t bytes_transferred;
- ssize_t n;
- ssize_t error = 0;
-
for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
- int result = ACE::handle_write_ready (handle,
- timeout);
+ int rtn = ACE::handle_write_ready (handle,
+ timeout);
- if (result == -1)
+ if (rtn == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -2035,15 +2016,10 @@ ACE::send_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data can be written).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
}
@@ -2051,7 +2027,7 @@ ACE::send_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -2063,9 +2039,10 @@ ACE::t_snd_n_i (ACE_HANDLE handle,
const void *buf,
size_t len,
int flags,
- int error_on_eof)
+ size_t *bt)
{
- size_t bytes_transferred;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n;
for (bytes_transferred = 0;
@@ -2076,11 +2053,22 @@ ACE::t_snd_n_i (ACE_HANDLE handle,
(char *) buf + bytes_transferred,
len - bytes_transferred,
flags);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_write_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
continue;
}
@@ -2090,13 +2078,6 @@ ACE::t_snd_n_i (ACE_HANDLE handle,
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
}
return bytes_transferred;
@@ -2108,30 +2089,28 @@ ACE::t_snd_n_i (ACE_HANDLE handle,
size_t len,
int flags,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ ssize_t n;
+ ssize_t result = 0;
+ int error = 0;
+
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- size_t bytes_transferred;
- ssize_t n;
- ssize_t error = 0;
-
for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
- int result = ACE::handle_write_ready (handle,
+ int rtn = ACE::handle_write_ready (handle,
timeout);
- if (result == -1)
+ if (rtn == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -2142,15 +2121,10 @@ ACE::t_snd_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data can be written).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
}
@@ -2158,7 +2132,7 @@ ACE::t_snd_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -2169,9 +2143,10 @@ ssize_t
ACE::send_n_i (ACE_HANDLE handle,
const void *buf,
size_t len,
- int error_on_eof)
+ size_t *bt)
{
- size_t bytes_transferred;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n;
for (bytes_transferred = 0;
@@ -2181,17 +2156,23 @@ ACE::send_n_i (ACE_HANDLE handle,
n = ACE::send_i (handle,
(char *) buf + bytes_transferred,
len - bytes_transferred);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
- //
- // No timeouts in this version; just wait for sendable socket.
- //
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_write_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
- ACE::handle_write_ready (handle, 0);
- errno = 0;
continue;
}
@@ -2200,13 +2181,6 @@ ACE::send_n_i (ACE_HANDLE handle,
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
}
return bytes_transferred;
@@ -2217,30 +2191,28 @@ ACE::send_n_i (ACE_HANDLE handle,
const void *buf,
size_t len,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ ssize_t n;
+ ssize_t result = 0;
+ int error = 0;
+
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- size_t bytes_transferred;
- ssize_t n;
- ssize_t error = 0;
-
for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
- int result = ACE::handle_write_ready (handle,
- timeout);
+ int rtn = ACE::handle_write_ready (handle,
+ timeout);
if (result == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -2250,15 +2222,10 @@ ACE::send_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data can be written).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
}
@@ -2266,7 +2233,7 @@ ACE::send_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -2339,11 +2306,13 @@ ssize_t
ACE::sendv_n_i (ACE_HANDLE handle,
const iovec *i,
int iovcnt,
- int error_on_eof)
+ size_t *bt)
{
- iovec *iov = ACE_const_cast (iovec *, i);
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
- ssize_t bytes_transferred = 0;
+ iovec *iov = ACE_const_cast (iovec *, i);
for (int s = 0;
s < iovcnt;
@@ -2352,11 +2321,22 @@ ACE::sendv_n_i (ACE_HANDLE handle,
ssize_t n = ACE_OS::sendv (handle,
iov + s,
iovcnt - s);
+ // Check EOF.
+ if (n == 0)
+ return 0;
+
+ // Check for other errors.
if (n == -1)
{
// If blocked, try again.
if (errno == EWOULDBLOCK)
{
+ // Make sure we can make progress before continuing,
+ // otherwise we'll just keep spinning.
+ int result = ACE::handle_write_ready (handle, 0);
+ if (result == -1)
+ return -1;
+
n = 0;
continue;
}
@@ -2366,13 +2346,6 @@ ACE::sendv_n_i (ACE_HANDLE handle,
// Other errors.
return -1;
}
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
for (bytes_transferred += n;
s < iovcnt
@@ -2398,31 +2371,30 @@ ACE::sendv_n_i (ACE_HANDLE handle,
const iovec *i,
int iovcnt,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
- iovec *iov = ACE_const_cast (iovec *, i);
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
+ ssize_t result = 0;
+ int error = 0;
int val = 0;
ACE::record_and_set_non_blocking_mode (handle, val);
- ssize_t bytes_transferred = 0;
- ssize_t error = 0;
+ iovec *iov = ACE_const_cast (iovec *, i);
for (int s = 0;
s < iovcnt;
)
{
- int result = ACE::handle_write_ready (handle,
- timeout);
+ int rtn = ACE::handle_write_ready (handle,
+ timeout);
- if (result == -1)
+ if (rtn == -1)
{
- // Timed out; return bytes transferred.
- if (errno == ETIME)
- break;
-
- // Other errors.
error = 1;
+ result = -1;
break;
}
@@ -2432,15 +2404,10 @@ ACE::sendv_n_i (ACE_HANDLE handle,
// Errors (note that errno cannot be EWOULDBLOCK since select()
// just told us that data can be written).
- if (n == -1)
+ if (n == -1 || n == 0)
{
error = 1;
- break;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- error = 1;
+ result = n;
break;
}
@@ -2463,7 +2430,7 @@ ACE::sendv_n_i (ACE_HANDLE handle,
ACE::restore_non_blocking_mode (handle, val);
if (error)
- return -1;
+ return result;
else
return bytes_transferred;
}
@@ -2472,13 +2439,14 @@ ssize_t
ACE::send_n (ACE_HANDLE handle,
const ACE_Message_Block *message_block,
const ACE_Time_Value *timeout,
- int error_on_eof)
+ size_t *bt)
{
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
+
iovec iov[IOV_MAX];
int iovcnt = 0;
- ssize_t n = 0;
- ssize_t nbytes = 0;
- ssize_t send_size = 0;
while (message_block != 0)
{
@@ -2500,42 +2468,29 @@ ACE::send_n (ACE_HANDLE handle,
// Increment iovec counter.
iovcnt++;
- // Keep track of the number of bytes for this send.
- send_size += current_message_block_length;
-
// The buffer is full make a OS call. @@ TODO find a way to
// find IOV_MAX for platforms that do not define it rather
// than simply setting IOV_MAX to some arbitrary value such
// as 16.
if (iovcnt == IOV_MAX)
{
- n = ACE::sendv_n (handle,
- iov,
- iovcnt,
- timeout,
- error_on_eof);
-
- // Errors. Make sure that we don't treat a timeout
- // as an error.
- if (n == -1 ||
- (n == 0 &&
- errno != ETIME))
- return n;
-
- // Success. Add to total bytes transferred.
- nbytes += n;
+ size_t current_transfer = 0;
+
+ ssize_t result = ACE::sendv_n (handle,
+ iov,
+ iovcnt,
+ timeout,
+ &current_transfer);
+
+ // Add to total bytes transferred.
+ bytes_transferred += current_transfer;
+
+ // Errors.
+ if (result == -1 || result == 0)
+ return result;
// Reset iovec counter.
iovcnt = 0;
-
- // If we sent everything we had accumulated in the last
- // call, then keep going. If it was a partial send, we
- // won't continue.
- if (send_size == n)
- send_size = 0;
- else
- // Return total bytes transferred.
- return nbytes;
}
}
@@ -2551,34 +2506,35 @@ ACE::send_n (ACE_HANDLE handle,
// IOV_MAX is not a multiple of the number of message blocks.
if (iovcnt != 0)
{
- n = ACE::sendv_n (handle,
- iov,
- iovcnt,
- timeout,
- error_on_eof);
-
- // Errors. Make sure that we don't treat a timeout
- // as an error.
- if (n == -1 ||
- (n == 0 &&
- errno != ETIME))
- return n;
+ size_t current_transfer = 0;
+
+ ssize_t result = ACE::sendv_n (handle,
+ iov,
+ iovcnt,
+ timeout,
+ &current_transfer);
- // Success. Add to total bytes transferred.
- nbytes += n;
+ // Add to total bytes transferred.
+ bytes_transferred += current_transfer;
+
+ // Errors.
+ if (result == -1 || result == 0)
+ return result;
}
// Return total bytes transferred.
- return nbytes;
+ return bytes_transferred;
}
ssize_t
ACE::readv_n (ACE_HANDLE handle,
iovec *iov,
int iovcnt,
- int error_on_eof)
+ size_t *bt)
{
- ssize_t bytes_transferred = 0;
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
for (int s = 0;
s < iovcnt;
@@ -2587,18 +2543,9 @@ ACE::readv_n (ACE_HANDLE handle,
ssize_t n = ACE_OS::readv (handle,
iov + s,
iovcnt - s);
- if (n == -1)
- {
- // Errors.
- return -1;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
+
+ if (n == -1 || n == 0)
+ return n;
for (bytes_transferred += n;
s < iovcnt
@@ -2623,11 +2570,13 @@ ssize_t
ACE::writev_n (ACE_HANDLE handle,
const iovec *i,
int iovcnt,
- int error_on_eof)
+ size_t *bt)
{
- iovec *iov = ACE_const_cast (iovec *, i);
+ size_t temp;
+ size_t &bytes_transferred = bt == 0 ? temp : *bt;
+ bytes_transferred = 0;
- ssize_t bytes_transferred = 0;
+ iovec *iov = ACE_const_cast (iovec *, i);
for (int s = 0;
s < iovcnt;
@@ -2636,18 +2585,8 @@ ACE::writev_n (ACE_HANDLE handle,
ssize_t n = ACE_OS::writev (handle,
iov + s,
iovcnt - s);
- if (n == -1)
- {
- // Errors.
- return -1;
- }
- else if (n == 0)
- {
- if (error_on_eof)
- return -1;
- else
- break;
- }
+ if (n == -1 || n == 0)
+ return n;
for (bytes_transferred += n;
s < iovcnt