summaryrefslogtreecommitdiff
path: root/libstdc++-v3/config/io
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-12 18:24:07 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-12 18:24:07 +0000
commit6e49c2bf73a5b26c3c34711081f1e018dd563fec (patch)
treef18437faf7a97a867caae0fc3a5d38421cf6c9a1 /libstdc++-v3/config/io
parentd91f330fe4872a337710bd6901a504d3952380dc (diff)
downloadgcc-6e49c2bf73a5b26c3c34711081f1e018dd563fec.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77717 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/config/io')
-rw-r--r--libstdc++-v3/config/io/basic_file_stdio.cc88
-rw-r--r--libstdc++-v3/config/io/basic_file_stdio.h3
2 files changed, 58 insertions, 33 deletions
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc
index 1419fdedf4b..f83b7a25f88 100644
--- a/libstdc++-v3/config/io/basic_file_stdio.cc
+++ b/libstdc++-v3/config/io/basic_file_stdio.cc
@@ -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;
}
diff --git a/libstdc++-v3/config/io/basic_file_stdio.h b/libstdc++-v3/config/io/basic_file_stdio.h
index 9c0ccfd1bad..57ff4326e6b 100644
--- a/libstdc++-v3/config/io/basic_file_stdio.h
+++ b/libstdc++-v3/config/io/basic_file_stdio.h
@@ -84,9 +84,6 @@ namespace std
~__basic_file();
streamsize
- xwrite(const char* __s, streamsize __n);
-
- streamsize
xsputn(const char* __s, streamsize __n);
streamsize