Commit 94b8de97 by Paolo Carlini Committed by Paolo Carlini

basic_file_stdio.cc (__gnu_internal::xwritev): Rewrite, avoiding recursion.

2004-02-18  Paolo Carlini  <pcarlini@suse.de>

	* config/io/basic_file_stdio.cc (__gnu_internal::xwritev):
	Rewrite, avoiding recursion.
	(__gnu_internal::xwrite): Minor tweaks.

From-SVN: r78015
parent 9c56033f
2004-02-18 Paolo Carlini <pcarlini@suse.de>
* config/io/basic_file_stdio.cc (__gnu_internal::xwritev):
Rewrite, avoiding recursion.
(__gnu_internal::xwrite): Minor tweaks.
2004-02-17 Stefan Olsson <stefan@xapa.se> 2004-02-17 Stefan Olsson <stefan@xapa.se>
* include/ext/mt_allocator.h: Removed the last * include/ext/mt_allocator.h: Removed the last
......
...@@ -111,16 +111,22 @@ namespace __gnu_internal ...@@ -111,16 +111,22 @@ namespace __gnu_internal
xwrite(int __fd, const char* __s, std::streamsize __n) xwrite(int __fd, const char* __s, std::streamsize __n)
{ {
std::streamsize __nleft = __n; std::streamsize __nleft = __n;
while (__nleft > 0)
for (;;)
{ {
const std::streamsize __ret = write(__fd, __s, __nleft); const std::streamsize __ret = write(__fd, __s, __nleft);
if (__ret == -1L && errno == EINTR) if (__ret == -1L && errno == EINTR)
continue; continue;
else if (__ret == -1L) if (__ret == -1L)
break; break;
__nleft -= __ret; __nleft -= __ret;
if (__nleft == 0)
break;
__s += __ret; __s += __ret;
} }
return __n - __nleft; return __n - __nleft;
} }
...@@ -130,33 +136,40 @@ namespace __gnu_internal ...@@ -130,33 +136,40 @@ namespace __gnu_internal
xwritev(int __fd, const char* __s1, std::streamsize __n1, xwritev(int __fd, const char* __s1, std::streamsize __n1,
const char* __s2, std::streamsize __n2) const char* __s2, std::streamsize __n2)
{ {
std::streamsize __ret; std::streamsize __nleft = __n1 + __n2;
std::streamsize __n1_left = __n1;
struct iovec __iov[2]; struct iovec __iov[2];
__iov[0].iov_base = const_cast<char*>(__s1);
__iov[0].iov_len = __n1;
__iov[1].iov_base = const_cast<char*>(__s2); __iov[1].iov_base = const_cast<char*>(__s2);
__iov[1].iov_len = __n2; __iov[1].iov_len = __n2;
do for (;;)
__ret = writev(__fd, __iov, 2);
while (__ret == -1L && errno == EINTR);
if (__ret == -1L)
__ret = 0;
else if (__ret < __n1 + __n2)
{ {
if (__ret >= __n1) __iov[0].iov_base = const_cast<char*>(__s1);
__iov[0].iov_len = __n1_left;
const std::streamsize __ret = writev(__fd, __iov, 2);
if (__ret == -1L && errno == EINTR)
continue;
if (__ret == -1L)
break;
__nleft -= __ret;
if (__nleft == 0)
break;
const std::streamsize __off = __ret - __n1_left;
if (__off >= 0)
{ {
const std::streamsize __off = __ret - __n1; __nleft -= xwrite(__fd, __s2 + __off, __n2 - __off);
__ret += xwrite(__fd, __s2 + __off, __n2 - __off); break;
} }
else
__ret += xwritev(__fd, __s1 + __ret, __n1 - __ret, __s1 += __ret;
__s2, __n2); __n1_left -= __ret;
} }
return __ret; return __n1 + __n2 - __nleft;
} }
#endif #endif
} // namespace __gnu_internal } // namespace __gnu_internal
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment