PR libstdc++/13731 (final part: writev)

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

	PR libstdc++/13731 (final part: writev)
	* config/io/basic_file_stdio.cc (__gnu_internal::xwrite):
	New, a wrapper around writev() handling partial writes.
	(__basic_file<char>::xwrite): Move to __gnu_internal and make
	static.
	(__basic_file<char>::xsputn): Update call.
	(__basic_file<char>::xsputn_2): Likewise.
	* config/io/basic_file_stdio.h (__basic_file<char>::write):
	Don't declare, now static.

From-SVN: r77717
This commit is contained in:
Paolo Carlini 2004-02-12 18:24:07 +00:00 committed by Paolo Carlini
parent 9dfc74a3ca
commit 2e9a1f6b05
3 changed files with 70 additions and 33 deletions

View File

@ -1,3 +1,15 @@
2004-02-12 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/13731 (final part: writev)
* config/io/basic_file_stdio.cc (__gnu_internal::xwrite):
New, a wrapper around writev() handling partial writes.
(__basic_file<char>::xwrite): Move to __gnu_internal and make
static.
(__basic_file<char>::xsputn): Update call.
(__basic_file<char>::xsputn_2): Likewise.
* config/io/basic_file_stdio.h (__basic_file<char>::write):
Don't declare, now static.
2004-02-11 Stefan Olsson <stefan@xapa.se>
* docs/html/ext/mt_allocator.html: New.

View File

@ -105,6 +105,60 @@ namespace __gnu_internal
default: return 0; // invalid
}
}
// Wrapper handling partial write.
static std::streamsize
xwrite(int __fd, const char* __s, std::streamsize __n)
{
std::streamsize __nleft = __n;
while (__nleft > 0)
{
const std::streamsize __ret = write(__fd, __s, __nleft);
if (__ret == -1L && errno == EINTR)
continue;
else if (__ret == -1L)
break;
__nleft -= __ret;
__s += __ret;
}
return __n - __nleft;
}
#ifdef _GLIBCXX_HAVE_WRITEV
// Wrapper handling partial writev.
static std::streamsize
xwritev(int __fd, const char* __s1, std::streamsize __n1,
const char* __s2, std::streamsize __n2)
{
std::streamsize __ret;
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_len = __n2;
do
__ret = writev(__fd, __iov, 2);
while (__ret == -1L && errno == EINTR);
if (__ret == -1L)
__ret = 0;
else if (__ret < __n1 + __n2)
{
if (__ret >= __n1)
{
const std::streamsize __off = __ret - __n1;
__ret += xwrite(__fd, __s2 + __off, __n2 - __off);
}
else
__ret += xwritev(__fd, __s1 + __ret, __n1 - __ret,
__s2, __n2);
}
return __ret;
}
#endif
} // namespace __gnu_internal
namespace std
@ -201,27 +255,9 @@ namespace std
return __ret;
}
// Wrapper handling partial write.
streamsize
__basic_file<char>::xwrite(const char* __s, streamsize __n)
{
streamsize __nleft = __n;
while (__nleft > 0)
{
const streamsize __ret = write(this->fd(), __s, __nleft);
if (__ret == -1L && errno == EINTR)
continue;
else if (__ret == -1L)
break;
__nleft -= __ret;
__s += __ret;
}
return __n - __nleft;
}
streamsize
__basic_file<char>::xsputn(const char* __s, streamsize __n)
{ return __basic_file<char>::xwrite(__s, __n); }
{ return __gnu_internal::xwrite(this->fd(), __s, __n); }
streamsize
__basic_file<char>::xsputn_2(const char* __s1, streamsize __n1,
@ -229,21 +265,13 @@ namespace std
{
streamsize __ret = 0;
#ifdef _GLIBCXX_HAVE_WRITEV
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_len = __n2;
do
__ret = writev(this->fd(), __iov, 2);
while (__ret == -1L && errno == EINTR);
__ret = __gnu_internal::xwritev(this->fd(), __s1, __n1, __s2, __n2);
#else
if (__n1)
__ret = __basic_file<char>::xwrite(__s1, __n1);
__ret = __gnu_internal::xwrite(this->fd(), __s1, __n1);
if (__ret == __n1)
__ret += __basic_file<char>::xwrite(__s2, __n2);
__ret += __gnu_internal::xwrite(this->fd(), __s2, __n2);
#endif
return __ret;
}

View File

@ -83,9 +83,6 @@ namespace std
~__basic_file();
streamsize
xwrite(const char* __s, streamsize __n);
streamsize
xsputn(const char* __s, streamsize __n);